如何在 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 声明周围有两个空行。对象方法定义周围有一个空行。