2015-04-17 33 views
0

我創建使用六個BS18D20溫度傳感器發動機溫度監測系統。我在網上發現了一個很棒的wxPython演示(速度計),演示了六種不同的風格測量儀。經過一番搗鼓之後,我轉換了框架和六個面板,以顯示我想要的具有所需溫度範圍的色帶的樣式表。調整框架時,Sizer也在工作。 溫度測量代碼也可以作爲獨立程序使用。鬥爭是 - 我怎樣才能實時顯示每個速度計面板的溫度值。wxPython的 - 速度表實時更新

# -*- 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.CallAfterwx.PostEvent的UI。

以下是相關信息的幾個環節: