Python 3.x tkinter:根据更改的选项菜单调整标签文本

Python 3.x tkinter:根据更改的选项菜单调整标签文本,python-3.x,lambda,tkinter,Python 3.x,Lambda,Tkinter,在画布中有一个按钮“new entry”,用于启动顶层。它有一个提交按钮、一个取消按钮、一个选项菜单和一个标签。目标是使选项菜单中的选定值更改标签文本。我没有为画布添加代码 def Test(value): p = value print(p) # a test E2.config(text=str(p)) def Vullen_Toplevel_Aankoop_EUR(i): top = Toplevel() top.geometry("%dx%d%+

在画布中有一个按钮“new entry”,用于启动顶层。它有一个提交按钮、一个取消按钮、一个选项菜单和一个标签。目标是使选项菜单中的选定值更改标签文本。我没有为画布添加代码

def Test(value):
    p = value
    print(p) # a test
    E2.config(text=str(p))

def Vullen_Toplevel_Aankoop_EUR(i):
    top = Toplevel()
    top.geometry("%dx%d%+d%+d" % (600, 800, 250, 125))

    BSubmit = Button(top, text="Submit", fg='green')
    BSubmit.grid(row=1, column=0, sticky="ew", columnspan=1, padx=20)

    BCancel = Button(top, text="Cancel", fg='red', command=top.destroy)
    BCancel.grid(row=10, column=0, sticky="ew", columnspan=1, padx=20)

    p = None
    E2 = None

    E1_opt = ["A","B","C"]
    E1_var = StringVar(top)
    E1_var.set(E1_opt[0])
    W1 = OptionMenu(top, E1_var, *E1_opt, command=Test)
    W1.grid(row=2, column=1, sticky="ew")

    E2 = Label(top, text='test')
    E2.grid(row=4, column=2, sticky="ew")
变量p的默认值为“空”。OptionMenu触发command=Test,在控制台上打印p的新值。到目前为止还不错

我试图用E2.config(test=str(p))更新标签E2。不幸的是,错误消息:

NameError:未定义名称“E2”

虽然没有添加到此处的代码中,但我尝试了以下操作:

  • 将E2标签定义为“空”或在我定义的“p”的下方,错误是相同的
  • 在def Test(value)中定义E2标签,但这里-当然-错误是没有定义Toplevel()top
  • 代替command=Test,我尝试了command=lambda:Test(top,E1_var.get()),并将测试方法更改为def Test(top,value),但错误是:TypeError:()接受0个位置参数,但给出了1个

我有点不知所措。你有什么见解可以分享吗?谢谢。

在所有函数之外创建全局变量

E2 = None
使用
global E2
通知函数您不希望为全局/外部变量
E2
赋值。如果没有
global
,它将创建局部变量
E2
,并且不会分配给全局变量

def Vullen_Toplevel_Aankoop_EUR(i):
    global E2 # you need it because you use `E2 = ...`

    E2 = Label(top, text='test')
满满的


顺便说一句:更短

 top.geometry("600x800+250+125")

E2
是仅存在于一个函数中的局部变量。在所有函数之外定义它-例如,
E2=None
,然后您将拥有全局变量。然后,您可以通过在
Vullen\u Toplevel\u ankoop\u EUR
内部使用
global E2
通知函数使用此变量(因为您使用
=
赋值)。在
Test
中,您不必使用
global E2
,因为您不使用
=
,它会自动使用外部
E2
。@老实说,我不知道是否确认了该方法。p和E2都是在Vullen_Toplevel_Aankoop_EUR中定义的(现在为=无,代码示例已更新),可以在测试[value]变量时使用[=]接收。但E2作为按钮的定义,后来在Vullen\u Toplevel\u Aankoop\u EUR中设置,在测试中仍然没有定义。我将E2=None定义移到了Toplevel()函数之外,但结果保持不变。也许你能再澄清一下你的说法。谢谢。再次阅读推荐:定义
E2=None
外部函数-并在函数内部使用
global E2
。对!我读过关于定义全局变量的书,但显然我没有意识到我实际上也必须定义“全局”。谢谢
 top.geometry("600x800+250+125")