You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

time.sleep导致Tkinter石头剪刀布游戏未显示结果就暂停

Tkinter石头剪刀布游戏:实现结果显示后暂停1秒再允许操作

问题说明

我是Python新手,使用tkinter开发了一款石头剪刀布游戏。我希望在游戏结果显示后,暂停1秒再允许玩家再次操作,但无论将time.sleep(1)放在代码哪个位置,程序都会在结果显示前就进入暂停状态,无法达到预期效果。

问题原因

Tkinter是单线程GUI框架,time.sleep()会直接阻塞主事件循环,导致界面的更新操作(比如修改text_area的文本)无法立即生效,必须等sleep结束后才会刷新界面,所以看起来是先暂停再显示结果。

解决方案

使用Tkinter内置的after()方法替代time.sleep(),该方法可以在指定毫秒数后执行回调函数,不会阻塞主循环。同时需要在显示结果时禁用所有按钮,1秒后再重新启用,避免玩家在暂停期间重复操作。

修改后的完整代码

from tkinter import *
import random

# 游戏选项
game_variants = ("rock", "paper", "scissors")

# 用户选择变量
user_choise = ""

# 创建按钮选择函数
def rock():
    global user_choise
    user_choise = "rock"
    game()

def paper():
    global user_choise
    user_choise = "paper"
    game()

def scissors():
    global user_choise
    user_choise = "scissors"
    game()

# 启用所有按钮的函数
def enable_buttons():
    rock_button.config(state=NORMAL)
    paper_button.config(state=NORMAL)
    scissor_button.config(state=NORMAL)
    text_area.config(text="Choose a variant below:")

# 游戏规则逻辑
def game():
    global bot_choise
    global user_choise

    # 禁用按钮,防止重复点击
    rock_button.config(state=DISABLED)
    paper_button.config(state=DISABLED)
    scissor_button.config(state=DISABLED)

    # 电脑随机选择
    bot_choise = random.choice(game_variants)

    # 判断游戏结果并更新显示
    if bot_choise == user_choise:
        text_area.config(text="Tie!")
    elif (
            (bot_choise == "rock" and user_choise == "scissors") or
            (bot_choise == "paper" and user_choise == "rock") or
            (bot_choise == "scissors" and user_choise == "paper")
    ):
        text_area.config(text=f"You Lost!\nComputer chose {bot_choise} ")
    else:
        text_area.config(text=f"You won!\nComputer chose {bot_choise}")
    
    # 1秒后调用启用按钮的函数
    root.after(1000, enable_buttons)


# 创建窗口
root = Tk()
root.geometry("900x400")
root.title("Rock Paper Scissors game")

# 顶部显示标签
text_area = Label(text="Choose a variant below:", font=("consolas",22), height=3, width=55, bg="GREY", highlightthickness=3,
                      highlightbackground="yellow",)
text_area.pack()

# 按钮默认参数
button_height = 10
button_width = 24
font_and_size = "consolas", 15
bg_color = "#2d1a36"
fg_color = "brown"

# 创建框架用于放置按钮(避免pack和grid混用)
frame = Frame(root)
frame.pack()

# 创建选择按钮
rock_button = Button(frame, text="Rock",font=font_and_size,fg=fg_color, height=button_height,
                     width=button_width,bg=bg_color,
                     command=rock)
rock_button.grid(row=1,column=0, columnspan=1)
paper_button = Button(frame, text="Paper",font=font_and_size,fg=fg_color,height=button_height,
                      width=button_width,bg=bg_color, command=paper)
paper_button.grid(row=1, column=1)
scissor_button = Button(frame, text="Scissors",font=font_and_size, fg=fg_color, height=button_height,
                        width=button_width,bg=bg_color, command=scissors)
scissor_button.grid(row=1,column=2)

root.mainloop()

关键修改点

  • 移除time.sleep(),改用root.after(1000, enable_buttons),1000代表1000毫秒(即1秒),时间到后执行enable_buttons函数。
  • 添加enable_buttons函数,负责重新启用所有按钮并重置提示文本。
  • 在game()函数开头禁用所有按钮,避免玩家在暂停期间重复点击。

内容的提问来源于stack exchange,提问作者deightt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 00:01:03