我想在画布上制作一个带有自定义移动小部件的 python tkinter 窗口来模拟运动。现在,我有一个画布和一个不动的椭圆形小部件。我在基层遇到问题;主循环()。我知道它在等待用户做某事时运行,但我很难看到:
如何控制/查看 mainloop() 正在重复的代码(在哪里,并且只有 tkinter?);
如果它自己不这样做,如何正确地中断它并从另一个函数返回它;
应该重申什么代码?所有 tkinter 对象,还是仅更新更改的对象?改用某种更新操作?最后;
tkinter.mainloop() 和 window.mainloop() 之间的功能区别是什么?也许前面的问题会回答。
我对 Swift 有一点经验,昨天晚上开始学习非常相似的 Python。我已经对我的代码尝试了可能数百种突变,目前处于测试阶段。我已经将所有内容移入和移出主循环的明显范围,甚至在屏幕上显示了数百个微小的 Python 窗口。一切都做两件事之一:什么都不做,或者给我一个错误。由于我什至不知道什么正在运行,或者它是否正在运行,所以我无法诊断任何东西。我的目标只是重复移动一个一百像素的圆圈。我已经四处寻找资源,但是——可能是我——一个明确的资源很少。我把我的代码都标记好了。此页面最接近我正在寻找的内容:在 Tkinter Canvas Widget 内移动球(简单的打砖块游戏). 一切似乎都在主循环之下。那么,每一次都重绘一切吗?不幸的是,这是我的整个剧本;我不能只展示碎片。由于某种原因,它只打开一个小窗口,而不是全屏窗口。(编辑:我似乎丢失了屏幕尺寸代码)
import tkinter
import time
# Initial values for circle's corners and start idicator ('b'):
x1 = 10
y1 = 10
x2 = 210
y2 = 210
b = 0
# Window ('window')
window = tkinter.Tk()
# Canvas ('area')
area = tkinter.Canvas(window, width=1368, height=650)
area.place(x=0, y=0)
# Ovals to be placed on 'area'
oval1 = area.create_oval(x1,y1,x2,y2,fill='#42befe')
oval2 = area.create_oval(100,10,300,210,fill='#d00000')
# Turns b to 1 to start shifting when 'butt' is pressed:
def startFunc():
b = 1
print('b = 1')
# My button to activate 'startFunc'
butt = tkinter.Button(window, text='Start movement', command=startFunc)
butt.pack()
# Adjusts the x and y coordinates when they are fed in:
def Shift(A, B, C, D):
print('Shift activated.')
window.after(1000)
print('Edit and return:')
A += 100
B += 100
C += 100
D += 100
return(A, B, C, D)
# Problems start about here: my Mainloop section;
# I have little idea how this is supposed to be.
while True:
if b == 1:
# Takes adjusted tuple
n = Shift(x1, y1, x2, y2)
print('Returned edited tuple.')
# Changes coordinates
x1 = n[0]
y1 = n[1]
x2 = n[2]
y2 = n[3]
print(f'{x1}, {y1}, {x2}, and {y2}')
# Reiterate moving oval
oval1 = area.create_oval(x1,y1,x2,y2,fill='#42befe')
#Does this re-run 'window' relations outside here, or only within the 'while'?
window.mainloop()
它应该显示一个 1368 x 650 的窗口,而不是一个很小的窗口。该按钮除了打印什么都不做,这意味着尽管有主循环,但最后的“while”没有运行。它希望它在“while”行内循环,这应该调整坐标并移动我的蓝色圆圈。迭代可能不会触及初始值,否则会重置它们。