tkinter: Как получить доступ к StringVar и объектам из другого класса? - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть простое приложение 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

1 Ответ

0 голосов
/ 15 апреля 2020

Как и для любого объекта python, вы получаете доступ к атрибуту объекта, используя ссылку на объект.

В вашем случае updatelabel должно выглядеть следующим образом:

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

Примечание: использование символов верхнего регистра для переменных экземпляра значительно затрудняет понимание кода. Я рекомендую следовать правилам именования в PEP8 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...