首页 > 解决方案 > 为什么同一类的两个实例会获得相同的实例变量更改?

问题描述

我想制作一个 GUI,询问用户他想打开哪两个文件。它显示为一个条目和一个按钮(两次:每个文件一个),两者都在同一框架中,本身在根中。

因为我想要两次相同的东西,所以我定义了一个类,然后实例化了两次,只是网格位置不同。它包含一个由更新条目值的按钮调用的方法。

它可以工作,但是当我使用任何按钮选择一个文件时,它会在两个条目中写入文件路径。我希望它只写在对应于实例的条目中

它看起来像一个类变量问题,但我的属性在实例级别,所以它应该与实例区分开来。

这是我的代码:

from tkinter import Tk, Frame, Label, Button, Entry, filedialog as fd

class Selection:
    def __init__(self, master):
        self.load_button = Button(master, text="...", command=self.loadFile)     
        self.filedir = Entry(master, text = " ")    

    def loadFile(self):
        self.filename = fd.askopenfilename() 
        self.filedir.delete(0,"end")
        self.filedir.insert(0, self.filename)            

if __name__=='__main__': 

    #-------Defining the Root window
    root = Tk()
    root.geometry("1000x600+455+210")

    root.grid_columnconfigure(0, weight=1) 
    root.grid_columnconfigure(1, weight=2)
    root.grid_columnconfigure(2, weight=1)
    root.grid_rowconfigure(0, weight=1) 
    root.grid_rowconfigure(1, weight=1)
    root.grid_rowconfigure(2, weight=1)
    root.grid_rowconfigure(3, weight=1)

    #-------Defining the Frame  

    f2 = Frame(root, bg='#D5F4E4')

    f2.grid_columnconfigure(0, weight=1) 
    f2.grid_columnconfigure(1, weight=2)
    f2.grid_columnconfigure(2, weight=1)             
    f2.grid_rowconfigure(0, weight=1) 
    f2.grid_rowconfigure(1, weight=1)
    f2.grid_rowconfigure(2, weight=1)              
    f2.grid_rowconfigure(3, weight=1) 

    #-------Instantiation here (Defining the Widgets) 
    TexteL = Label(f2, text="Please select file L :")          
    TexteT = Label(f2, text="Please select file T :")

    k = Selection(f2)  
    j = Selection(f2) 

    #-------Grid everything
    f2.grid(row=1,column=1, sticky="nsew")

    TexteL.grid(row=0,column=1)
    TexteT.grid(row=2,column=1)

    k.load_button.grid(row=1, column=2) 
    k.filedir.grid(row=1, column=1, sticky='ew')

    j.load_button.grid(row=3, column=2) 
    j.filedir.grid(row=3, column=1, sticky='ew')

    root.mainloop()

标签: pythonclasstkinter

解决方案


问题是由text = " "初始化Entry. 该text参数不用于设置要在 中显示的初始文本Entry,而是设置textvariable参数。由于它设置为相同" ",它将引用相同的内部variable。只需删除text = " "将解决问题。


推荐阅读