同时运行两个python tkinter按钮

时间:2018-07-25 17:41:27

标签: python button tkinter

我有一个程序(整个项目是用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()

2 个答案:

答案 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)