У меня есть простое приложение tkinter с двумя фреймами с виджетом Label
, Entry
и Button
, и я хочу получить доступ к StringVar()
из FrameOne
с Entry
и Button
из FrameTwo.
Если вы видели много примеров кода, но не поняли, как это было сделано в моем примере ниже. Многие программисты используют контроллер. Если бы я использовал контроллер, я в конечном итоге от ошибки к другому. Например:
FirstFrame = FrameOne(mainWindow)`
TypeError: __init__() missing 1 required positional argument: 'controller'
Что я полностью понимаю, потому что я не передаю ничего в новый аргумент класса 'controller' при вызове класса Frame. Но я не знаю, что я должен передать в это, чтобы решить это. Возможно, это также вызвано отсутствием знаний об использовании переменных класса (приветствуются любые литературные советы).
То же самое относится и к решению наследовать FrameOne
в FrameTwo
. Я сталкиваюсь с тем же количеством ошибок, применяемых к моему коду.
Другое дело, что у многих программистов есть примеры двух кадров, которые не видны одновременно, в то время как в моем примере у меня есть два кадра друг под другом в то же время.
Другая связанная с мной проблема заключается в том, что, если виджет метки 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