#!/usr/bin/python import wx import time import threading segments = ( "1110111", "0010010", "1011101", "0111010", "1101011", "1101111", "1010010", "1111111", "1111101" ) ident = {"buttonSet":1, "buttonZeroPump":2, "buttonZeroTotals":3, "buttonNozzle1":4, "buttonNozzle2":5, "txtSet":6, "spinSet":7, "txtStatus":8, "txtConsolePetrol":9, "txtConsolePrice":10, "txtConsoletotalPetrolDispensed":11, "txtConsoleTotalTakings":12, "txtPumpPetrol":13, "txtPumpPrice":14, "txtPencePerLitre":15, "menuQuit":16, "menuAOT":17 } button = { ident["buttonSet"]:{"enable":False,"text":"set"}, ident["buttonZeroPump"]:{"enable":False,"text":"Zero Pump"}, ident["buttonZeroTotals"]:{"enable":False,"text":"Zero Totals"}, ident["buttonNozzle1"]:{"enable":True,"text":"Take Nozzle"}, ident["buttonNozzle2"]:{"enable":False,"text":"Squeese"}} config = {"fillrate":0.1, "spinrate":0.1, "runthread":0, "titlestart":"Peter's Phunkeh Petrol Pumps", "windowstyles":0, "segw":10, "segh":2 } pencePerLitre = 95.0 pencePerLitreBox = 95.0 pencePerLitreQueue = 0 petrolDispensed=0 totalTakings=0 totalPetrolDispensed=0 status = 'Ready' class Monitor(threading.Thread): def run(self): global config, petrolDispensed, status while config["runthread"]: petrolDispensed = petrolDispensed + 0.1 if(petrolDispensed >= 100): petrolDispensed = 100 status = "Out Of Use" button[ident["buttonNozzle1"]]["enable"] = False button[ident["buttonNozzle2"]]["enable"] = False button[ident["buttonNozzle1"]]["text"] = "blah" button[ident["buttonNozzle2"]]["text"] = "blah" config["runthread"] = 0 frame.UpdateUI() time.sleep(config["fillrate"]) class MyFrame(wx.Frame): def __init__(self, parent, id, title): self.MakeLayout(parent, id, title); self.MakeEventHandlers(); self.UpdateUI(); def MakeLayout(self, parent, id, title): self.ui = {} wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, (600, 400)) self.panel = wx.Panel(self, -1, style=wx.EXPAND) menubar = wx.MenuBar() options = wx.Menu() self.ui["menuAOT"] = options.Append(ident["menuAOT"], '&Always On Top', 'The window will always show above other windows', kind=wx.ITEM_CHECK) options.Append(ident["menuQuit"], '&Quit', 'Exit the application') menubar.Append(options, '&Options') self.SetMenuBar(menubar) heading = wx.Font(9, wx.NORMAL, wx.NORMAL, wx.BOLD) #--- TOP LEFT CONTENT --------------------------------------------------- self.ui["txtStatus"] = wx.StaticText(self.panel, ident["txtStatus"], "Ready"); self.ui["txtConsolePetrol"] = wx.StaticText(self.panel, ident["txtConsolePetrol"] , "0.0 litres") self.ui["txtConsolePrice"] = wx.StaticText(self.panel, ident["txtConsolePrice"] , "0.00") self.ui["txtConsoletotalPetrolDispensed"] = wx.StaticText(self.panel, ident["txtConsoletotalPetrolDispensed"] , "0.0 litres") self.ui["txtConsoleTotalTakings"] = wx.StaticText(self.panel, ident["txtConsoleTotalTakings"] , "0.00") a1cont = [ wx.StaticText(self.panel, -1, "Pump details"),wx.StaticText(self.panel, -1, ""), wx.StaticText(self.panel, -1, " Status:"),self.ui["txtStatus"], wx.StaticText(self.panel, -1, " Petrol dispensed:"),self.ui["txtConsolePetrol"], wx.StaticText(self.panel, -1, " Price:"),self.ui["txtConsolePrice"], wx.StaticText(self.panel, -1, "Today's totals"),wx.StaticText(self.panel, -1, ""), wx.StaticText(self.panel, -1, " Petrol:"),self.ui["txtConsoletotalPetrolDispensed"], wx.StaticText(self.panel, -1, " Takings:"),self.ui["txtConsoleTotalTakings"] ] #--- BOTTOM LEFT CONTENT ------------------------------------------------ self.ui["buttonSet"] = wx.Button(self.panel, ident["buttonSet"], "set",style=wx.EXPAND) self.ui["buttonSet"].SetMinSize((40, 26)) self.ui["txtSet"] = wx.TextCtrl(self.panel, ident["txtSet"], "%.1f" % pencePerLitre,style=wx.EXPAND) b1acont = [ wx.StaticText(self.panel, -1, "Pence per litre:",style=wx.EXPAND), self.ui["txtSet"], wx.SpinButton(self.panel, ident["spinSet"],style=wx.EXPAND), self.ui["buttonSet"] ] b1bcont = [ wx.Button(self.panel, ident["buttonZeroPump"], "Zero pump",style=wx.EXPAND), wx.Button(self.panel, ident["buttonZeroTotals"], "Zero today's totals",style=wx.EXPAND) ] #--- TOP RIGHT CONTENT -------------------------------------------------- #Build seven segs #self.ui["txtPumpPrice"] = wx.StaticText(self.panel, ident["txtPumpPrice"], "0.00") self.ui["txtPumpPrice"] = self.MakeDisplay(5,3,"7sPumpPrice") self.ui["txtPumpPetrol"] = wx.StaticText(self.panel, ident["txtPumpPetrol"], "0.0 litres") self.ui["txtPencePerLitre"]=wx.StaticText(self.panel, ident["txtPencePerLitre"], "%.1f" % pencePerLitre) c1cont = [ wx.StaticText(self.panel, -1, " Amount to pay:"), (self.ui["txtPumpPrice"], 1, wx.SHAPED, 0), wx.StaticText(self.panel, -1, " Petrol"), self.ui["txtPumpPetrol"], wx.StaticText(self.panel, -1, " Pence per litre"),self.ui["txtPencePerLitre"] ] #--- BOTTOM RIGHT CONTENT ----------------------------------------------- self.ui["buttonNozzle1"] = wx.ToggleButton(self.panel, ident["buttonNozzle1"], 'Take Nozzle',style=wx.EXPAND) self.ui["buttonNozzle1"].SetMinSize((128,32)) self.ui["buttonNozzle2"] = wx.ToggleButton(self.panel, ident["buttonNozzle2"], "Squeese",style=wx.EXPAND) self.ui["buttonNozzle2"].SetMinSize((128,32)) self.ui["buttonNozzle2"].Enable(False) d1cont = [self.ui["buttonNozzle1"],self.ui["buttonNozzle2"]] #--- MAIN LAYOUT -------------------------------------------------------- # Set up root sizer sizer0 = wx.GridSizer(2, 2, 0, 8) # Set up quadrants temp = wx.StaticBox( self.panel, id, "Console display" ) temp.SetFont(heading) sizera = wx.StaticBoxSizer( temp, wx.VERTICAL ) temp = wx.StaticBox( self.panel, id, "Console controls" ) temp.SetFont(heading) sizerb = wx.StaticBoxSizer( temp, wx.VERTICAL ) temp = wx.StaticBox( self.panel, id, "Pump display" ) temp.SetFont(heading) sizerc = wx.StaticBoxSizer( temp, wx.VERTICAL ) temp = wx.StaticBox( self.panel, id, "Pump controls" ) temp.SetFont(heading) sizerd = wx.StaticBoxSizer( temp, wx.VERTICAL ) #Set up lower-level sizers sizera1 = wx.GridSizer(9, 2, 3, 3) sizerb1 = wx.BoxSizer(wx.VERTICAL) sizerb1a = wx.BoxSizer(wx.HORIZONTAL) sizerb1b = wx.BoxSizer(wx.HORIZONTAL) sizerc1 = wx.GridSizer(3, 2, 3, 3) sizerd1 = wx.BoxSizer(wx.HORIZONTAL) #Add content to lower-level sizers sizera1.AddMany(a1cont) sizerb1.AddMany([sizerb1a, (sizerb1b,0,wx.ALIGN_CENTER_HORIZONTAL)]) sizerb1a.AddMany(b1acont) sizerb1b.AddMany(b1bcont) sizerc1.AddMany(c1cont) sizerd1.AddMany(d1cont) #Add lower-level sizers to quadrants sizera.Add(sizera1) sizerb.Add(sizerb1, flag=wx.EXPAND) sizerc.Add(sizerc1, 1, wx.EXPAND, 0) sizerd.Add(sizerd1, flag=wx.ALIGN_CENTER_HORIZONTAL) #Add quadrants to root sizer sizer0.Add(sizera, flag=wx.EXPAND) sizer0.Add(sizerc, flag=wx.EXPAND) sizer0.Add(sizerb, flag=wx.EXPAND) sizer0.Add(sizerd, flag=wx.EXPAND) #Setup main frame self.panel.SetSize(self.panel.GetEffectiveMinSize()) self.panel.SetSizer(sizer0) self.Centre() config["windowstyles"] = self.GetWindowStyleFlag() def UpdateDisplay(self, value, key): global segments print segments[int(str(value)[0])] def MakeDisplay(self, digits, point, key): self.ui[key] = {} #self.ui[key]["ref"] = wx.BoxSizer(wx.HORIZONTAL) #self.ui[key]["ref"] = wx.Panel(self.panel, -1, style=wx.SIMPLE_BORDER) print "digits: "+str(digits) seg1 = (5,1) seg2 = (1,5) seg3 = (1,1) seg4 = (5,5) width=(digits*4)+2 self.ui[key] = {"ref":wx.GridSizer(5, width, 5, 5),0:{},1:{},2:{},3:{},4:{}} for x in range(0,5): #rows switch = x % 2 ref1 = (3/2)*x ref2 = (3/2)*x-(1/2) ref3 = (3/2)*x+(1/2) for y in range(0,digits): #digits if(y==point): if(x<4): self.ui[key]["ref"].Add(wx.Panel(self.panel, -1)) #space self.ui[key]["ref"].Add(wx.Panel(self.panel, -1)) #space print " ", else: self.ui[key]["point"] = wx.Panel(self.panel, -1, size=seg3) self.ui[key]["point"] .SetBackgroundColour(wx.BLACK) self.ui[key]["ref"].Add(self.ui[key]["point"] ) #point self.ui[key]["ref"].Add(wx.Panel(self.panel, -1)) #space print ".", if(switch==0): self.ui[key]["ref"].Add(wx.Panel(self.panel, -1, size=seg3, style=wx.EXPAND)) #blank self.ui[key][y][ref1] = wx.Panel(self.panel, -1, size=seg1, style=wx.EXPAND) #self.ui[key][y][ref1].SetBackgroundColour(wx.BLACK) self.ui[key]["ref"].Add(self.ui[key][y][ref1]) #seg self.ui[key]["ref"].Add(wx.Panel(self.panel, -1, size=seg3, style=wx.EXPAND)) #blank self.ui[key]["ref"].Add(wx.Panel(self.panel, -1, size=seg3, style=wx.EXPAND)) #space print " - ", else: self.ui[key][y][ref2] = wx.Panel(self.panel, -1, size=seg2, style=wx.EXPAND) #self.ui[key][y][ref2].SetBackgroundColour(wx.BLACK) self.ui[key]["ref"].Add(self.ui[key][y][ref2]) #seg self.ui[key]["ref"].Add(wx.Panel(self.panel, -1, size=seg4, style=wx.EXPAND)) #blank self.ui[key][y][ref3] = wx.Panel(self.panel, -1, size=seg2, style=wx.EXPAND) #self.ui[key][y][ref3].SetBackgroundColour(wx.BLACK) self.ui[key]["ref"].Add(self.ui[key][y][ref3]) #seg self.ui[key]["ref"].Add(wx.Panel(self.panel, -1, size=seg2, style=wx.EXPAND)) #space print "| |", print self.UpdateDisplay(0.00, "7sPumpPrice") '''for x in range(0,digits): #row 1 if(x == point): print " ", print " - ", print for x in range(0,digits): #row 2 if(x == point): print " ", print "| |", print for x in range(0,digits): #row 3 if(x == point): print " ", print " - ", print for x in range(0,digits): #row 4 if(x == point): print " ", print "| |", print for x in range(0,digits): #row 5 if(x == point): print ".", print " - ", print ''' #for i in range(0,width*5): # for x in range '''for i in range(0, (digits*2)+1): switch = i % 2 if(switch==0): if(i == point*2): print "1" self.ui[key]["ref"].Add(wx.StaticBox( self.panel, -1, "---" )) else: print "2" self.ui[key]["ref"].Add(wx.StaticBox( self.panel, -1, "..." )) else: print "3" self.ui[key]["ref"].Add(wx.StaticBox( self.panel, -1, "|||" ))''' return self.ui[key]["ref"] def MakeEventHandlers(self): self.Bind(wx.EVT_BUTTON, self.OnSet, id=ident["buttonSet"]) self.Bind(wx.EVT_SPIN_UP, self.OnSetSpinUp, id=ident["spinSet"]) self.Bind(wx.EVT_SPIN_DOWN, self.OnSetSpinDown, id=ident["spinSet"]) self.Bind(wx.EVT_BUTTON, self.OnZeroPump, id=ident["buttonZeroPump"]) self.Bind(wx.EVT_BUTTON, self.OnZeroTotals, id=ident["buttonZeroTotals"]) self.Bind(wx.EVT_TOGGLEBUTTON, self.OnbuttonNozzle1, id=ident["buttonNozzle1"]) self.Bind(wx.EVT_TOGGLEBUTTON, self.OnbuttonNozzle2, id=ident["buttonNozzle2"]) self.Bind(wx.EVT_MENU, self.OnQuit, id=ident["menuQuit"]) self.Bind(wx.EVT_MENU, self.OnAOT, id=ident["menuAOT"]) def UpdateUI(self): temp_price = petrolDispensed * pencePerLitre / 100 if(petrolDispensed < 0.5 and config["runthread"]): temp_price = 0.5 * pencePerLitre / 100 #--- Console Display ---# self.ui["txtStatus"].SetLabel(status) self.ui["txtConsolePetrol"].SetLabel("%.1f litres" % petrolDispensed) self.ui["txtConsolePrice"].SetLabel("%.2f" % temp_price) self.ui["txtConsoletotalPetrolDispensed"].SetLabel("%.1f litres" % totalPetrolDispensed) self.ui["txtConsoleTotalTakings"].SetLabel("%.2f" % totalTakings) #--- Console Controls ---# self.ui["txtSet"].SetValue(str(pencePerLitreBox)) #--- Pump Display ---# #self.ui["txtPumpPrice"].SetLabel("%.2f" % temp_price) self.ui["txtPumpPetrol"].SetLabel("%.1f litres" % petrolDispensed) self.ui["txtPencePerLitre"].SetLabel("%.1f" % pencePerLitre) #--- Pump Controls ---# self.ui['buttonNozzle1'].Enable(button[ident["buttonNozzle1"]]["enable"]) self.ui['buttonNozzle2'].Enable(button[ident["buttonNozzle2"]]["enable"]) self.ui['buttonNozzle1'].SetLabel(button[ident["buttonNozzle1"]]["text"]) self.ui['buttonNozzle2'].SetLabel(button[ident["buttonNozzle2"]]["text"]) #---- Title ---# self.SetTitle(config["titlestart"]+" :: "+status) def OnQuit(self, event): print "quit" def OnAOT(self,event): if self.ui["menuAOT"].IsChecked(): self.SetWindowStyleFlag(config["windowstyles"]|wx.STAY_ON_TOP) else: self.SetWindowStyleFlag(config["windowstyles"]) def OnSet(self, event): global pencePerLitre, pencePerLitreQueue, pencePerLitreBox pencePerLitreBox = float(self.ui["txtSet"].GetValue()) if(pencePerLitreBox >= 0 and pencePerLitreBox < 199.9): if status == "Ready": pencePerLitre = float("%.1f" % float(pencePerLitreBox)) else: pencePerLitreQueue = "%.1f" % float(pencePerLitreBox) d = wx.MessageDialog(self, "As the pump isn't ready, the change in pence-per-litre will take effect when you next zero the pump", "Notice", wx.OK) d.ShowModal() d.Destroy() else: pencePerLitreBox = pencePerLitre d = wx.MessageDialog(self, "Pence Per Litre can only be set to values between 0 and 199.9", "Notice", wx.OK) d.ShowModal() d.Destroy() self.UpdateUI(); def OnSetSpinUp(self, event): global pencePerLitreBox pencePerLitreBox = pencePerLitreBox+config["spinrate"] self.UpdateUI(); def OnSetSpinDown(self, event): global pencePerLitreBox pencePerLitreBox = pencePerLitreBox-config["spinrate"] self.UpdateUI(); def OnZeroPump(self, event): global petrolDispensed, pencePerLitre, pencePerLitreQueue, totalPetrolDispensed, totalTakings, status if status == "In Use": d = wx.MessageDialog(self, "Pump cannot be zeroed until Nozzle is replaced", "Error", wx.OK | wx.ICON_ERROR) d.ShowModal() d.Destroy() else: button[ident["buttonNozzle1"]]["enable"] = True totalPetrolDispensed = totalPetrolDispensed + petrolDispensed totalTakings = petrolDispensed * pencePerLitre / 100 petrolDispensed = 0 status = "Ready" if pencePerLitreQueue: pencePerLitre = pencePerLitreQueue pencePerLitreQueue = 0; self.UpdateUI() def OnZeroTotals(self, event): global totalPetrolDispensed, totalTakings totalPetrolDispensed = 0 totalTakings = 0 self.UpdateUI() def OnbuttonNozzle1(self, event): global status if status == "In Use": button[ident["buttonNozzle2"]]["enable"] = False button[ident["buttonNozzle1"]]["text"] = "Take Nozzle" if petrolDispensed == 0: status = "Ready" else: status = "Out of Use" button[ident["buttonNozzle1"]]["enable"] = False else: button[ident["buttonNozzle1"]]["text"] = "Replace Nozzle" button[ident["buttonNozzle2"]]["enable"] = True status = "In Use" self.UpdateUI() def OnbuttonNozzle2(self, event): global config if config["runthread"]: config["runthread"]=0 button[ident["buttonNozzle2"]]["text"] = "Squeese" button[ident["buttonNozzle1"]]["enable"] = True else: config["runthread"]=1 thread = Monitor() thread.start() button[ident["buttonNozzle2"]]["text"] = "Unsqueese" button[ident["buttonNozzle1"]]["enable"] = False self.UpdateUI() app = wx.App(0) frame = MyFrame(None, -1, config["titlestart"]) frame.Show(True) app.MainLoop()