我正在用六个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()
#
我将使用}。在
wx.Timer
在其事件处理程序中调用温度测量代码。如果temp代码需要一段时间才能返回,那么这将被视为一个长时间运行的进程,应该将其移到一个单独的线程中。然后,您可以调用线程来获取temp并使用wx的线程安全方法之一将它们返回给UI,例如wx.CallAfter
或{以下是一些相关信息的链接:
相关问题 更多 >
编程相关推荐