我剛開始學習 python,目前正在嘗試使用 tkinter 制作經典的“劊子手”游戲。邊做邊學,你懂的
請參閱下面的代碼。當然遠非完美,但總體上有效 - 然而,任何一般反饋都值得贊賞。
現在我被卡住了(并嘗試了幾個小時..):在完全猜出一個單詞后,它會自動顯示下一個單詞(通常來自隨機串列,但我在這里洗掉了它)。我希望最后一句話在螢屏上停留幾秒鐘,但無論我做什么都不會發生這種情況。我玩弄after了小部件的方法和time.sleep現在。但是沒有效果。
主要問題:當猜出一個單詞的最后一個字母時,它不會顯示最后一個字母而是直接轉到新單詞。
問題似乎出在new_word()我創建的函式上,因為當我洗掉它時,至少會顯示最后一個字母(但游戲當然不會向前推進)。
真的讓我發瘋,因為我找不到這種行為背后的邏輯。我希望有人可以看看并告訴我出了什么問題。
# -*- coding: utf-8 -*-
from tkinter import *
import random
import time
root = Tk()
root.geometry('700x800')
root.configure(background='white')
headline = Label(root, text='HANGMAN 2.0 \n',
bg='white',
font=('console', '30', 'bold underline')
).place(x=10, y=10)
letter_label = Label(root)
b_new_game = Button(root, text='New game', relief='solid', font=('console', 15), command=lambda: new_game())
b_new_game.place(x=10, y=450)
player_name = StringVar()
input_player_name = Entry(root, textvariable=player_name, font=('console', 15))
input_player_name.place(x=200, y=455)
player_name.set('player')
alphabet = [i for i in 'abcdefghijklmnopqrstuvwxyz'.upper()]
letters = []
l_buttons = []
start_trials = 10
input_word = ''
class Player:
"""Create player of the game"""
def __init__(self, name, trials, score):
self.name = name
self.trials = trials
self.score = score
def make_guess(self, letter):
if letter not in input_word:
self.trials -= 1
if self.trials == 0: # GAME OVER?
msg_box = Tk()
Label(msg_box, text='GAME OVER').pack()
# Add Highscore
for i, v in enumerate(input_word):
if v == letter:
letters[i] = letter
display_letters()
if '_' not in letters: # Won?
self.score = 1
time.sleep(1)
new_word()
show_stats()
return letters
class LetterButton:
"""Buttons for each letter to choose from"""
def __init__(self, letter):
self.letter = letter
self.letter_button = Button(root,
text=letter,
fg='white',
bg='black',
relief='ridge',
activebackground='grey',
font=('console', 14, 'bold'),
borderwidth=2,
command=lambda: self.picked_letter(letter)
)
def picked_letter(self, letter):
"""Returns the letter, deletes the button"""
self.letter_button.place_forget()
Player.make_guess(player, letter)
def new_game():
"""Start new game, reset stats"""
global player
player = Player(player_name.get(), start_trials, 0)
new_word()
def display_letters():
"""Display the hidden and guessed letters"""
global letter_label
letter_label.place_forget()
letter_label.config(bg='white', text=' '.join(letters), font=('console', 25, 'bold'))
letter_label.place(x=10, y=200)
def renew_buttons():
"""Deleting and recreating the buttons for the letters to choose"""
for button in l_buttons:
button.place_forget()
x, y = 10, 300
for pos, item in enumerate(alphabet):
if pos < (len(alphabet) // 2):
lb = LetterButton(item).letter_button
lb.place(x=x pos * 50, y=y, width=40)
l_buttons.append(lb)
else:
lb = LetterButton(item).letter_button
lb.place(x=x (pos - 13) * 50, y=y 50, width=40)
l_buttons.append(lb)
def show_stats():
x, y, fontsize, fg1, bg1 = 450, 80, 12, 'black', 'white'
Label(root, text='Player', fg=fg1, bg=bg1, font=('console', fontsize, 'bold')).place(x=x, y=y, width=80, anchor='w')
Label(root, text='Score', fg=fg1, bg=bg1, font=('console', fontsize, 'bold')).place(x=x, y=y 25, width=80, anchor='w')
Label(root, text='Trials', fg=fg1, bg=bg1, font=('console', fontsize, 'bold')).place(x=x, y=y 50, width=80, anchor='w')
Label(root, text=player.name, fg=fg1, bg=bg1, font=('console', fontsize, 'bold')).place(x=x 80, y=y, width=100, anchor='w')
Label(root, text=player.score, fg=fg1, bg=bg1, font=('console', fontsize, 'bold')).place(x=x 80, y=y 25, width=100, anchor='w')
Label(root, text=player.trials, fg=fg1, bg=bg1, font=('console', fontsize, 'bold')).place(x=x 80, y=y 50, width=100, anchor='w')
def new_word():
global letters
global input_word
input_word = 'TESTWORD'
letters = ['_' for _ in input_word]
display_letters()
renew_buttons()
show_stats()
root.mainloop()
uj5u.com熱心網友回復:
在time.sleep()完全掛程式。這可能就是原因。
因此,創建一個具有類似名稱的新函式,newword_start()并在其中添加以下兩件事:
time.sleep(1)
new_word()
然后在代碼的最開始,添加import threading as th.
然后在make_guess()函式中, after if '_' not in letters...,newword_start()像這樣呼叫函式:
th.Thread(target=newword_start).start()
所以最終的代碼將是:
# Other modules
import threading as th
import time
# Your code
def newword_start():
time.sleep(1)
new_word()
class Player:
# Your code
def make_guess(self, letter):
# Your code again
if '_' not in letters: # Won?
self.score = 1
th.Thread(target=newword_start).start()
# Rest all code
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/327498.html
上一篇:固定大小的框架停留在視窗底部
下一篇:tkinter中的抖動邊界
