Python和Tkinter:如何从其他类设置StringVar

时间:2019-05-09 17:37:55

标签: python-3.x tkinter

我正在研究一些python和tkinter,并尝试了一个非常简单的示例应用程序。

tkinter GUI,一个显示文本的标签和两个按钮。 这些按钮应该更改标签中的文本,因为它通过textvariable参数链接到StringVar ...

应该发生什么,简单地: 按下“ A”按钮,标签上将显示“ A” 按下“ B”按钮,“ B”将显示在标签上

但是当我按下按钮“ A”时,程序给了我NameError:未定义名称“ display_frame”。

不能弄清楚发生了什么。我正在访问对象属性...

obs:由于按钮A有问题,因此未尝试配置按钮B的功能


import tkinter

class TkinterWindow(tkinter.Tk):
    def __init__(self):
        super().__init__()
        self.rowconfigure(0, weight=1)
        self.columnconfigure(0, weight=1)
        self.configure(background='orange')



class DisplayFrame(tkinter.Frame):
    def __init__(self, parent):
        super().__init__(parent)
        self.rowconfigure(0, weight=1)
        self.columnconfigure(0, weight=1)
        self.configure(background='cyan')
        self.grid(row=0, column=0, pady=5, padx=5, sticky='nsew')

        self.text = tkinter.StringVar()
        self.text.set('Hello')
        self.display = tkinter.Label(self, textvariable=self.text, font=15, bg="#bebebe", relief="groove", bd=5, height=5 )
        self.display.grid(sticky='nsew')

class ButtonsFrame(tkinter.Frame):
    def __init__(self, parent):
        super().__init__(parent)
        self.rowconfigure(0, weight=1)
        self.columnconfigure(0, weight=1)
        self.columnconfigure(1, weight=1)
        self.configure(background='green')
        self.grid(row=1, column=0, pady=5, padx=5, sticky='nsew')

        self.button_A = tkinter.Button(self, text='A', command=self.write_A)
        self.button_A.grid(row=0, column=0, padx=15, sticky='nsew')

        self.button_B = tkinter.Button(self, text='B')
        self.button_B.grid(row=0, column=1, padx=15, sticky='nsew')

    def write_A(self):
        display_frame.text.set('A')


def main():
    window = TkinterWindow()
    display_frame = DisplayFrame(window)
    buttons_frame = ButtonsFrame(window)
    window.mainloop()


main()

1 个答案:

答案 0 :(得分:1)

您遇到的主要问题是类属性self.text对其他类不可见。解决此问题的一种方法是将该变量移至主tk类,然后仅对其进行引用。这是对代码的最快修复。

import tkinter

class TkinterWindow(tkinter.Tk):
    def __init__(self):
        super().__init__()
        self.rowconfigure(0, weight=1)
        self.columnconfigure(0, weight=1)
        self.configure(background='orange')
        self.text = tkinter.StringVar()
        self.text.set('Hello')


class DisplayFrame(tkinter.Frame):
    def __init__(self, parent):
        super().__init__(parent)
        self.rowconfigure(0, weight=1)
        self.columnconfigure(0, weight=1)
        self.configure(background='cyan')
        self.grid(row=0, column=0, pady=5, padx=5, sticky='nsew')


        self.display = tkinter.Label(self, textvariable=self.master.text, font=15, bg="#bebebe", relief="groove", bd=5, height=5 )
        self.display.grid(sticky='nsew')

class ButtonsFrame(tkinter.Frame):
    def __init__(self, parent):
        super().__init__(parent)
        self.rowconfigure(0, weight=1)
        self.columnconfigure(0, weight=1)
        self.columnconfigure(1, weight=1)
        self.configure(background='green')
        self.grid(row=1, column=0, pady=5, padx=5, sticky='nsew')

        self.button_A = tkinter.Button(self, text='A', command=self.write_A)
        self.button_A.grid(row=0, column=0, padx=15, sticky='nsew')

        self.button_B = tkinter.Button(self, text='B')
        self.button_B.grid(row=0, column=1, padx=15, sticky='nsew')

    def write_A(self):
        self.master.text.set('A')


def main():
    window = TkinterWindow()
    display_frame = DisplayFrame(window)
    buttons_frame = ButtonsFrame(window)
    window.mainloop()

main()

这表示您应该在代码中注意一些事项。在不需要self.时过度使用它,并且在框架类中应用几何图形管理也是一个坏主意。

我个人会在一堂课中构建所有这些。

import tkinter as tk


class TkinterWindow(tk.Tk):
    def __init__(self):
        super().__init__()
        self.rowconfigure(0, weight=1)
        self.columnconfigure(0, weight=1)
        self.configure(background='orange')

        self.text = tk.StringVar()
        self.text.set('Hello')

        display_frame = tk.Frame(self, background='cyan')
        ButtonsFrame = tk.Frame(self, background='green')
        display_frame.rowconfigure(0, weight=1)
        display_frame.columnconfigure(0, weight=1)
        ButtonsFrame.rowconfigure(0, weight=1)
        ButtonsFrame.columnconfigure(0, weight=1)
        ButtonsFrame.columnconfigure(1, weight=1)

        display_frame.grid(row=0, column=0, pady=5, padx=5, sticky='nsew')
        ButtonsFrame.grid(row=1, column=0, pady=5, padx=5, sticky='nsew')

        tk.Label(display_frame, textvariable=self.text, font=15,
                 bg="#bebebe", relief="groove", bd=5).grid(row=0, column=0, sticky='nsew')

        tk.Button(ButtonsFrame, text='A',
                  command=lambda: self.update_text('A')).grid(row=0, column=0, padx=15, sticky='nsew')
        tk.Button(ButtonsFrame, text='B',
                  command=lambda: self.update_text('B')).grid(row=0, column=1, padx=15, sticky='nsew')

    def update_text(self, value):
        self.text.set(value)

TkinterWindow().mainloop()