如何使用 tkinter 在嵌套函数中创建全局变量?

How to create global variable in nested function using tkinter?

我使用 tkinter 和一些嵌套函数编写了一些代码(参见下面的代码)并在 pycharm 中收到警告“全局变量 'value' 在模块级别未定义”。该程序按预期工作(window 标题重命名为 'text 0')但我仍然收到警告...我必须更改什么才能消除此警告? (程序比较复杂,我需要像它一样启动它,用window.after,我也需要所有的功能)

from tkinter import *

def function_1():
   global value
   window.title("text " + value)

def function_2():
   def function_3():
       global value
       value = ent.get()
       if value == '0':
          function_1()
   ent = Entry()
   ent.pack()
   button = Button(text="ok", command=function_3)
   button.pack()


window = Tk()
window.after(0, function_2)
window.mainloop()

global 关键字在函数内部用于控制对变量的赋值。通常在函数内 value = "bar" 在局部函数命名空间中创建一个“值”。 global value 在同一个函数中告诉 python 使用全局命名空间。

在您当前的代码中,模块级别 value 变量在调用 function_3 之前不会存在。在调用 function_3 之前尝试使用 value 的任何内容都将得到 NameErrorfunction_1 就是一个很好的例子;如果在 function_3 之前调用它,则会出错。可能是您的代码永远无法在 function_3 之前调用 function_1,但这对于 linter 或代码的未来维护者来说很难知道。这就是您收到警告的原因。

解决方案是为程序设置一个合理的默认值。我不知道什么对你有用,但这是一个抛出消息的例子。顺便说一句,function_1 中不需要 global value。它的工作是控制赋值,你可以读取全局变量而不需要任何额外的注释。

from tkinter import *

value = None

def function_1():
   if value is not None:
       window.title("text " + value)
   else:
       import tkinter.messagebox
       tkinter.messagebox.showerror("Error", "Do the thing before the thing")

def function_2():
   def function_3():
       global value
       value = ent.get()
       if value == '0':
          function_1()

   ent = Entry()
   ent.pack()
   button = Button(text="ok", command=function_3)
   button.pack()
  
window = Tk()
window.after(0, function_2)
window.mainloop()