gpt4 book ai didi

Python Tkinter 坐标函数不会在循环内移动 Canvas 对象

转载 作者:行者123 更新时间:2023-12-01 05:45:43 28 4
gpt4 key购买 nike

我有一个函数,可以从文本文件中读取位置,解析它们,然后使用 coords 函数将相应的对象移动到 tkinter Canvas 上列出的位置。正在从文件中读取数据并正确解析数据,但由于某种原因,coords 函数仅将对象移动到循环的最后一次迭代中文件中列出的最后位置。

我是否需要在每次循环迭代后以某种方式更新 Canvas ?谢谢!

这是我的代码:

def playback():
fptr = tkFileDialog.askopenfilename()
filename = open(fptr,"rU")
if not filename:
return

stat.set('REPLAY IN PROGRESS')
gamestatus[0] = 2
for line in filename:
line = line.strip()

#Example line from input file: 'B:#,#,#,#|L:#,#,#,#|R:#,#,#,#'
line = line.split('|')
B_loc = line[0].split(':')[1].split(',')
L_loc = line[1].split(':')[1].split(',')
R_loc = line[2].split(':')[1].split(',')

#Converting strings to ints and lists to tuples to simplify code below
B_tup=(int(B_loc[0]),int(B_loc[1]),int(B_loc[2]),int(B_loc[3]))
L_tup=(int(L_loc[0]),int(L_loc[1]),int(L_loc[2]),int(L_loc[3]))
R_tup=(int(R_loc[0]),int(R_loc[1]),int(R_loc[2]),int(R_loc[3]))

#Moving objects to locations from input file
playingField.coords(pongball.ball,B_tup)
playingField.coords(leftpaddle.paddle,L_tup)
playingField.coords(rightpaddle.paddle,R_tup)
time.sleep(.02)

filename.close()
gamestatus[0] = 0
stat.set('-------Pong-------')

最佳答案

GUI 开发中一个非常好的经验法则是永远不要调用 sleep。这会卡住 GUI,即使只是几毫秒,这仍然是一个不好的做法。

在 Tkinter 中制作动画的正确方法是编写一个显示单个帧的函数,然后使用 after 重新安排自身。这允许事件循环在执行动画时不断地为事件提供服务。

例如,将 for 语句的整个主体(减去 sleep)放入一个方法中。我们称之为“刷新”。让这个函数使用 after 重新调度自身,如下所示:

def refresh():
line = get_next_line()
line = line.split('|')
B_loc = line[0].split(':')[1].split(',')
...

# call this function again in 20ms
root.after(20, refresh)

现在您需要做的就是将 get_next_line 实现为函数,然后就完成了。这将自动允许 GUI 在每次更新坐标时重新绘制自身。

当然,您需要检查输入何时耗尽,并且您可能希望用户可以通过请求动画停止的按钮设置一个标志,等等。

关于Python Tkinter 坐标函数不会在循环内移动 Canvas 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16220638/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com