簡體   English   中英

tkinter:如何從不同的 class 訪問 StringVar 和對象?

[英]tkinter: How to access a StringVar and objects from a different class?

我有一個簡單的 tkinter 兩幀應用程序,帶有LabelEntryButton小部件,我想使用FrameOneEntryButton訪問 FrameOne 的StringVar() FrameTwo.

如果已經看過很多代碼示例,但在下面的示例中不明白這是如何完成的。 許多程序員都在使用 controller。 如果我使用 controller,我最終會從一個錯誤到另一個錯誤。 例如:

FirstFrame = FrameOne(mainWindow)`

TypeError: __init__() missing 1 required positional argument: 'controller'

我完全理解,因為在調用 Frame class 時,我沒有將任何內容傳遞給新的“控制器”class 參數。 但我不知道我應該傳遞什么來解決它。 也許這也是由於缺乏使用 class 變量的知識造成的(歡迎任何文獻提示)。

FrameOne繼承到FrameTwo的解決方案也同樣重要。 我遇到了適用於我的代碼的相同數量的錯誤。

另一件事是,許多程序員都有兩個同時不可見的框架的示例,而在我的示例中,我同時有兩個框架在彼此下方。

我遇到的另一個相關問題是,如果 FrameOne 的FrameOne小部件是Text小部件怎么辦? 如何從FrameTwo訪問小部件。

我可以讓它與全局變量一起工作,但我不想使用這樣的寫作,無論如何我都會保留訪問小部件的問題。

請在下面找到我的代碼:

import tkinter as tk

class AppWindow():
    def __init__(self, master):
        self.master = master
        master.title("Test Application")
        master.geometry("1060x680")
        master.grid_propagate(False)


class FrameOne(tk.Frame):
    def __init__(self, parent):
        super().__init__()
        self["borderwidth"]=5
        self["relief"]="ridge"

        self.LabelText = tk.StringVar()
        self.LabelText.set("It is not working yet")

        self.testlabel = tk.Label(self, textvariable=self.LabelText)        
        self.testlabel.grid(row=1, column=1)


class FrameTwo(tk.Frame):
    def __init__(self, parent):
        super().__init__()
        self["borderwidth"]=5
        self["relief"]="ridge"

        self.testentry = tk.Entry(self)
        self.testentry.insert("end", "This should be working")
        self.testentry.grid(row=1,column=1)

        self.testbutton = tk.Button(self, text="Test the label", command=self.updatelabel)
        self.testbutton.grid(row=1,column=2)

    def updatelabel(self):
        FrameOne.LabelText.set(self.testentry.get())   #HOW TO FIX THIS CODE THE RIGHT WAY?


#Create a window as defined in the AppWindow class
mainWindow = AppWindow(tk.Tk()) 

#Create a Frame as defined in class FrameOne
FirstFrame = FrameOne(mainWindow)
FirstFrame.grid(row=0, column=0) #Positioning Frame on Window

#Create a Frame as defined in class FrameOne
SecondFrame = FrameTwo(mainWindow)
SecondFrame.grid(row=1, column=0) #Positioning Frame on Window

與任何 python object 一樣,您可以使用對 ZA8CFDE6331BD59EB2AC96F8911C46 的引用訪問 object 的屬性。

在您的情況下, updatelabel應如下所示:

def updatelabel(self):
    FirstFrame.LabelText.set(self.testentry.get()) 

注意:您對實例變量使用大寫字符會使您的代碼更難理解。 我建議遵循PEP8中的命名指南。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM