簡體   English   中英

移動小部件 Canvas Tkinter

[英]Moving widgets in Canvas Tkinter

我有一個 canvas,里面有一個小橢圓。 它使用箭頭鍵在整個小部件中移動,但是當它位於 canvas 的邊緣時,如果我將它移到該邊緣之外,橢圓形就會消失。

我希望橢圓形停留在 canvas 的任何邊緣,無論我是否繼續按下與該邊緣對應的箭頭鍵而不會消失。

這是代碼:

from tkinter import *

root = Tk()
root.title("Oval")
root.geometry("800x600")

w = 600
h = 400
x = w//2
y = h//2

my_canvas = Canvas(root, width=w, height=h, bg='black')
my_canvas.pack(pady=20)

my_circle = my_canvas.create_oval(x, y, x+20, y+20, fill='cyan')


def left(event):
    x = -10
    y = 0
    my_canvas.move(my_circle, x, y)


def right(event):
    x = 10
    y = 0
    my_canvas.move(my_circle, x, y)


def up(event):
    x = 0
    y = -10
    my_canvas.move(my_circle, x, y)


def down(event):
    x = 0
    y = 10
    my_canvas.move(my_circle, x, y)



root.bind('<Left>', left)
root.bind('<Right>', right)
root.bind('<Up>', up)
root.bind('<Down>', down)

root.mainloop()

這是它的樣子:

邊上的橢圓

如果我繼續按下該鍵,則如下所示:

消失的橢圓

您可以測試當前坐標並將它們與您的 canvas 大小進行比較。 我創建了一個 function 來從你的橢圓形中獲取當前的 x1、y1、x2、y2。 這樣你就有了橢圓形邊界的坐標。

所以我所做的就是測試橢圓是否觸及邊界。

from tkinter import *

root = Tk()
root.title("Oval")
root.geometry("800x600")

w = 600
h = 400
x = w // 2
y = h // 2

my_canvas = Canvas(root, width=w, height=h, bg='black')
my_canvas.pack(pady=20)

my_circle = my_canvas.create_oval(x, y, x + 20, y + 20, fill='cyan')


def left(event):
    x1, y1, x2, y2 = get_canvas_position()
    if x1 > 0:
        x = -10
        y = 0
        my_canvas.move(my_circle, x, y)


def right(event):
    x1, y1, x2, y2 = get_canvas_position()
    if x2 < w:
        x = 10
        y = 0
        my_canvas.move(my_circle, x, y)


def up(event):
    x1, y1, x2, y2 = get_canvas_position()
    if y1 > 0:
        x = 0
        y = -10
        my_canvas.move(my_circle, x, y)


def down(event):
    x1, y1, x2, y2 = get_canvas_position()
    if y2 < h:
        x = 0
        y = 10
        my_canvas.move(my_circle, x, y)


def get_canvas_position():
    return my_canvas.coords(my_circle)


root.bind('<Left>', left)
root.bind('<Right>', right)
root.bind('<Up>', up)
root.bind('<Down>', down)

root.mainloop()

canvas object 通過兩組坐標[x1, y1, x2, y2]存儲。 您應該使用.coords()方法檢查對象的當前位置。 canvas object 的尺寸會影響坐標。

def left(event):
    x = -10
    y = 0
    if my_canvas.coords(my_circle)[0] > 0:  # index 0 is X coord left side object.
        my_canvas.move(my_circle, x, y)

def right(event):
    x = 10
    y = 0
    # The border collision now happens at 600 as per var "w" as previously defined above.
    if my_canvas.coords(my_circle)[2] < w:  # index 2 is X coord right side object.
        my_canvas.move(my_circle, x, y)

現在上下重復類似的過程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM