All pastes #896136 Raw Edit

Untitled

public python v1 · immutable
·published 2008-02-08 11:44 UTC
rendered paste body
#!/usr/bin/pythonimport wximport timeimport threadingsegments = ("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.0pencePerLitreBox = 95.0pencePerLitreQueue = 0petrolDispensed=0totalTakings=0totalPetrolDispensed=0status = '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()