我正在尝试读取一个非常慢的传感器(单线),同时仍在运行其他功能。我已经用3秒的睡眠替换了读取传感器。我想知道我是否可以在传感器(等待3秒)的同时同时打印每秒钟的准确时间。发生。这个线程的概念对我来说是新的。
import time
import threading
from tkinter import Tk
def events_every_second(): #update clock every second
right_now = time.strftime("%I:%M:%S %p")#("%H:%M:%S")
print("time is now",right_now)
root.after(1000, events_every_second)
def one_wire():
time.sleep(3)
print("one_wire loop")
root.after(3010, one_wire)
root = Tk()
t_one_wire = one_wire()
thread_one_wire = threading.Thread(target = t_one_wire)
thread_one_wire.start()
t_ees = events_every_second
thread_ees = threading.Thread(target = t_ees)
thread_ees.start()
root.mainloop()发布于 2020-04-04 23:02:44
您不应该使用root.after(3010,one_wire),这将导致您的Tk挂起3秒,并且不会更新。
你想为这个函数创建一个新的Thread,这样它就不会停止你的Tk应用程序。
def one_wire():
time.sleep(3)
print("one_wire_loop")为此函数创建一个新线程。
import threading
one_wire_thread = threading.Thread(target = one_wire, args = ())
one_wire_thread.start()注意,上面的代码只会运行你的函数一次。您可以创建一个包含while True:的包装器函数以保持其运行,在包装器函数中,您还可以检查停止和中断函数的条件,从而停止one_wire函数。您也可以在one_wire函数中执行此操作:
def one_wire():
while True:
time.sleep(3)
print("one_wire_loop")
if {"condition to stop reading sensor"}:
break发布于 2020-04-04 23:16:41
只有执行冗长的传感器读取的函数才需要在单独的线程中。您可以使用queue.Queue从其中获取数据-在下面的示例中,我在every_one_sec函数中插入了取值。
every_one_sec函数由Tkinter调度事件处理--不需要为它创建线程。
除此之外,代码中最不正确的部分是在t_one_wire = one_wire()中创建线程之前对tkinter进行完整的调用-事实上,它的运行也需要tkinter回调它。Tkinter希望在同一线程中运行所有事件--所以这会导致问题。
我希望下面的评论足以让你更好地理解
import time
import threading
from queue import Queue, Empty
from tkinter import Tk
def some_ui_code():
global stop_reading
stop_reading = True
def events_every_second(): #update clock every second
right_now = time.strftime("%I:%M:%S %p")#("%H:%M:%S")
print("time is now",right_now)
try:
result = queue.get(block=False)
except Empty:
result = None
if result is not None:
# code to display the result read from the sensor in tkinter interface goes here
...
# tkinter, not a separate thread, handles this
root.after(1000, events_every_second)
def one_wire(queue):
# this is handled in a separate thread, and "does not know" about tkinter at all
while not stop_reading:
result = call_to_read_sensor() # takes 3 seconds
queue.put(result)
print("one_wire loop")
time.sleep(0.1) # actual call to time.sleep to space sensor readings, if needed.
root = Tk()
stop_reading = False
queue = Queue()
# start events_every_second - tkinter will handle the subsequent calls with the `root.after` scheduling
events_every_second()
thread_one_wire = threading.Thread(target=t_one_wire, args=(queue,))
thread_one_wire.start()
root.mainloop()https://stackoverflow.com/questions/61003168
复制相似问题