gpt4 book ai didi

python - 使用 Python 进行数据采集

转载 作者:太空宇宙 更新时间:2023-11-03 13:48:44 24 4
gpt4 key购买 nike

我正在从事一个使用 National Instruments 板进行数据采集的项目。我有用于执行任务的功能性 C 代码,但我想使用 Python,因此 GUI 编程不那么痛苦。在我的 C 代码中,我使用 API 调用 setTimer,它会定期引发 WM_TIMER 事件。 Tk 循环中是否有类似的机制?我尝试使用以下代码。

def DAQ(self):
if self.do_DAQ:
result = self.myDAQ.getData()
currTime = time.time() - self.start_time
self.time_label.config(text="{:.1f} seconds".format(currTime))
self.volt_label.config(text="{:.4f} volts".format(result))
self.time_data[self.i] = currTime
self.volt_data[self.i] = result
self.i += 1
self.after(1962, self.DAQ)

after() 中神奇的“1962”是通过反复试验确定的,它提供了大约 2 秒的延迟,但时间片会根据队列中的其他内容而漂移。有没有办法让我的时间片更准确?具体来说,我可以强制 Tk 在队列中的其他事情之前执行我的 DAQ 事件吗?

最佳答案

这是我在评论中谈论的内容的一个快速示例:

import Tkinter as tk
import threading
import random
import time
from Queue import Queue, Empty

root = tk.Tk()
time_label = tk.Label(root, text='<unknown> seconds')
volt_label = tk.Label(root, text='<unknown> volts')
time_label.pack()
volt_label.pack()

def DAQ(q):
while True:
q.put((time.time(), random.randrange(100)))
time.sleep(2)

def update_data(queue, root):
try:
timestamp, volts = queue.get_nowait()
except Empty:
pass
else:
time_label.config(text='{:.1f} seconds'.format(timestamp))
volt_label.config(text='{:.4f} volts'.format(volts))
root.after(100, update_data, queue, root)

data_queue = Queue()
t = threading.Thread(target=DAQ, args=(data_queue,))
t.daemon = True
t.start()
update_data(data_queue, root)
root.mainloop()

显然,上面的 DAQ() 函数只是真实事物的替代品。关键是,正如@ballsdotballs 在他们的回答中建议的那样,您可以在 DAQ 线程中以任何您想要的速率进行采样,将值添加到队列中,然后以更合适的速率更新 GUI。

关于python - 使用 Python 进行数据采集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13924015/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com