2017-01-23 97 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

對!我讀過關於定義全局變量的信息,但顯然我沒有意識到我實際上也必須定義'全局'。謝謝。 –