Tkinter窗口不能很好地处理线程

2024-05-28 19:29:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个程序,它最终将通过串行方式从外部源接收数据,但我正在尝试首先开发显示端。在

我有一个“主”模块,有模拟的数据发送和接收。它更新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}$

任何想法都将不胜感激。在


Tags: the数据importiftimedefitclosing
2条回答

使tkinter更好地处理线程的一种方法是修改库,使所有方法调用都在单个线程上运行。另外两个问题处理同样的问题:Updating a TKinter GUI from a multiprocessing calculation和{a2}。反过来,给出的答案指向几个有助于解决您所面临问题的模块。每当我使用tkinter时,我总是使用safetkinter模块,以防线程对程序有帮助。在

你的标题很好地总结了这个问题:Tkinter不能很好地处理线程。这不是问题,这是答案。在

您只能从创建小部件的同一线程访问tkinter小部件。如果您想使用线程,您将需要您的非gui线程将数据放入队列,并让gui线程定期轮询队列。在

相关问题 更多 >

    热门问题