【问题标题】:Tkinter Module refresh windowTkinter 模块刷新窗口
【发布时间】:2014-01-27 23:47:03
【问题描述】:

我的程序是用于刽子手游戏的,单击按钮后我无法刷新窗口。至少我认为这是问题所在这是我的窗口代码和链接到按钮的函数,如果您需要更多代码,请告诉我:

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

这是 Hangman 类中的两个方法。

【问题讨论】:

    标签: button tkinter window refresh


    【解决方案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())
    

    【讨论】:

    • 感谢您的回复,遗憾的是编码的结果没有改变。但是,我非常感谢您的全面回应。
    • 不客气。如果您包含有关代码的更多详细信息、预期行为以及确切(不希望的)结果是什么,则可能会出现更多有用的答案。
    猜你喜欢
    • 1970-01-01
    • 2010-12-29
    • 1970-01-01
    • 2020-04-14
    • 2020-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-24
    相关资源
    最近更新 更多