tkinter中canvas.grid布局时bind绑定失效报错,canvas.pack正常求解决
Tkinter Canvas绑定鼠标点击报错的修复方案
问题本质
你遇到的_tkinter.TclError: bad event type or keysym "button"错误,和使用grid还是pack布局无关,核心原因是事件绑定格式错误:Tkinter对事件名称大小写敏感,你写的<button-1>是非法格式,正确的鼠标左键点击事件应该是<Button-1>(首字母大写B)。
修复步骤
- 修正事件绑定语句的格式,将
<button-1>改为<Button-1> - 同步修正代码中的缩进问题(原代码部分语句缩进层级错误,会导致运行报错)
完整修正后的代码
import tkinter as tk window = tk.Tk() window.title("project") window.geometry('760x560') window.resizable(False, False) def mouse_click_handler(event): # 获取鼠标点击坐标 x = event.x y = event.y # 注:原代码中screen_two.canvas和piece_color需自行提前定义,示例中暂用canvas和红色替代 canvas.create_oval(event.x - 15, event.y - 15, event.x + 15, event.y + 15, fill = "red", tags = ("show_piece")) canvas = tk.Canvas(window, bg = "green", width = 540, height = 540) canvas.grid(row = 0, column = 0, rowspan = 6) for i in range(15): # 绘制网格线 canvas.create_line(32, (35 * i + 38), 522, (35 * i + 38)) canvas.create_line((35 * i + 32), 38, (35 * i + 32), 528) point_X = [3, 3, 11, 11, 7] point_Y = [3, 11, 3, 11, 7] for i in range(5): # 绘制天元和星位 canvas.create_oval(35 * point_X[i] + 28, 35 * point_Y[i] + 33, 35 * point_X[i] + 36, 35 * point_Y[i] + 41, fill = "black") count = 0 for i in range(15): label1 = tk.Label(canvas, text = str(i+1), fg = "black", bg = "green") label2 = tk.Label(canvas, text = str(i+1), fg = "black", bg = "green") label1.place(x = 35 * count + 25, y = 2) label2.place(x = 2, y = 35 * count + 25) count += 1 # 修正后的事件绑定语句 canvas.bind("<Button-1>", mouse_click_handler) window.mainloop()
内容的提问来源于stack exchange,提问作者nobrainjobs
相关产品推荐
相关产品推荐

