Python 需要线程某个函数

Python need to thread a certain function

首先我想说的是我一直在看视频并尽力了解如何使线程工作,但我无法弄清楚。我希望有人可以在我的特定情况下为我做这件事,我可以从中学习或者至少让它为我工作。

我希望 start_timer 函数是一个线程进程,这样用户在 运行 时仍然可以激活其他函数。

最终每个功能都将与 tkinter 中的一个按钮相关联,并将信息发送到我的 raspberry 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()

感谢任何能为我完成这项工作的人!

另外,如果有人对这个项目感兴趣,我希望有一个合作伙伴在创建这个项目的过程中来回交流想法。

你调用你的线程是错误的。

你需要使用

thread = threading.Thread(target=hose1.start_timer, args=(hose1.timer, ))

thread = threading.Thread(target=lambda: hose1.start_timer(), args=(hose1.timer,))

如果您希望线程在程序退出时退出,因为这是 tkinter,那很可能是根 window。

您可以使用 thread.daemon = True 将线程设置为守护进程,然后您可以调用 thread.start()