1
0
mirror of https://github.com/rzzzwilson/pymlac.git synced 2025-06-10 09:32:41 +00:00
2015-06-05 17:14:13 +07:00

166 lines
5.0 KiB
Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
The 'led16' widget.
Event attributes:
'state' - the current displayed value (int)
Instance methods:
Led16(parent, label, pos, led_on, led_off, *args, **kwargs)
parent owning widget
label label above leftmost led
pos position (x, y)
led_on image of led 'on' state
led_off image of led 'off' state
args ?
kwargs ?
SetState(state)
sets widget state, 'state' is a 16 bit value.
The widget will look like:
+-----------------------------------+
| <TopSpacer> |
<LeftSpacer>--> O O O O O O O O O O O O O O O O <---<RightSpacer>
| +-+-----+-----+-----+-----+-----+ |
| <BotSpacer> |
+-----------------------------------+
"""
import os
import wx
# layout 'constants'
print('os.name=%s' % str(os.name))
if os.name == 'nt':
LeftSpacer = 7 # left border
RightSpacer = 7 # right border
TopSpacer = 30 # space at top
TickSpacer = 30 # space down to ticks
BotSpacer = 0 # space at the bottom
elif os.name == 'posix':
LeftSpacer = 3 # left border
RightSpacer = 3 # right border
TopSpacer = 3 # space at top
TickSpacer = 10 # space down to ticks
BotSpacer = 3 # space at the bottom
else:
# TODO: Make it work on ???
raise Exception('Unrecognized platform: %s' % os.name)
################################################################################
# The 'Led16' widget
################################################################################
class Led16(wx.Panel):
"""A custom widget for showing 16 leds."""
def __init__(self, parent, led_on, led_off, background=None, **kwargs):
"""Initialize an Led16 object.
parent owning widget
led_on image of led 'on' state
led_off image of led 'off' state
background widget background colour
kwargs extra args for the panel
"""
print('Led16: background=%s' % str(background))
wx.Panel.__init__(self, parent, **kwargs)
if background is not None:
self.SetBackgroundColour(background)
self.led_on = led_on
self.led_off = led_off
led_width = led_on.GetWidth() # assume ON and OFF are same size image
led_height = led_on.GetHeight()
x = LeftSpacer
y = TopSpacer
mark_count = 2
self.ticks = [(x-17+led_width, y+led_height/2+5,
x-17+led_width, y+led_height/2+10)]
self.led_posn = []
# calculate positions of all 16 LEDs and construct ticks draw list
for i in range(16):
self.led_posn.append((x-1+i*17, y))
mark_count += 1
if mark_count >= 3:
mark_count = 0
self.ticks.append((x+i*17 + led_width, y+led_height/2+5,
x+i*17 + led_width, y+led_height/2+10))
first = self.ticks[0]
last = self.ticks[-1]
(fx1, fy1, fx2, fy2) = first
(lx1, ly1, lx2, ly2) = last
self.ticks.append((fx1, ly1+5, lx1, ly1+5))
self.set_value(0)
self.Bind(wx.EVT_PAINT, self.OnPaint)
self.Bind(wx.EVT_SIZE, self.OnSize)
def OnPaint(self, event):
# allow transparent colours
dc = wx.PaintDC(self)
dc = wx.GCDC(dc)
# draw 16 on/off LEDs
mask = 0x8000
for i in range(16):
posn = self.led_posn[i]
if self.value & mask:
wx.StaticBitmap(self, -1, self.led_on, pos=posn)
else:
wx.StaticBitmap(self, -1, self.led_off, pos=posn)
mask = mask >> 1
# draw the tick marks underneath the LEDs
dc.SetPen(wx.Pen('black', 1))
dc.DrawLineList(self.ticks)
def OnSize(self, event):
self.Refresh()
def set_value(self, value):
self.value = value
self.Refresh()
if __name__ == "__main__":
import sys
class MyApp(wx.App):
def OnInit(self):
frame = wx.Frame(None, -1, "Test Led16", size=(350, 75))
vbox = wx.BoxSizer(wx.VERTICAL)
led_on = wx.Image('images/led_on.png',
wx.BITMAP_TYPE_PNG).ConvertToBitmap()
led_off = wx.Image('images/led_off.png',
wx.BITMAP_TYPE_PNG).ConvertToBitmap()
self.led16 = Led16(frame, led_on, led_off, size=(300,100))
vbox.Add(self.led16)
vbox.Fit(frame)
frame.Show(True)
self.SetTopWindow(frame)
self.led16.set_value(012345)
return True
app = MyApp(0)
if len(sys.argv) > 1:
import wx.lib.inspection
wx.lib.inspection.InspectionTool().Show()
app.MainLoop()