我正在尝试创建一个迷你游戏,从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编程不太熟悉。
答案 0 :(得分:0)
我想出了一个解决方案。事实证明我正在使用After(0,...),这使得它跳过了after(),就像Bryan所说的那样。我把它改成了(1,......)。然后我将该函数拆分为两个不同的函数,因为开始部分不需要循环,只有#while isTrue被注释掉的部分。
然后我将after()放在第二个函数的末尾,稍微调整一下,就可以了!谢谢:))