如何为Python Tkinter卡片配对记忆游戏添加重置按钮
为Tkinter卡片记忆游戏添加重置功能
你只需要把游戏初始化逻辑封装为独立函数,再添加一个触发重置的按钮即可,不需要改动核心的配对判断逻辑,修改要点如下:
- 把全局状态重置、符号打乱、卡片按钮生成的逻辑从主流程抽离到
reset_game()函数中 - 重置时先销毁已存在的旧卡片按钮,避免界面控件堆叠
- 在界面预留位置添加重置按钮,绑定
reset_game()函数作为点击触发事件 - 游戏通关弹出提示后可自动触发重置,也可保留手动点击重置的入口
注意:原代码中
time.sleep()会阻塞Tkinter主线程刷新,修改版里替换为Tkinter原生的after()方法避免界面卡顿,不需要的话也可以改回原来的sleep写法。
修改后的完整可运行代码:
import random from tkinter import Tk, Button, DISABLED, messagebox def close_window(): root.destroy() def show_symbol(x, y): global first global previousX, previousY global moves global pairs buttons[x, y]['text'] = button_symbols[x, y] buttons[x, y].update_idletasks() if first: previousX = x previousY = y first = False moves = moves + 1 elif previousX != x or previousY != y: if buttons[previousX, previousY]['text'] != buttons[x, y]['text']: # 替换sleep为tkinter原生after避免界面卡死 def hide_cards(): buttons[previousX, previousY]['text'] = '' buttons[x, y]['text'] = '' root.after(500, hide_cards) else: buttons[previousX, previousY]['command'] = DISABLED buttons[x, y]['command'] = DISABLED pairs = pairs + 1 if pairs == len(buttons) / 2: messagebox.showinfo('Matching', f'完成!总步数: {moves}\n点击确定重新开始游戏') reset_game() first = True def reset_game(): global buttons, first, previousX, previousY, moves, pairs, button_symbols, symbols # 清空已有的卡片按钮 for btn in buttons.values(): btn.destroy() buttons = {} # 重置所有全局状态 first = True previousX = 0 previousY = 0 moves = 0 pairs = 0 button_symbols = {} # 重新打乱符号 symbols = [u'\u2702', u'\u2702', u'\u2705', u'\u2705', u'\u2708', u'\u2708', u'\u2709', u'\u2709', u'\u270A', u'\u270A', u'\u270B', u'\u270B', u'\u270C', u'\u270C', u'\u270F', u'\u270F', u'\u2712', u'\u2712', u'\u2714', u'\u2714', u'\u2716', u'\u2716', u'\u2728', u'\u2728', ] random.shuffle(symbols) # 重新生成卡片按钮,行号从1开始,给顶部重置按钮留位置 for x in range(6): for y in range(4): button = Button(command=lambda x=x, y=y: show_symbol(x, y), width=5, height=3, border=2) button.grid(column=x, row=y+1, padx=15, pady=10) buttons[x, y] = button button_symbols[x, y] = symbols.pop() root = Tk() root.title('Igra Memorije') root.resizable(width=False, height=False) buttons = {} # 添加重置按钮,放在界面顶部跨6列居中 reset_btn = Button(command=reset_game, text="重新开始", width=10, height=1) reset_btn.grid(column=0, row=0, columnspan=6, pady=10) # 初始化游戏 reset_game() root.mainloop()
修改后效果:
- 界面顶部新增重新开始按钮,任何时候点击都可以立刻重置游戏,重新打乱卡片、步数清零
- 配对成功通关弹出提示后,点击确定会自动重置游戏开始新局
- 修复了原代码中
time.sleep导致的界面无响应问题
内容的提问来源于stack exchange,提问作者Andrija Martinovic
相关产品推荐
相关产品推荐

