如何在 Tkinter python 上更新按钮文本(button1 未定义错误消息)
How to update button text on Tkinter python (button1 not defined error message)
我正在尝试更新 TKinter GUI 上的按钮文本(学习 TKinter!),但遇到了一个小问题。我得到一个 button1 未定义。我确定我错过了一些愚蠢的东西!
def toggleText():
if button1["text"] == "hi":
button1["text"] = "bye"
else:
button1["text"] = "hi"
def selection():
button1 = Button(tab1, text="hi", command=toggleText, height=5, width=10)
button1.grid(column=1, row=1, padx=10, pady=10)
root.mainloop()
selection()
HERE IS THE OUTPUT I GET:
if button1["text"] == "hi":
NameError: name 'button1' is not defined
你有几个选择,最简单的是只使用 global
使 button1
成为一个可以在任何地方访问的全局名称,只要确保你调用 toggleText
在调用 selection
:
之后
def selection():
global button1
button1 = Button(...)
...
另一种选择是使用函数参数(在这种情况下这是更好的做法):
# make `toggleText` accept an argument for button:
def toggleText(btn):
if btn['text'] == 'hi':
btn['text'] = 'bye'
...
def selection():
# use lambda to pass an argument and since it is a lambda name
# `button1` can be not yet defined since `lambda` is not called immediately
button1 = Button(..., command=lambda: toggleText(button1))
...
还有:
我强烈建议在导入内容时不要使用通配符 (*
),您应该导入您需要的内容,例如from module import Class1, func_1, var_2
等等或导入整个模块:import module
然后你也可以使用别名:import module as md
或类似的东西,关键是不要导入所有东西,除非你真的知道你在做什么;名称冲突是问题所在。
强烈建议关注PEP 8 - Style Guide for Python Code。函数和变量名称应在 snake_case
中,class 中的名称应在 CapitalCase
中。在函数和 class 声明周围有两个空行。对象方法定义周围有一个空行。
我正在尝试更新 TKinter GUI 上的按钮文本(学习 TKinter!),但遇到了一个小问题。我得到一个 button1 未定义。我确定我错过了一些愚蠢的东西!
def toggleText():
if button1["text"] == "hi":
button1["text"] = "bye"
else:
button1["text"] = "hi"
def selection():
button1 = Button(tab1, text="hi", command=toggleText, height=5, width=10)
button1.grid(column=1, row=1, padx=10, pady=10)
root.mainloop()
selection()
HERE IS THE OUTPUT I GET:
if button1["text"] == "hi":
NameError: name 'button1' is not defined
你有几个选择,最简单的是只使用 global
使 button1
成为一个可以在任何地方访问的全局名称,只要确保你调用 toggleText
在调用 selection
:
def selection():
global button1
button1 = Button(...)
...
另一种选择是使用函数参数(在这种情况下这是更好的做法):
# make `toggleText` accept an argument for button:
def toggleText(btn):
if btn['text'] == 'hi':
btn['text'] = 'bye'
...
def selection():
# use lambda to pass an argument and since it is a lambda name
# `button1` can be not yet defined since `lambda` is not called immediately
button1 = Button(..., command=lambda: toggleText(button1))
...
还有:
我强烈建议在导入内容时不要使用通配符 (*
),您应该导入您需要的内容,例如from module import Class1, func_1, var_2
等等或导入整个模块:import module
然后你也可以使用别名:import module as md
或类似的东西,关键是不要导入所有东西,除非你真的知道你在做什么;名称冲突是问题所在。
强烈建议关注PEP 8 - Style Guide for Python Code。函数和变量名称应在 snake_case
中,class 中的名称应在 CapitalCase
中。在函数和 class 声明周围有两个空行。对象方法定义周围有一个空行。