【问题标题】:tkinter canvas object tag_bindtkinter 画布对象 tag_bind
【发布时间】:2018-11-05 22:41:18
【问题描述】:

我不明白为什么我对下面代码中的 tag_bind 没有反应:只是想获得 tag_bind 的句柄以便稍后详细说明事件处理程序。什么都没有发生,tkinter 也没有抱怨。感谢您的帮助。

import tkinter as tk
root = tk.Tk()
size = input("Choose a grid size eg. 4, 7, 12 ...: ")
size = int(size)
def create_grid():
    d = 20                      
    x0 = 20                     
    x1 = x0 + d
    y0 = 20                     
    y1 = y0 + d
    for i in list(range(size)):
        for j in list(range(size)):
            row = i
            col = j
            id = cv.create_rectangle(x0, y0, x1, y1,
                                 tags="ALL",fill="white")
            x0 = x1
            x1 += d
        x0 = d
        x1 = x0 + d
        y0 = y1
        y1 = y0 + d 
    id = cv.create_oval(24, 24, 36, 36, tags=("ALL","oval"),fill="yellow")
def oval_move(event):
    print(event.keysym)
cv = tk.Canvas(root, bd=5, relief="groove")
cv.pack(fill="both", expand=True)
cv.bind('<Configure>', create_grid())
cv.focus_set()           # probably not needed
cv.tag_bind("oval", '<KeyPress-Down>', oval_move)
root.mainloop()

【问题讨论】:

    标签: object canvas tkinter tags bind


    【解决方案1】:

    “键盘焦点”允许 tkinter 知道将键事件发送到哪个对象。默认情况下,画布上的项目没有键盘焦点。所以,第一个问题是你的椭圆不会看到按键释放,因为它没有键盘焦点。

    第二个问题是画布上唯一可以接受键盘焦点的项目是文本项目。不可能将键盘事件附加到文本对象以外的单个画布项目。如果您希望非文本对象对键绑定做出反应,则必须将绑定作为一个整体放在画布上,然后为画布提供键盘焦点。

    【讨论】:

    • 好的。我在“cv.focus_set()”之前插入了“cv.bind('',oval_move),这就是处理程序做出反应的全部内容。但我没有也没有看到你的画布绑定要求指出记录在任何地方。无论如何,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-11
    • 2018-08-12
    相关资源
    最近更新 更多