我有一个程序(整个项目是用python编写的,并在Raspberry Pi上运行),该程序具有完整的tkinter前端。我有一些代码可以从传感器进行测量,并在单独的python文件中转动电机,并且一切正常。我遇到的问题是,此后端是由用户按下一个按钮启动的,但是在运行时他们无法按下另一个按钮。因此,这意味着他们也无法阻止它。我的问题是关于如何允许两个按钮同时运行。我已经尝试过使用处理能力低得多的程序做类似的事情,但是它仍然没有用,所以我知道那不是问题。
这是我做后端的方法:
# Some import statements
def run():
r = 0 # To ensure it will loop
x_angle = sensor.get_x_rotation()
print("The x angle is {}".format(x_angle))
while r == 0:
x_angle = sensor.get_x_rotation()
if x_angle < 0:
print("The x angle is now {}".format(x_angle))
motor.run_motor(direction="clockwise")
led.on()
sleep(0.5)
led.off()
elif x_angle > 0:
print("The x angle is currently {}".format(x_angle))
motor.run_motor(direction="anti")
led.on()
sleep(0.5)
led.off()
else:
print("The x angle is currently {}".format(x_angle))
led.on()
sleep(0.5)
led.off() `
有关我如何编写GUI的小片段
# import statements, a couple of variables, Some colour definitions
# buttons
S = a(top, bg=(green), text= "Start Program", font=("Segoe UI Black", 40), height="2", width="15", command=lambda: main.run())
C = a(top, bg=(red), text="Stop Program", font=("Segoe UI Black", 40), height="2", width="15", command=lambda: main.quit())
R = a(top, text="View Reports", font=("Segoe UI",20), height="2", width="30")
P = a(top, text="View Current Process", font=("Segoe UI",20), height="2", width="30")
H = a(top, text="Help", font=("Segoe UI",20), height="2", width="30", command=lambda: help())
Q = a(top, bg=(blue), text="Quit", font=("Segoe UI Black", 35), height="2", width="17", command=lambda: ensure())
S.pack()
C.pack()
R.pack()
P.pack()
H.pack()
Q.pack()
tkinter.tk.mainloop()
答案 0 :(得分:1)
您需要线程以“异步”运行程序的2个部分。未经测试的猜测:
from threading import Thread
def threaded_run():
t = Thread(target=main.run)
t.daemon = True
t.start()
S = a(top, bg=(green), text= "Start Program", font=("Segoe UI Black", 40), height="2", width="15", command=threaded_run)
根据函数的功能,集成main.quit可能会困难得多。如果将全局变量'r'设置为停止循环,则可以将其保留为原样。否则,您可能需要阅读一些线程教程以学习制作自己的Thread类。
答案 1 :(得分:0)
sleep()
和Tkinter不能一起使用。如果同时在单独的线程中使用,则只能同时使用sleep()
和Tkinter。这是after()
有用的地方,应该在这里为您工作。
sleep()
的问题在于它会冻结Tkinter实例,直到时间过去为止。当我们使用after()
时,我们要添加一个在一定时间后触发的事件,这样不会冻结mainloop()
。
我将root
用作您的tkinter实例名称,因此您需要将其设置为实例的名称。
尝试一下,让我知道是否有帮助。
def run():
r = 0 # To ensure it will loop
x_angle = sensor.get_x_rotation()
print("The x angle is {}".format(x_angle))
while r == 0:
x_angle = sensor.get_x_rotation()
if x_angle < 0:
print("The x angle is now {}".format(x_angle))
motor.run_motor(direction="clockwise")
led.on()
root.after(500, led.off)
elif x_angle > 0:
print("The x angle is currently {}".format(x_angle))
motor.run_motor(direction="anti")
led.on()
root.after(500, led.off)
else:
print("The x angle is currently {}".format(x_angle))
led.on()
root.after(500, led.off)