after()没有更新我的Tkinter GUI

时间:2016-12-15 22:37:58

标签: python user-interface tkinter

我正在尝试创建一个迷你游戏,从A-G字母生成一个随机单词,并要求用户在MIDI控制器上拼写该单词。之前,我使用while循环在命令行中使用了正常的代码,但是一旦我开始创建GUI,显然while循环将无法工作。

我做过研究,并建议使用after()方法“刷新”该功能,以便更新GUI窗口。但是,它没有这样做。我希望窗口能够打印每次按下哪个音符,然后将其打印出来。我花了一整天时间试图搞清楚,但无济于事。

到目前为止我的代码:

def spelling_func(self):
    """ Lesson 1: Spelling Game
        MINI GAME that generates a random word & asks user to spell it out using piano keyboard."""

    piano = PianoInput() # Class that reads in MIDI input
    spelling = SpellingGame()
    text = Tkinter.Text(self.window.after(1), bg="black", fg="red", font="Helvetica")

    # Generates random word from dict.
    spelling.random_word_gen()

    # Asks user to spell random word
    text.insert('insert', "Please spell the word: " + spelling.word)
    text.pack()

    #while spelling.isTrue:
    piano.detect_key()
    if piano.piano_key == [] or piano.piano_key[0][0][0] == 128:
        pass
    else:
        #Prints the note pressed.
        text.insert('insert', piano.display_note(piano.piano_key[0][0][1]))
        text.pack()

        print piano.display_note(piano.piano_key[0][0][1])

        spelling.user_input = spelling.input_to_list(piano.piano_key[0][0][1])

        user_input_notes = []

        # Cycles through user input list & converts returned number to what key is pressed. Then adds to list.
        for item in spelling.user_input:
            temp_key = piano.display_note(item)

            parsed_note = piano.parse_key(temp_key)

            user_input_notes.append(parsed_note)
            print "user input notes"
            print user_input_notes
            print "Generated word"
            print spelling.generated_word

            spelling.win_or_lose(user_input_notes)

            # continue
        self.after(0, self.spelling_func)

我已经评论了原来的while循环只是为了给出一个想法。如果需要,此方法从另一个类调用另一个方法,其定义如下:

 def win_or_lose(self, user_input_notes):
    i = 0  # Counter for list positions.

    # If notes are correct.
    if user_input_notes == self.generated_word:
        print 'CONGRATS!'
        winsound.PlaySound('sound/sfx/OOT_Song_Correct.wav', winsound.SND_FILENAME)

        # Clears out all previous input & generated words
        self.generated_word = []
        self.user_input = []
        user_input_notes = []

        self.random_word_gen()

        # Asks user to spell random word
        print "Please spell the word: " + self.word

    # If user gets note wrong.
    elif user_input_notes[i] != self.generated_word[i]:
        print 'WRONG!'
        winsound.PlaySound('sound/sfx/OOT_Song_Error.wav', winsound.SND_FILENAME)

        # Clears out all previous input
        self.user_input = []
        user_input_notes = []
        i = 0

        print "Try again!"
        print "\n"
        print "Please spell the word: " + self.word

    else:
        i += 1

提前致谢。我为它的草率而道歉,我对用GUI编程不太熟悉。

1 个答案:

答案 0 :(得分:0)

我想出了一个解决方案。事实证明我正在使用After(0,...),这使得它跳过了after(),就像Bryan所说的那样。我把它改成了(1,......)。然后我将该函数拆分为两个不同的函数,因为开始部分不需要循环,只有#while isTrue被注释掉的部分。

然后我将after()放在第二个函数的末尾,稍微调整一下,就可以了!谢谢:))