【发布时间】:2016-10-31 23:08:41
【问题描述】:
我开始使用 Tkinter 库在 Python 中编写一个简单的 GUI 应用程序。 一切正常,但是,要动态更改任何小部件(例如,从“登录”到“注销”的按钮等),我必须从外部获取包含小部件对象本身的变量。 我可以通过两种方式做到这一点:
- 将小部件作为参数传递;
- 使用全局变量。
一个简化的例子:
1) 作为参数传递:
def changeLabel(b):
b.config(text='Logout')
btn1 = Button(f0,text="Login",width=15)
btn1.grid(row=1,column=2,rowspan=1,padx=10,ipadx=10)
changeLabel(btn1)
2) 或者使用全局变量:
def changeLabel():
global btn1
btn1.config(text='Logout')
btn1 = Button(f0,text="Login",width=15)
btn1.grid(row=1,column=2,rowspan=1,padx=10,ipadx=10)
changeLabel(btn1)
现在,我知道应该避免全局变量,但是通过许多函数将每个小部件作为参数传递,即使在简单的应用程序中,这也是一团糟。
那么,在运行时操作 Tkinter 小部件的最佳方法是什么?你能建议我正确的方法吗? 谢谢
【问题讨论】:
-
难道你就不能完全没有
changeLabel函数,而是将btn1.config(text="Logout")内联吗?顺便说一句,方法#2 中不需要global语句,因为您没有为btn1分配任何东西。 -
第三种选择是使用类,其中小部件是类的一个属性。
-
我的示例是自愿简化的,在我的应用程序中,我需要: - 隐藏一个按钮并显示另一个 - 每次点击更改文本 - 隐藏/显示框架 - 等等...
-
@Kevin:我会说调用函数是最佳实践。像这样的内联代码会使程序随着时间的推移更难维护。
-
顺便说一句,您已经将 130 多个名称导入到全局命名空间中,因为您使用了
from tkinter import *。最好是import tkinter as tk。
标签: python python-3.x tkinter