class StatusWorker(Thread): def __init__(self, main_window): Thread.__init__(self) self._main_window = main_window self.d = Datasource() self.d.token() self.start() def run(self): while True: result = self.d.action("status", {}) wx.PostEvent(self._main_window, ResultEvent(GET_STATUS_ID, result) ) time.sleep(1)
class DataWorker(Thread): def __init__(self, main_window): Thread.__init__(self) self._main_window = main_window self.d = Datasource() self.d.token() self.start() def run(self): while True: result = self.d.action("exchange_rate", {}) wx.PostEvent(self._main_window, ResultEvent(GET_EXCHANGE_RATE_ID, result) ) time.sleep(1)
class BitcoinATM(wx.App): def OnInit(self): self.res = xrc.XmlResource('gui.xrc') self.init_frame() self.d = Datasource() self.d.token() return True def init_frame(self): self.frame = self.res.LoadFrame(None, 'mainFrame') self.scanPanel = xrc.XRCCTRL(self.frame, 'scanPanel') self.insertPanel = xrc.XRCCTRL(self.frame, 'insertPanel') self.insertPanel.GetParent().GetSizer().Hide(self.insertPanel) self.insertPanel.GetParent().GetSizer().Layout() self.boughtPanel = xrc.XRCCTRL(self.frame, 'boughtPanel') self.boughtPanel.GetParent().GetSizer().Hide(self.boughtPanel) self.boughtPanel.GetParent().GetSizer().Layout() self.next_btn = xrc.XRCCTRL(self.scanPanel, 'next'); self.buy_btn = xrc.XRCCTRL(self.insertPanel, 'buy'); self.again_btn = xrc.XRCCTRL(self.boughtPanel, 'again'); self.service_status_label = xrc.XRCCTRL(self.scanPanel, 'service_status_label'); self.alert_bar = xrc.XRCCTRL(self.insertPanel, 'alert_bar') self.price_label = xrc.XRCCTRL(self.scanPanel, 'price_label') self.identity_textbox = xrc.XRCCTRL(self.scanPanel, 'identity') self.identity_textbox.SetFocus() self.amount_inserted_label = xrc.XRCCTRL(self.insertPanel, 'amount_inserted_label') self.qr_code_image = xrc.XRCCTRL(self.boughtPanel, 'qr_code_image') self.frame.Bind(wx.EVT_BUTTON, self.OnScanned, id=xrc.XRCID('next') ) self.frame.Bind(wx.EVT_BUTTON, self.OnBuy, id=xrc.XRCID('buy') ) self.frame.Bind(wx.EVT_BUTTON, self.OnAgain, id=xrc.XRCID('again') ) self.Connect(-1, -1, GET_EXCHANGE_RATE_ID, self.GetExchangeRate) self.Connect(-1, -1, GET_INSERTED_AMOUNT_ID, self.GetInsertedAmount) self.Connect(-1, -1, GET_STATUS_ID, self.GetServiceStatus) StatusWorker(self) DataWorker(self) self.frame.Show() def OnScanned(self, event): self.scanPanel.GetParent().GetSizer().Hide(self.scanPanel) self.scanPanel.GetParent().GetSizer().Layout() self.insertPanel.GetParent().GetSizer().Show(self.insertPanel) self.insertPanel.GetParent().GetSizer().Layout() try: self.acceptor = Acceptor(self) except IOError as e: print e except: raise def OnBuy(self, event): try: self.acceptor.abort() except AttributeError as e: print e # send request to bitcoin api and get bitcoin private key # amount = self.amount_inserted_label.GetLabel() result = self.d.action("exchange", {'amount': amount} ) if(result['meta']['code'] != 200): self.alert_bar.SetLabel(result['meta']['status']) self.alert_bar.SetForegroundColour("red"); else: self.CreateQR(result['wif']) self.insertPanel.GetParent().GetSizer().Hide(self.insertPanel) self.insertPanel.GetParent().GetSizer().Layout() self.boughtPanel.GetParent().GetSizer().Show(self.boughtPanel) self.boughtPanel.GetParent().GetSizer().Layout() self.amount_inserted_label.SetLabel("") def OnAgain(self, event): self.boughtPanel.GetParent().GetSizer().Hide(self.boughtPanel) self.scanPanel.GetParent().GetSizer().Layout() self.scanPanel.GetParent().GetSizer().Show(self.scanPanel) self.boughtPanel.GetParent().GetSizer().Layout() def CreateQR(self, string): qr = QRCode(version=1, box_size=3, border=1) qr.add_data(string) qr.make(fit=True) im = qr.make_image() qrfile = os.path.join("tmp", str(time.time() ) + ".png") image = open(qrfile, 'wb') im.save(image, "PNG") self.qr_code_image.SetBitmap(wx.BitmapFromImage(wx.Image(qrfile, wx.BITMAP_TYPE_ANY) ) ) def GetExchangeRate(self, event): self.price_label.SetLabel(str(event.data['exchange_rate']) ) def GetInsertedAmount(self, event): self.amount_inserted_label.SetLabel(str(event.data) ) def GetServiceStatus(self, event): self.service_status_label.SetLabel("Status: " + str(event.data['meta']['status']) ) if(event.data['meta']['code'] != 200): self.next_btn.Disable() self.buy_btn.Disable() self.again_btn.Disable()