tkinter:根据更改的OptionMenu调整标签文本

时间:2017-01-23 22:06:15

标签: python-3.x lambda tkinter

在画布中有一个按钮'新条目'这开始了Toplevel。它有一个提交按钮,一个取消按钮,一个OptionMenu和一个Label。目标是OptionMenu中的选定值更改Label文本。我没有为画布添加代码。

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的新值。到目前为止一切都很好。

我尝试使用以下命令更新Label E2:E2.config(test = str(p))。不幸的是错误消息:

  

NameError:name' E2'未定义

虽然这里没有添加到代码中,但我尝试了以下内容:

  • 将E2标签定义为'清空'或者作为我定义的地方下面的标签' p',错误是相同的。
  • 在def测试(值)中定义E2标签,但在这里 - 当然 - 错误是没有定义Toplevel()top。
  • 而不是命令=测试我尝试了命令= lambda:Test(top,E1_var.get())并将Test方法更改为def测试(top,value)但是然后错误是:TypeError :()占用0位参数但是给出了

我有点想法。你有分享的见解吗?感谢。

1 个答案:

答案 0 :(得分:0)

在所有功能之外创建全局变量

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')

完整

# create global variable
E2 = None

def Test(value):
    #global E2 # you don't need it because you don't use `E2 = ...`

    E2.config(text=value)

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

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

# you can create also after functions
#E2 = None

BTW:更短

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