[英]tkinter: How to access a StringVar and objects from a different class?
我有一個簡單的 tkinter 兩幀應用程序,帶有Label
、 Entry
和Button
小部件,我想使用FrameOne
的Entry
和Button
訪問 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.