在tkinter python中跨画布移动项目 我在画布上有2条垂直线,中间有一个空隙(每次都随机生成)。这一行从画布的右侧开始。当我单击“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() 随机导入 导入时间 从tkinter进口* window=Tk() 窗几何(“300x300”) 窗口标题(“GUI”) 窗口。可调整大小(FALSE,FALSE) label1=标签(窗口,text=“我的第一个GUI”,font=(“arial”,16,“粗体”)) 标签1.pack() canvas=canvas() canvas.config(bg=“gray”) 画布放置(宽度=300,高度=150,x=0,y=150) 按def键(事件): 如果event.char==“l”: 移动_行() def create_gap(): gap_ycoords=[] #10到95之间的随机数,以5为增量 第一行=random.randrange(10,96,5) gap\u ycoords.append(第一行\u end) 第二行开始=第一行结束+50 gap\u ycoords.append(第二行\u开始) 回程间隙 def绘制线障碍物(画布参考): y_coord=创建_间隙() top_line=画布参考创建_line(295,5295,y_coord[0],tags=“top_line”) 底线=画布参考创建底线(295,y坐标[1],295,145,tags=“底线”) 绘制障碍物(画布) def move_line(): 如果canvas.coords(“顶线”)[0]>5: tcoords=canvas.coords(“顶行”) bcoords=canvas.coords(“底线”) canvas.coords(“顶行”,tcoords[0]-5,tcoords[1],tcoords[2]-5,tcoords[3]) canvas.coords(“底线”,bcoords[0]-5,bcoords[1],bcoords[2]-5,bcoords[3]) window.bind(“”,按键) window.mainloop()

在tkinter python中跨画布移动项目 我在画布上有2条垂直线,中间有一个空隙(每次都随机生成)。这一行从画布的右侧开始。当我单击“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() 随机导入 导入时间 从tkinter进口* window=Tk() 窗几何(“300x300”) 窗口标题(“GUI”) 窗口。可调整大小(FALSE,FALSE) label1=标签(窗口,text=“我的第一个GUI”,font=(“arial”,16,“粗体”)) 标签1.pack() canvas=canvas() canvas.config(bg=“gray”) 画布放置(宽度=300,高度=150,x=0,y=150) 按def键(事件): 如果event.char==“l”: 移动_行() def create_gap(): gap_ycoords=[] #10到95之间的随机数,以5为增量 第一行=random.randrange(10,96,5) gap\u ycoords.append(第一行\u end) 第二行开始=第一行结束+50 gap\u ycoords.append(第二行\u开始) 回程间隙 def绘制线障碍物(画布参考): y_coord=创建_间隙() top_line=画布参考创建_line(295,5295,y_coord[0],tags=“top_line”) 底线=画布参考创建底线(295,y坐标[1],295,145,tags=“底线”) 绘制障碍物(画布) def move_line(): 如果canvas.coords(“顶线”)[0]>5: tcoords=canvas.coords(“顶行”) bcoords=canvas.coords(“底线”) canvas.coords(“顶行”,tcoords[0]-5,tcoords[1],tcoords[2]-5,tcoords[3]) canvas.coords(“底线”,bcoords[0]-5,bcoords[1],bcoords[2]-5,bcoords[3]) window.bind(“”,按键) window.mainloop(),python,tkinter,tkinter-canvas,Python,Tkinter,Tkinter Canvas,您需要使用。这基本上是每隔20毫秒调用一个函数 反复调用此函数将使其在按下“l”键一次时,该行将移动到屏幕的另一端 代码: 随机导入 导入时间 从tkinter进口* window=Tk() 窗几何(“300x300”) 窗口标题(“GUI”) 窗口。可调整大小(FALSE,FALSE) label1=标签(窗口,text=“我的第一个GUI”,font=(“arial”,16,“粗体”)) 标签1.pack() canvas=canvas() canvas.config(bg=“gray”)

您需要使用。这基本上是每隔20毫秒调用一个函数

反复调用此函数将使其在按下“l”键一次时,该行将移动到屏幕的另一端

代码:

随机导入
导入时间
从tkinter进口*
window=Tk()
窗几何(“300x300”)
窗口标题(“GUI”)
窗口。可调整大小(FALSE,FALSE)
label1=标签(窗口,text=“我的第一个GUI”,font=(“arial”,16,“粗体”))
标签1.pack()
canvas=canvas()
canvas.config(bg=“gray”)
画布放置(宽度=300,高度=150,x=0,y=150)
按def键(事件=无):
移动_行()
窗后(20,按键)
def create_gap():
gap_ycoords=[]
#10到95之间的随机数,以5为增量
第一行=random.randrange(10,96,5)
gap\u ycoords.append(第一行\u end)
第二行开始=第一行结束+50
gap\u ycoords.append(第二行\u开始)
回程间隙
def绘制线障碍物(画布参考):
y_coord=创建_间隙()
top_line=画布参考创建_line(295,5295,y_coord[0],tags=“top_line”)
底线=画布参考创建底线(295,y坐标[1],295,145,tags=“底线”)
绘制障碍物(画布)
def move_line():
如果canvas.coords(“顶线”)[0]>5:
tcoords=canvas.coords(“顶行”)
bcoords=canvas.coords(“底线”)
canvas.coords(“顶行”,tcoords[0]-5,tcoords[1],tcoords[2]-5,tcoords[3])
canvas.coords(“底线”,bcoords[0]-5,bcoords[1],bcoords[2]-5,bcoords[3])
window.bind(“”,按键)
window.mainloop()
在这一行:
窗口。按下(20,按键)
后,您可以将数字20更改为更高的值以移动得更慢,将数字20更改为更低的值以移动得更快


希望这有帮助

你太接近了!您的
move\u line
功能只需再增加一行:

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

这个问题在这里已经有了答案:首先使用
after()
定期移动线,直到线到达左端位置。其次,如果行仍在移动,则需要忽略该键。
event=”“
毫无意义。最好使用
event=None