Python中的作用域错误(Tkinter):";名称';样本名称';未定义“的;,即使它被宣布为全球性的
我正在尝试使用Tkinter创建一个Python GUI。我首先创建一个窗口,向用户显示选项,如按钮。单击一个按钮时,我调用一个函数,用Python中的作用域错误(Tkinter):";名称';样本名称';未定义“的;,即使它被宣布为全球性的,python,tkinter,scope,toplevel,Python,Tkinter,Scope,Toplevel,我正在尝试使用Tkinter创建一个Python GUI。我首先创建一个窗口,向用户显示选项,如按钮。单击一个按钮时,我调用一个函数,用Toplevel()函数创建一个新窗口。在新窗口中,我有一个按钮和一个标签。通过单击按钮,我希望更改标签的文本。但是,我得到一个关于标签范围的错误。下面是代码概念的一个示例: import tkinter as tk # function called by popWin() def func(): global win_lbl # declar
Toplevel()函数创建一个新窗口。在新窗口中,我有一个按钮和一个标签。通过单击按钮,我希望更改标签的文本。但是,我得到一个关于标签范围的错误。下面是代码概念的一个示例:
import tkinter as tk
# function called by popWin()
def func():
global win_lbl # declaring label as global so that I can edit its text
win_lbl['text'] = 'new text' # Here, I get scope error (name 'win_lbl' is not defined)
def popWin():
window = tk.Toplevel()
win_btn = tk.Button(window, command = func) # A button
win_lbl = tk.Label(window, text = 'initial text') # A label whose name I want to change with func()
win_btn.grid()
win_lbl.grid()
window.mainloop()
# Main Code
root = tk.Tk()
frame = tk.Frame(root)
btn = tk.Button(frame, text = 'Option 1', command = popWin) # calls popWin, which creates a new window with Toplevel()
btn.grid()
frame.grid()
root.mainloop()
错误全文:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python\Python39\lib\tkinter\__init__.py", line 1885, in __call__
return self.func(*args)
File "c:\Users\Me\Desktop\proj\Menu.py", line 15, in func
win_lbl['text'] = 'new text'
NameError: name 'win_lbl' is not defined
任何帮助都将不胜感激。提前感谢。定义全局意味着您必须在全局范围内定义变量,即在任何函数之外。global
关键字意味着您告诉Python使用具有该名称的全局定义变量。因此,要解决您的问题,您必须将win\u lbl
的定义放在任何函数之外的代码顶部,将其作为参数传递给func
,或者将您的函数和所有全局函数存储在一个类中,并引用该类变量。您必须在popWin()中说global win\u lbl
)
而不是func()
变量在func()中是“全球化”的,但尚未初始化。popWin()中变量的初始化与func()无关。将全局声明移到popWin()或函数外部。@MaxM“函数外部”?谢谢,这很有效!在函数定义之前,我曾试图将win_lbl声明为全局函数,但没有成功。但是,在您回答之后,我尝试在popWin()上声明global,结果成功了!多谢各位@tsamourid您不能通过global whatever
在函数外部声明全局,您只需要执行类似whatever=some_值的操作。在Python中声明新变量的方法是给它赋值。使用global which
只意味着您想要访问已经声明的内容,这就是global
所做的一切。