2017-01-23 57 views
0

在画布上调整标签文本有一个按钮,启动一个Toplevel为“新条目”。它有一个提交按钮,一个取消按钮,一个OptionMenu和一个标签。目标是从OptionMenu中选择的值更改标签文本。我没有添加画布的代码。Tkinter的:基于改变OptionMenu

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触发命令= Test,它在控制台上输出p的新值。到现在为止还挺好。

我试图与更新标签E2:E2.config(试验= STR(P))。不幸的是,错误消息:

NameError: name 'E2' is not defined

虽然不添加到代码在这里,我试过如下:

  • 定义E2标签为“空”,或者作为标签的正下方,我定义的“P” ,错误是一样的。
  • 定义在高清测试(值),但这里E2标签 - 当然 - 错误是顶层()顶部没有定义。
  • 而不是命令=测试我试着command = lambda:Test(top,E1_var.get())并将Test方法更改为def Test(top,value),但错误是:TypeError:()取0位置论点,但1给出了

我有种想法。你有分享见解吗?谢谢。

+0

'E2'是只存在于一个函数的局部变量。在所有功能之外定义它 - 即。 'E2 = None',然后你会有全局变量。然后你可以在'Vullen_Toplevel_Aankoop_EUR'里面使用'global E2'来通知函数使用这个变量(因为你使用'='赋值)。在'Test'中,你不必使用'global E2',因为你不使用'=',它会自动使用外部'E2'。 – furas

+0

@furas说实话,我不明白,如果证实了方法与否。 Vullen_Toplevel_Aankoop_EUR(现在为= None,代码示例更新)中定义了p和E2,并且可以在[Test] [value]变量中用[=]接收。但仍然E2定义了一个Button,稍后在Vullen_Toplevel_Aankoop_EUR中设置仍然没有在Test中定义。我在Toplevel()函数之外移动了E2 = None定义,但结果保持不变。也许你更多地澄清你的陈述。谢谢。 –

+0

再读一遍:定义'E2 = None' ** OUTSIDE FUCTIONS ** - 并使用'global E2' ** INSIDE FUNCTIONS **。 – furas

回答

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 

顺便说一句:短

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

对!我读过关于定义全局变量的信息,但显然我没有意识到我实际上也必须定义'全局'。谢谢。 –

相关问题