简体   繁体   English

tkinter 中 canvas 上的可点击圆圈

[英]clickable circle on canvas in tkinter

I was trying to create LUDO game in python for that I've created the coins using tkinter but now I'm unable to make it clickable button as it's int我试图在 python 中创建 LUDO 游戏,因为我已经使用 tkinter 创建了硬币,但现在我无法使其成为可点击按钮,因为它是 int

self.r1 = self.create_canvas.create_oval(67, 58, 91, 83, width = 3, fill = "#ff0000")

now help me this coin act as btn现在帮我这个coin充当btn

I want it to move when clicked.我希望它在单击时移动。

You can use canvas.tag_bind(tag, event, callback) to execute function (callback) when you click (event <Button-1> ) on item with selected tag or ID ( self.r1 )您可以使用canvas.tag_bind(tag, event, callback)来执行 function (回调)当您单击(事件<Button-1> )具有选定标签或 ID( self.r1 )的项目

Other method is to bind <Button-1> to canvas and later use event.x , event.y with canvas.find_overlapping(x, y, x+1, y+1) to find all item which overlap region (x, y, x+1, y+1) and check if self.r1 in list_with_overlaping其他方法是将<Button-1>绑定到 canvas 然后使用event.x , event.ycanvas.find_overlapping(x, y, x+1, y+1)找到所有重叠区域(x, y, x+1, y+1)并检查是否self.r1 in list_with_overlaping

You can use canvas.move(tag, offset_x, offset_y) or canvas.moveto(tag, x, y) to move object.您可以使用canvas.move(tag, offset_x, offset_y)canvas.moveto(tag, x, y)移动 object。


Minimal working code with both methods:两种方法的最小工作代码:

import tkinter as tk
import random

# --- functions ---

def on_canvas_click(event):
    print('on canvas click')

    print('event:', event)
    print('x, y :', event.x, event.y)
    overlaping = canvas.find_overlapping(event.x, event.y, event.x+1, event.y+1)
    print('overlaping:', overlaping)
    print('clicked:', circle_id in overlaping)
    
    if circle_id in overlaping:
        canvas.moveto(circle_id, random.randint(0, 500-24), random.randint(0, 500-25))
    
    print('-----')

def on_item_click(event):
    print('on item click')
    
    print('event:', event)
    print('x, y :', event.x, event.y)

    canvas.moveto(circle_id, random.randint(0, 500-24), random.randint(0, 500-25))

    print('-----')

# --- main ---

root = tk.Tk()

canvas = tk.Canvas(root, width=500, height=500)
canvas.pack()

canvas.bind('<Button-1>', on_canvas_click)

circle_id = canvas.create_oval(67, 58, 61+24, 58+25, width=3, fill="#ff0000")
canvas.tag_bind(circle_id, '<Button-1>', on_item_click)

root.mainloop()   

Doc from old effbot.org: The Tkinter Canvas Widget , Events and Bindings来自旧 effbot.org 的文档: Tkinter 画布小部件事件和绑定

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM