2014-12-26 154 views
0

我正在寫一個tkinter程序,我試圖在ui上更新我的標籤。但是我無法讓它工作。下面的代碼:在python tkinter中不更新的標籤

from tkinter import * 
import random, functools, string 

root = Tk() 

word_list = ["APPLE", "PEAR", "BANNANA"] 

word = word_list [random.randint(0,2)] 

hidden_word = ["_ "] * len(word) 
print (word) 


abc = ['_ '] * len(word) 
guessed_letters = [] 

#Functions 
def click_1 (key): 
    if key in word: 
     guessed_letters = ''.join([key]) 
     global abc 
     abc = ''.join([key if key in guessed_letters else "_" for key in word]) 
    else: 
     print ("Nope") ####TESTING##### 


#Frames 
hangman_frame = Frame(root) 
hangman_frame.grid(row=0, column=0, sticky=N) 
letter_frame = Frame(root) 
letter_frame.grid(row=1, column=0, sticky=S) 

#Label 
letters_label = Label(hangman_frame, textvariable=abc) 
letters_label.grid(row=0, column=0, sticky=W) 

(只是節選,不是所有的)

我的問題是,跑的時候,這部分好像不工作:

letters_label = Label(hangman_frame, textvariable=abc) 

其中:

abc = ['_ '] * len(word) 
    guessed_letters = [] 

#Functions 
def click_1 (key): 
    if key in word: 
     guessed_letters = ''.join([key]) 
     global abc 
     abc = ''.join([key if key in guessed_letters else "_" for key in word]) 

而沒有顯示出來,而當這是:

letters_label = Label(hangman_frame, text=abc) 

標籤出現,但在函數click_1被調用時不會更新。

這是什麼原因?提前致謝。

回答

2

原因是textvariable選項需要StringVarIntVar的實例。你不能只傳遞一個普通變量的名字。

一般而言,除非特別需要StringVarIntVar的功能(例如讓兩個小部件共享相同的數據或對變量執行跟蹤),否則不需要使用textvariable選項。我知道很多例子都使用它,但它只是增加了另一個你並不需要的對象。

爲了更新標籤上的文字,你可以這樣做:

letters_label = Label(..., text="initial value") 
... 
def click_1(...): 
    ... 
    abc = ... 
    letters_label.configure(text=abc) 
+0

,完美的作品_almost_ - 它不保留更改,即。當我按'a'時,它會更改爲'a',但是當我按'b'時,它只輸出'b'並刪除'a'。任何方式來解決這個問題? – 18166

+0

你能否回答我的問題,因爲這讓我很沮喪。 – 18166

+0

在顯示它之前重新定義'abc'時,您必須將'a'替換爲'b',而不是將'b'加入'a'。 –