Python中的作用域错误(Tkinter):";名称';样本名称';未定义“的;,即使它被宣布为全球性的

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

我正在尝试使用Tkinter创建一个Python GUI。我首先创建一个窗口,向用户显示选项,如按钮。单击一个按钮时,我调用一个函数,用
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
所做的一切。