我正在研究一些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()
答案 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()