我有一个程序,它最终将通过串行方式从外部源接收数据,但我正在尝试首先开发显示端。在
我有一个“主”模块,有模拟的数据发送和接收。它更新Matplotlib条形图使用的全局。所有这些都有用。在
#-------------------------------------------------------------------------------
# Name: BBQData
# Purpose: Gets the data from the Arduino, and runs the threads.
#-------------------------------------------------------------------------------
import time
import math
import random
from threading import Thread
import my_globals as bbq
import sys
import BBQStripChart as sc
import serial
import BBQControl as control
ser = serial.serial_for_url('loop://', timeout=10)
def simData():
newTime = time.time()
if not hasattr(simData, "lastUpdate"):
simData.lastUpdate = newTime # it doesn't exist yet, so initialize it
simData.firstTime = newTime # it doesn't exist yet, so initialize it
if newTime > simData.lastUpdate:
simData.lastUpdate = newTime
return (140 + 0.05*(simData.lastUpdate - simData.firstTime), \
145 + 0.022*(simData.lastUpdate - simData.firstTime), \
210 + random.randrange(-10, 10))
else:
return None
def serialDataPump():
testCtr = 0;
while not bbq.closing and testCtr<100:
newData = simData()
if newData != None:
reportStr = "D " + "".join(['{:3.0f} ' for x in newData]) + '\n'
reportStr = reportStr.format(*newData)
ser.write(bytes(reportStr, 'ascii'))
testCtr+=1
time.sleep(1)
bbq.closing = True
def serialDataRcv():
while not bbq.closing:
line = ser.readline()
rcvdTime = time.time()
temps = str(line, 'ascii').split(" ")
temps = temps[1:-1]
for j, x in enumerate(temps):
bbq.temps[j].append(float(x))
bbq.plotTimes.append(rcvdTime)
def main():
sendThread = Thread(target = serialDataPump)
receiveThread = Thread(target = serialDataRcv)
sendThread.start()
receiveThread.start()
# sc.runUI()
control.runControl() #blocks until user closes window
bbq.closing = True
time.sleep(2)
exit()
if __name__ == '__main__':
main()
## testSerMain()
但是,我想添加一个单独的tkinter窗口,它只包含最新的数据,一个关闭按钮,等等。我可以让这个窗口出现,并显示最初的数据,但没有其他线程运行。(当我试图同时运行窗口和绘图时,没有任何效果。)
^{pr2}$任何想法都将不胜感激。在
使
tkinter
更好地处理线程的一种方法是修改库,使所有方法调用都在单个线程上运行。另外两个问题处理同样的问题:Updating a TKinter GUI from a multiprocessing calculation和{a2}。反过来,给出的答案指向几个有助于解决您所面临问题的模块。每当我使用tkinter
时,我总是使用safetkinter
模块,以防线程对程序有帮助。在你的标题很好地总结了这个问题:Tkinter不能很好地处理线程。这不是问题,这是答案。在
您只能从创建小部件的同一线程访问tkinter小部件。如果您想使用线程,您将需要您的非gui线程将数据放入队列,并让gui线程定期轮询队列。在
相关问题 更多 >
编程相关推荐