Tkinter模块刷新窗口

时间:2014-01-09 12:16:16

标签: button tkinter window refresh

我是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个月的python,所以对我来说是光秃秃的。这是Hangman类中的两种方法。谢谢

1 个答案:

答案 0 :(得分:1)

定义猜测按钮的行:

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

需要修改。 Button 类的命令参数应该是一个函数,但是这一行调用该函数(它将函数的输出作为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())