Home > OS >  How to share the same object in more than two functions? (Python)
How to share the same object in more than two functions? (Python)

Time:10-24

I am working on a project called "Flash card". Does anyone know how to share the same object between more than two functions? It seems setting the variable as global is not the answer. May I know why it isn't? In my case, I want the same "dict2" to be used in Known(), Switch_Word() and Reset(), as it will be refilled the original data when Reset() is pressed. Then, it will be passed to Switch_Word() and Known() for further processing. I found out that there are different "dict2" when printing their ID.

from tkinter import *
import pandas
import random
import copy

BACKGROUND_COLOR = "#B1DDC6"
dataframe = pandas.read_csv(r"C:\Users\User\Desktop\Python Visual Studio Code\100Days\Day31\flash-card-project-start\data\french_words.csv")
global dict
dict = dataframe.to_dict(orient="records")
print(len(dict))
global dict2 
dict2 = copy.deepcopy(dict)
Current_Vocab = {}

def Switch_to_English():
    canvas.itemconfig("Image",image=bg_image)
    canvas.itemconfig("title",text="English",fill="white")
    Current_Vocab_English = Current_Vocab["English"]
    canvas.itemconfig("word",text=f"{Current_Vocab_English}",fill="white")

def Switch_Word():
    global Current_Vocab
    canvas.itemconfig("Image",image = ft_image)
    Current_Vocab = random.choice(dict2)
    Current_Vocab_French = Current_Vocab["French"]
    canvas.itemconfig("title",text="French",fill = "black")
    canvas.itemconfig("word",text=f"{Current_Vocab_French}", fill = "black")
    window.after(3000,Switch_to_English)

def Known():
    Switch_Word()
    dict2.remove(Current_Vocab)
    print(len(dict2))
    print(id(dict2))

def Reset():
    dict2 = copy.deepcopy(dict)
    print(len(dict2))
    print(id(dict2))
    Switch_Word()

window = Tk()
window.title("Flashy")
window.config(padx=50, pady=50, bg=BACKGROUND_COLOR)

ft_image = PhotoImage(file= r"C:\Users\User\Desktop\Python Visual Studio Code\100Days\Day31\flash-card-project-start\images\card_front.png")
bg_image = PhotoImage(file= r"C:\Users\User\Desktop\Python Visual Studio Code\100Days\Day31\flash-card-project-start\images\card_back.png")
tick_image = PhotoImage(file= r"C:\Users\User\Desktop\Python Visual Studio Code\100Days\Day31\flash-card-project-start\images\right.png")
cross_image = PhotoImage(file= r"C:\Users\User\Desktop\Python Visual Studio Code\100Days\Day31\flash-card-project-start\images\wrong.png")
Rev = []

flip_timer = window.after(3000, func=Switch_Word)
canvas = Canvas(width=800, height = 526, highlightthickness=0)
canvas.create_image(400, 253, image=ft_image, tags = "Image")
canvas.create_text(400, 158, text="Title", font = ("Arial",40,"italic"), tags = "title")
canvas.create_text(400, 263, text="Word", font = ("Arial",60,"italic"), tags = "word")
canvas.config(bg=BACKGROUND_COLOR,highlightthickness=0)
canvas.grid(row=0,column=1)

tick_label = Label(image=tick_image, bg = BACKGROUND_COLOR, highlightthickness= 0)
tick_btn = Button(window, image=tick_image, command=Known)
tick_btn.grid(row=1,column=2)

cross_label = Label(image=cross_image, bg=BACKGROUND_COLOR, highlightthickness=0)
cross_btn = Button(window, image=cross_image, command=Switch_Word)
cross_btn.grid(row=1,column=0)

Reset_Button = Button(text="Reset", command = Reset)
Reset_Button.grid(row=0,column=2)


window.mainloop()

CodePudding user response:

use a lambda function, e.g.: cross_btn = Button(window, image=cross_image, command=lambda:Switch_Word(dict_2))

This just needs to be replicated for all applicable buttons. The lambda allows for you to pass arguments to the command, rather than just the function. You will of course have to modify your functions to accept an argument.

CodePudding user response:

You can use functools.partial

Pass your common dictionary in every function where you need

def your_function(common_dict):
    # Your code here 

And in command use command=partial(your_function, common_dict)

  • Related