首先,我想提一下我一直在看视频,并尽力了解如何使线程工作,但我无法弄清楚。我希望有人可以在我的特殊情况下为我工作,我可以从中学习,或者至少让它对我有用。
我希望start_timer函数是一个线程进程,因此用户在运行此函数时仍然可以激活其他函数。
最终每个功能都会与tkinter中的一个按钮相关联,并将信息发送到我的覆盆子pi以控制我的花园浇水。
这是我的代码:
import time
class Valve:
def __init__(self, pin, location):
self.pin = pin
self.location = location
timer = 0
status = False
def turn_on(self):
self.status = True
self.send_info()
def turn_off(self):
self.status = False
self.send_info()
def set_timer(self, minutes):
self.timer = minutes * 60
def start_timer(self):
self.turn_on()
self.status = True
while self.timer > 0:
print(self.timer)
self.timer -= 1
time.sleep(1)
self.turn_off()
def send_info(self):
print("sending this info to server:", self.pin, self.status)
hose1 = Valve(1, 'Garden')
hose2 = Valve(2, 'Lawn')
hose1.set_timer(1)
hose1.start_timer()
hose2.turn_on()
我认为用下面的方法替换hose1.start_timer()会有效但是在执行hose2.turn_on()之前它仍会运行这个洞进程。
thread = threading.Thread(target=hose1.start_timer(), args=hose1.timer)
thread.start()
感谢能为我工作的人!
此外,如果有人对这个项目感兴趣,我很乐意让合作伙伴在创作过程中来回反复思考。
答案 0 :(得分:0)
你正在调试你的错误。
您需要使用
thread = threading.Thread(target=hose1.start_timer, args=(hose1.timer, ))
或
thread = threading.Thread(target=lambda: hose1.start_timer(), args=(hose1.timer,))
如果您希望线程在程序执行时退出,因为这是tkinter,那很可能是根窗口。
您可以使用thread.daemon = True
将该主题设置为守护程序,然后您可以调用thread.start()