Tkinter OOP原理,是使用方法好还是嵌套好类
Tkinter OOP principle, is it better to use methods or nested classes
我正在学习使用 GUI 编写程序,但我无法理解最佳原理。
目前我正在尝试拥有 5 个条目,写入条目的文本会自动更新为标签。到目前为止,这是我的代码:
import tkinter as tk
class MainApplication(tk.Frame):
def __init__(self, parent, *args, **kwargs):
tk.Frame.__init__(self, parent, *args, **kwargs)
self.parent = parent
# GUI starts here
self.label = tk.Label(parent, text="Give values")
self.label.grid(row="1")
self.entries()
self.labels()
def entries(self):
for i in range(5):
number1 = tk.StringVar()
entry = tk.Entry(textvariable=number1)
entry.grid(row=3, column=i)
result = entry.get()
return result
def labels(self,):
for i in range(5):
label = tk.Label(self.parent, text=self.entries(), width=17, borderwidth=2, relief="groove")
label.grid(row=4, column=i)
if __name__ == "__main__":
root = tk.Tk()
root.geometry("1280x800")
MainApplication(root).grid()
root.mainloop()
我的代码输出如下。显然,很多事情都是错误的,因为我没有得到五个输入框,而且它们不会自动更新到下面的标签。
我有两个问题:
- 如何修复我的代码以获得想要的输出
- 在我的 MainApplication class 中使用嵌套的 classes 而不是方法来构建 GUI 会是更好的方法吗?
如果您希望标签与条目小部件具有完全相同的文本,目前最简单的解决方案是让它们共享相同的 textvariable
。
这是一个基本示例。当您 运行 它然后输入任何条目时,该值会立即显示在它下面的标签中。
import tkinter as tk
class MainApplication(tk.Frame):
def __init__(self, parent, *args, **kwargs):
tk.Frame.__init__(self,parent, *args, **kwargs)
self.parent = parent
self.label = tk.Label(parent, text="Give values")
self.label.grid(row=1)
for column in range(5):
var = tk.StringVar()
entry = tk.Entry(root, textvariable=var)
label = tk.Label(root, textvariable=var, width=17)
entry.grid(row=2, column=column, sticky="ew")
label.grid(row=3, column=column, sticky="ew")
if __name__ == "__main__":
root = tk.Tk()
root.geometry("1280x800")
MainApplication(root).grid()
root.mainloop()
我通常不提倡对 Entry
小部件使用特殊的 tkinter 变量,但这是一个很好的例子,说明它何时是完成工作的正确工具。
至于使用嵌套的问题类,不,他们帮不上忙。嵌套 类 几乎从来没有比在全局范围内定义 类 更好的时候。嵌套使代码更难编写和理解,同时提供的额外价值很少。
嵌套 类 在非常特殊的情况下很有用,但通常不应该使用。
我正在学习使用 GUI 编写程序,但我无法理解最佳原理。
目前我正在尝试拥有 5 个条目,写入条目的文本会自动更新为标签。到目前为止,这是我的代码:
import tkinter as tk
class MainApplication(tk.Frame):
def __init__(self, parent, *args, **kwargs):
tk.Frame.__init__(self, parent, *args, **kwargs)
self.parent = parent
# GUI starts here
self.label = tk.Label(parent, text="Give values")
self.label.grid(row="1")
self.entries()
self.labels()
def entries(self):
for i in range(5):
number1 = tk.StringVar()
entry = tk.Entry(textvariable=number1)
entry.grid(row=3, column=i)
result = entry.get()
return result
def labels(self,):
for i in range(5):
label = tk.Label(self.parent, text=self.entries(), width=17, borderwidth=2, relief="groove")
label.grid(row=4, column=i)
if __name__ == "__main__":
root = tk.Tk()
root.geometry("1280x800")
MainApplication(root).grid()
root.mainloop()
我的代码输出如下。显然,很多事情都是错误的,因为我没有得到五个输入框,而且它们不会自动更新到下面的标签。
我有两个问题:
- 如何修复我的代码以获得想要的输出
- 在我的 MainApplication class 中使用嵌套的 classes 而不是方法来构建 GUI 会是更好的方法吗?
如果您希望标签与条目小部件具有完全相同的文本,目前最简单的解决方案是让它们共享相同的 textvariable
。
这是一个基本示例。当您 运行 它然后输入任何条目时,该值会立即显示在它下面的标签中。
import tkinter as tk
class MainApplication(tk.Frame):
def __init__(self, parent, *args, **kwargs):
tk.Frame.__init__(self,parent, *args, **kwargs)
self.parent = parent
self.label = tk.Label(parent, text="Give values")
self.label.grid(row=1)
for column in range(5):
var = tk.StringVar()
entry = tk.Entry(root, textvariable=var)
label = tk.Label(root, textvariable=var, width=17)
entry.grid(row=2, column=column, sticky="ew")
label.grid(row=3, column=column, sticky="ew")
if __name__ == "__main__":
root = tk.Tk()
root.geometry("1280x800")
MainApplication(root).grid()
root.mainloop()
我通常不提倡对 Entry
小部件使用特殊的 tkinter 变量,但这是一个很好的例子,说明它何时是完成工作的正确工具。
至于使用嵌套的问题类,不,他们帮不上忙。嵌套 类 几乎从来没有比在全局范围内定义 类 更好的时候。嵌套使代码更难编写和理解,同时提供的额外价值很少。
嵌套 类 在非常特殊的情况下很有用,但通常不应该使用。