wxPython - speedmeter实时更新

时间:2015-04-17 10:46:56

标签: python wxpython raspberry-pi

我正在使用六个BS18D20温度探头创建发动机温度监控系统。我在网上找到了一个很棒的wxPython演示(速度计),演示了六种不同的样式量表。经过一番摆弄后,我将框架和六个面板转换成了我喜欢的样式尺,带有适合所需温度范围的色带。当我调整框架大小时,Sizer也在工作。 温度测量代码也可作为独立程序使用。斗争是 - 如何实时获取每个速度表面板中显示的温度值。

# -*- 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\x10@\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 个答案:

答案 0 :(得分:1)

我会使用wx.Timer在其事件处理程序中调用温度测量代码。如果临时代码需要一段时间才能返回,那么这被认为是一个长时间运行的进程,应该移动到一个单独的线程中。然后,您可以调用线程来获取临时值,并使用wx的线程安全方法之一将其返回到UI,例如wx.CallAfterwx.PostEvent

以下是一些相关信息的链接:

相关问题