如何在Tkinter中实现按键按下时自动刷新窗口?
问题原因
你的代码仅在程序启动时生成了一次地图字符串并赋值给Label组件,后续按键操作仅修改了玩家坐标变量,既没有重新生成最新的地图内容,也没有更新Label的显示属性,因此界面不会发生变化。
解决方案
将地图渲染、界面更新的逻辑封装为独立函数,每次按键完成坐标修改后调用该函数触发界面刷新即可,修改后可直接运行的完整代码如下:
import tkinter as tk coordinates = { "x1y1": "#", "x1y2": "#", "x1y3": "#", "x1y4": "#", "x1y5": "#", "x1y6": "#", "x1y7": "#", "x1y8": "#", "x1y9": "#", "x1y10": "#", "x2y1": "#", "x2y2": "#", "x2y3": "#", "x2y4": "#", "x2y5": "#", "x2y6": "#", "x2y7": "#", "x2y8": "#", "x2y9": "#", "x2y10": "#", "x3y1": "#", "x3y2": "#", "x3y3": "#", "x3y4": "#", "x3y5": "#", "x3y6": "#", "x3y7": "#", "x3y8": "#", "x3y9": "#", "x3y10": "#", "x4y1": "#", "x4y2": "#", "x4y3": "#", "x4y4": "#", "x4y5": "#", "x4y6": "#", "x4y7": "#", "x4y8": "#", "x4y9": "#", "x4y10": "#", "x5y1": "#", "x5y2": "#", "x5y3": "#", "x5y4": "#", "x5y5": "#", "x5y6": "#", "x5y7": "#", "x5y8": "#", "x5y9": "#", "x5y10": "#", "x6y1": "#", "x6y2": "#", "x6y3": "#", "x6y4": "#", "x6y5": "#", "x6y6": "#", "x6y7": "#", "x6y8": "#", "x6y9": "#", "x6y10": "#", "x7y1": "#", "x7y2": "#", "x7y3": "#", "x7y4": "#", "x7y5": "#", "x7y6": "#", "x7y7": "#", "x7y8": "#", "x7y9": "#", "x7y10": "#", "x8y1": "#", "x8y2": "#", "x8y3": "#", "x8y4": "#", "x8y5": "#", "x8y6": "#", "x8y7": "#", "x8y8": "#", "x8y9": "#", "x8y10": "#", "x9y1": "#", "x9y2": "#", "x9y3": "#", "x9y4": "#", "x9y5": "#", "x9y6": "#", "x9y7": "#", "x9y8": "#", "x9y9": "#", "x9y10": "#", "x10y1":"#","x10y2": "#", "x10y3":"#", "x10y4":"#", "x10y5":"#", "x10y6":"#", "x10y7":"#", "x10y8":"#", "x10y9":"#", "x10y10":"#", } # 玩家初始位置 player_x = 5 player_y = 5 label = None # 刷新地图和界面的函数 def update_map(): # 重置所有地图格为# for coord_key in coordinates: coordinates[coord_key] = "# " # 计算当前玩家的坐标key player_coord = f"x{player_x}y{player_y}" coordinates[player_coord] = "@ " # 生成最新的地图字符串 world = "" i = 0 for item in coordinates.values(): world += f" {item}" i += 1 if i % 10 == 0: world += "\n" # 更新Label的显示内容 label.config(text=world) # 按键回调函数 def keypress_w(event): global player_x player_x -= 1 if player_x < 1: player_x += 1 update_map() def keypress_a(event): global player_y player_y -= 1 if player_y < 1: player_y += 1 update_map() def keypress_d(event): global player_y player_y += 1 if player_y > 10: player_y -= 1 update_map() def keypress_s(event): global player_x player_x += 1 if player_x > 10: player_x -= 1 update_map() # 初始化窗口 root = tk.Tk() label = tk.Label(root, text="") label.pack() # 绑定按键 root.bind("<w>", keypress_w) root.bind("<a>", keypress_a) root.bind("<s>", keypress_s) root.bind("<d>", keypress_d) # 初始化显示地图 update_map() root.mainloop()
额外说明
如果后续需要实现自动持续刷新(比如做NPC移动、动画效果等),可以在update_map()函数的末尾添加一行root.after(50, update_map),即可实现每隔50ms自动刷新一次界面,不需要依赖按键触发。
内容的提问来源于stack exchange,提问作者Zoler1337
相关产品推荐
相关产品推荐

