在 tkinter python 中跨 canvas 移动项目

Move item across canvas in tkinter python

我在 canvas 上有 2 条垂直线,中间有一个空隙(每次随机生成)。此行从 canvas 的右侧开始。当我单击“l”键时,它会运行一个将线向左移动 5 的函数,您可以一直单击“l”直到它到达左侧。我想知道如何设置它,所以我只需按一次“l”键,线条就会在屏幕上缓慢移动,直到到达左侧。任何帮助将不胜感激

import random
import time
from tkinter import *


window = Tk()
window.geometry("300x300")
window.title("GUI")
window.resizable(FALSE, FALSE)

label1 = Label(window, text="My First GUI", font=("arial", 16, "bold"))
label1.pack()
canvas = Canvas()
canvas.config(bg="gray")
canvas.place(width=300, height=150, x=0, y=150)


def key_pressed(event):
    if event.char == "l":
        move_line()


def create_gap():
    gap_ycoords = []
    # random number between 10 and 95 in increments of 5
    first_line_end = random.randrange(10, 96, 5)
    gap_ycoords.append(first_line_end)
    second_line_start = first_line_end + 50
    gap_ycoords.append(second_line_start)
    return gap_ycoords


def draw_line_obstacle(canvas_ref):
    y_coord = create_gap()
    top_line = canvas_ref.create_line(295, 5, 295, y_coord[0], tags="top_line")
    bottom_line = canvas_ref.create_line(295, y_coord[1], 295, 145, tags="bottom_line")


draw_line_obstacle(canvas)


def move_line():
    if canvas.coords("top_line")[0] > 5:
        tcoords = canvas.coords("top_line")
        bcoords = canvas.coords("bottom_line")
        canvas.coords("top_line", tcoords[0] - 5, tcoords[1], tcoords[2] - 5, tcoords[3])
        canvas.coords("bottom_line", bcoords[0] - 5, bcoords[1], bcoords[2] - 5, bcoords[3])


window.bind("<Key>", key_pressed)

window.mainloop()

您需要使用 .after()。这基本上每 20 毫秒调用一个函数。

重复调用此函数,当您按一次“l”键时,该行将移动到屏幕的另一端。

代码:

import random
import time
from tkinter import *


window = Tk()
window.geometry("300x300")
window.title("GUI")
window.resizable(FALSE, FALSE)

label1 = Label(window, text="My First GUI", font=("arial", 16, "bold"))
label1.pack()
canvas = Canvas()
canvas.config(bg="gray")
canvas.place(width=300, height=150, x=0, y=150)


def key_pressed(event = None):
    move_line()
    window.after(20, key_pressed)




def create_gap():
    gap_ycoords = []
    # random number between 10 and 95 in increments of 5
    first_line_end = random.randrange(10, 96, 5)
    gap_ycoords.append(first_line_end)
    second_line_start = first_line_end + 50
    gap_ycoords.append(second_line_start)
    return gap_ycoords


def draw_line_obstacle(canvas_ref):
    y_coord = create_gap()
    top_line = canvas_ref.create_line(295, 5, 295, y_coord[0], tags="top_line")
    bottom_line = canvas_ref.create_line(295, y_coord[1], 295, 145, tags="bottom_line")


draw_line_obstacle(canvas)


def move_line():
    if canvas.coords("top_line")[0] > 5:
        tcoords = canvas.coords("top_line")
        bcoords = canvas.coords("bottom_line")
        canvas.coords("top_line", tcoords[0] - 5, tcoords[1], tcoords[2] - 5, tcoords[3])
        canvas.coords("bottom_line", bcoords[0] - 5, bcoords[1], bcoords[2] - 5, bcoords[3])


window.bind("<l>", key_pressed)

window.mainloop()

在这一行:window.after(20, key_pressed),您可以将数字 20 更改为更高的值以移动得更慢,更改为更低的值以移动得更快。

希望对您有所帮助!

你太接近了! move_line 函数只需要多一行:

def move_line():
    if canvas.coords("top_line")[0] > 5:
        ... # other code
        canvas.after(100, move_line) # delay in ms, lower=faster movement