2014-01-09 185 views
0

我是tkinter模塊的新手,所以本網站上的其他線程對我來說都很困惑。我的程序適用於hang子手遊戲,點擊按鈕後無法刷新窗口。至少我認爲這是問題這裏是我的窗口並連接到按鈕的功能代碼,讓我知道如果你需要更多的代碼:Tkinter模塊刷新窗口

def game(self, num): 
    self.game_window = tkinter.Tk() 
    self.game_window.title('Hangman') 
    self.game_window.geometry('200x150') 
    self.f1 = tkinter.Frame(self.game_window) 
    self.f2 = tkinter.Frame(self.game_window) 
    self.f3 = tkinter.Frame(self.game_window) 
    self.f4 = tkinter.Frame(self.game_window) 
    self.f5 = tkinter.Frame(self.game_window) 
    self.f6 = tkinter.Frame(self.game_window) 
    self.f7 = tkinter.Frame(self.game_window) 
    self.f8 = tkinter.Frame(self.game_window) 
    self.f9 = tkinter.Frame(self.game_window) 
    self.num = num 
    word_list = ['PYTHON','SOMETHING','COMPLETELY','DIFFERENT', 
       'LIST','STRING','SYNTAX','OBJECT','ERROR', 
       'EXCEPTION','OBJECT','CLASS','PERFORMANCE','VISUAL', 
       'JAVASCRIPT','JAVA','PROGRAMMING','TUPLE','ASSIGN', 
       'FUNCTION','OPERATOR','OPERANDS','PRECEDENCE', 
       'LOOPS','SENTENCE','TABLE','NUMBERS','DICTIONARY', 
       'GAME','SOFTWARE','NETWORK','SOCIAL','EDUCATION', 
       'MONITOR','COMPUTER'] 
    shuffle = random.shuffle(word_list) 
    rand = random.choice(word_list) 
    self.word = rand.lower() 
    self.current = len(self.word)*'*' 
    self.letters = [] 
    #self.start_lives = tkinter.Label(self.f1, text = 'You\'ve started the ' 
            #'game with %s lives.\n'%(self.num)) 
    #self.start_lives.pack(side = 'left') 
    self.lives_rem = tkinter.Label(self.f2, 
            text = 'Lives remaining: '+str(self.lives_left())) 
    self.lives_rem.pack(side = 'left')      
    self.guess_letter = tkinter.Label(self.f3, text = 'Guess a letter: ') 
    self.guess_entry = tkinter.Entry(self.f3, width = 10) 
    self.guess_letter.pack(side = 'left') 
    self.guess_entry.pack(side = 'left') 
    #self.f1.pack() 
    self.f2.pack() 
    self.f3.pack() 
    self.guess_button = tkinter.Button(self.f6, 
             text = 'Guess!', 
             command = self.update(self.guess_entry.get())) 
    self.guess_button.pack(side = 'left') 
    self.quit_game = tkinter.Button(self.f6, 
            text = 'Quit Game', 
            command = self.game_window.destroy) 
    self.quit_game.pack(side = 'left') 
    self.f6.pack() 

def update(self, letter): 
    if letter in self.word and letter not in self.letters: 
     pos = self.word.index(letter) 
     self.current1 = list(self.current) 
     self.current1[pos] = letter.upper() 
     self.current2 = ''.join(self.current1) 
     self.letters.append(letter) 
    elif letter in self.letters: 
     self.already_guessed = tkinter.messagebox.showinfo('Error!', 
                  'This letter has already ' 
                  'been guessed') 
    #letter is not in the word 
    elif letter not in self.word: 
     self.sorry = tkinter.Label(self.f5, 
            text = 'Sorry, guess again!') 
     self.sorry.pack(side = 'left') 
     self.letters.append(letter) 
     self.num -= 1 
    self.incorrect_word = tkinter.Label(self.f4, 
             text = 'Word: '+self.current) 
    self.incorrect_word.pack(side='left') 
    self.f5.pack() 
    self.f4.pack() 
    return self.current 

我只學了2個月這樣的裸蟒蛇跟我。這是Hangman類中的兩種方法。謝謝

回答

1

定義猜測按鈕行:

self.guess_button = tkinter.Button(self.f6, text = 'Guess!', command = self.update(self.guess_entry.get())) 

需要修改。 命令參數爲按鈕類應該是一個函數,但此行正在調用該函數(它將函數的輸出作爲command參數的值發送)。正如您在quit_game按鈕定義中所看到的,self.game_window.destroy函數是作爲命令提供的,但現在不會被調用。

我建議修改這一行是這樣的:

self.guess_button = tkinter.Button(self.f6, text = 'Guess!', command = self._on_guess_button_click) 

,然後添加一個新的方法到類像這樣:

def _on_guess_button_click (self): 
    self.update(self.guess_entry.get()) 
+0

謝謝您的回覆,編碼遺體的不幸結果不變。不過,我真的很感謝全面的迴應。 – Softey

+0

不客氣。如果您包含有關代碼的更多詳細信息,預期的行爲是什麼以及確切的(不希望的)結果是什麼,則可能會出現更多有用的答案。 – farzad