2015-04-17 2 views
0

Я создаю систему контроля температуры двигателя, используя шесть датчиков температуры BS18D20. Я нашел потрясающую демонстрацию wxPython (speedmeter) в Интернете, демонстрирующую шесть различных стилей. После некоторых попыток я преобразовал рамку и шесть панелей, чтобы показать мой предпочтительный макет стиля с цветовыми полосами для желаемых температурных диапазонов. Sizer также работает, когда я изменяю размер рамки. Код измерения температуры также работает как отдельная программа. Борьба в том, как я могу получить значения температуры, отображаемые на каждой панели скоростного счетчика в реальном времени.wxPython - updatemax реального времени

# -*- coding: utf-8 -*- 

import wx 
import wx.lib.buttons 
import time 
import os 
import glob 
import SpeedMeter as SM 
from math import pi, sqrt 
from datetime import datetime 
# This Is For Latin/Greek Symbols I Used In The Demo Only 
wx.SetDefaultPyEncoding('iso8859-1') 
# Get Some Icon/Data 
def GetMondrianData(): 
    return \ 
'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00 \x00\x00\x00 \x08\x06\x00\ 
\x00\x00szz\xf4\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\x00qID\ 
ATX\x85\xed\xd6;\n\x800\x10E\xd1{\xc5\x8d\xb9r\x97\x16\x0b\xad$\x8a\x82:\x16\ 
o\xda\x84pB2\x1f\x81Fa\x8c\x9c\x08\x04Z{\xcf\xa72\xbcv\xfa\xc5\x08 \x80r\x80\ 
\xfc\xa2\x0e\x1c\xe4\xba\xfaX\x1d\xd0\xde]S\x07\x02\xd8>\xe1wa-`\x9fQ\xe9\ 
\x86\x01\x04\x10\x00\\(Dk\x1b-\x04\xdc\x1d\x07\x14\x98;\x0bS\x7f\x7f\xf9\x13\ 
\x04\[email protected]\xf9X\xbe\x00\xc9 \x14K\xc1<={\x00\x00\x00\x00IEND\xaeB`\x82' 
# 
def GetMondrianBitmap(): 
    return wx.BitmapFromImage(GetMondrianImage()) 
# 
def GetMondrianImage(): 
    import cStringIO 
    stream = cStringIO.StringIO(GetMondrianData()) 
    return wx.ImageFromStream(stream) 
# 
def GetMondrianIcon(): 
    icon = wx.EmptyIcon() 
    icon.CopyFromBitmap(GetMondrianBitmap()) 
    return icon 
# Beginning Of SPEEDMETER Demo wxPython Code 
class SpeedMeterDemo(wx.Frame): 
    # 
    global meter1_val 
    global meter2_val 
    global meter3_val 
    global meter4_val 
    global meter5_val 
    global meter6_val 
    # 
    meter1_val = 0 
    # 
    def __init__(self): 
     wx.Frame.__init__(self, None, -1, "Cachalot II Engine Temperature Monitor", 
         wx.DefaultPosition, 
         size=(500,300), 
         style=wx.DEFAULT_FRAME_STYLE | 
         wx.NO_FULL_REPAINT_ON_RESIZE) 
# 
     self.SetIcon(GetMondrianIcon()) 
     self.statusbar = self.CreateStatusBar(2, wx.ST_SIZEGRIP) 
     self.statusbar.SetStatusWidths([-2, -1]) 
     # statusbar fields 
     statusbar_fields = [("Engine Temperature Monitor"), 
          ("Version 0.1")] 
     for i in range(len(statusbar_fields)): 
      self.statusbar.SetStatusText(statusbar_fields[i], i) 
     self.SetMenuBar(self.CreateMenuBar()) 
     panel = wx.Panel(self, -1) 
     sizer = wx.FlexGridSizer(2, 3, 2, 5) 
# 6 Panels To Hold The SpeedMeters ;-) 
     panel1 = wx.Panel(panel, -1, style=wx.SUNKEN_BORDER) 
     panel2 = wx.Panel(panel, -1, style=wx.RAISED_BORDER) 
     panel3 = wx.Panel(panel, -1, style=wx.SUNKEN_BORDER) 
     panel4 = wx.Panel(panel, -1, style=wx.RAISED_BORDER) 
     panel5 = wx.Panel(panel, -1, style=wx.SUNKEN_BORDER) 
     panel6 = wx.Panel(panel, -1, style=wx.RAISED_BORDER) 
# Speed Meter 1  
     self.SpeedWindow1 = SM.SpeedMeter(panel1, 
              extrastyle=SM.SM_DRAW_HAND | 
              SM.SM_DRAW_PARTIAL_SECTORS | 
              SM.SM_DRAW_SECONDARY_TICKS | 
              SM.SM_DRAW_MIDDLE_TEXT | 
              SM.SM_DRAW_MIDDLE_ICON | 
              SM.SM_ROTATE_TEXT 
             ) 
     self.SpeedWindow1.SetAngleRange(-pi/6, 7*pi/6) 
     intervals = range(0, 121, 10) 
     self.SpeedWindow1.SetIntervals(intervals) 
     colours = [wx.Colour(95, 118, 253)]*3 # Blue 
     colours.append(wx.Colour(51, 174, 48)) # Green 
     colours.append(wx.Colour(51, 174, 48)) # Green 
     colours.append(wx.Colour(51, 174, 48)) # Green   
     colours.append(wx.Colour(51, 174, 48)) # Green     
     colours.append(wx.Colour(247, 162, 9)) # yellow/red 
     colours.append(wx.Colour(247, 162, 9)) # yellow/red 
     colours.append(wx.Colour(244, 37, 6)) # red 
     colours.append(wx.Colour(244, 37, 6)) # red 
     colours.append(wx.Colour(244, 37, 6)) # red 
     self.SpeedWindow1.SetIntervalColours(colours) 
     ticks = [str(interval) for interval in intervals] 
     self.SpeedWindow1.SetTicks(ticks) 
     self.SpeedWindow1.SetTicksColour(wx.WHITE) 
     self.SpeedWindow1.SetTicksFont(wx.Font(8, wx.SWISS, wx.NORMAL, wx.NORMAL)) 
     self.SpeedWindow1.SetHandColour(wx.Colour(255, 255, 255)) #(255, 50, 0) 
     self.SpeedWindow1.SetSpeedBackground(wx.SystemSettings_GetColour(0))   
     self.SpeedWindow1.DrawExternalArc(False) 
     self.SpeedWindow1.SetShadowColour(wx.Colour(50, 50, 50)) 
     self.SpeedWindow1.SetMiddleText("Engine Output") 
     # Define The Icon We Want 
     icon = wx.Icon("temp.ico", wx.BITMAP_TYPE_ICO) 
     icon.SetWidth(10) # centre x axis 
     icon.SetHeight(-10) # below hand y axis 
     self.SpeedWindow1.SetMiddleIcon(icon)   
     self.SpeedWindow1.SetMiddleTextColour(wx.WHITE) 
     self.SpeedWindow1.SetMiddleTextFont(wx.Font(6, wx.SWISS, wx.NORMAL, wx.BOLD)) 
     self.SpeedWindow1.SetSpeedBackground(wx.Colour(0, 000, 000)) #(200, 200, 200) 
     self.SpeedWindow1.SetSpeedValue(0) 
# 
#---------------- snip snip ------------------------------------- 
# 
if __name__ == "__main__": 
    # 
    app = wx.PySimpleApp() 
    frame = SpeedMeterDemo() 
    frame.Show(True) 
    #frame.Maximize() 
    # 
    # 
    app.MainLoop() 
    # 

ответ

1

Я хотел бы использовать wx.Timer для вызова температуры измерения код в обработчик событий. Если временному коду требуется некоторое время для возврата, это считается долговременным процессом и должно быть перемещено в отдельный поток. Затем вы можете вызвать поток, чтобы получить временные параметры и вернуть их в пользовательский интерфейс, используя один из способов, безопасных для потоков wx, таких как wx.CallAfter или wx.PostEvent.

Вот несколько ссылок с соответствующей информацией:

Смежные вопросы