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

tkinter中canvas.grid布局时bind绑定失效报错,canvas.pack正常求解决

Tkinter Canvas绑定鼠标点击报错的修复方案

问题本质

你遇到的_tkinter.TclError: bad event type or keysym "button"错误,和使用grid还是pack布局无关,核心原因是事件绑定格式错误:Tkinter对事件名称大小写敏感,你写的<button-1>是非法格式,正确的鼠标左键点击事件应该是<Button-1>(首字母大写B)。

修复步骤

  1. 修正事件绑定语句的格式,将<button-1>改为<Button-1>
  2. 同步修正代码中的缩进问题(原代码部分语句缩进层级错误,会导致运行报错)

完整修正后的代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 06:31:21