tshow waiting dialog during transaction broadcast - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit 69e68e9203af2c8c2d756eb1e9bc4ad7055db55b DIR parent 52211180ed5b0ea0aa056f4cdd3bff99df704338 HTML Author: ThomasV <thomasv@gitorious> Date: Sun, 14 Oct 2012 08:25:09 +0200 show waiting dialog during transaction broadcast Diffstat: M lib/gui_qt.py | 58 +++++++++++++++++-------------- M lib/wallet.py | 13 +++++++++++-- 2 files changed, 42 insertions(+), 29 deletions(-) --- DIR diff --git a/lib/gui_qt.py b/lib/gui_qt.py t@@ -168,6 +168,26 @@ class QRCodeWidget(QWidget): qp.end() +def waiting_dialog(f): + + s = Timer() + s.start() + w = QDialog() + w.resize(200, 70) + w.setWindowTitle('Electrum') + l = QLabel('') + vbox = QVBoxLayout() + vbox.addWidget(l) + w.setLayout(vbox) + w.show() + def ff(): + s = f() + if s: l.setText(s) + else: w.close() + w.connect(s, QtCore.SIGNAL('timersignal'), ff) + w.exec_() + w.destroy() + def ok_cancel_buttons(dialog): hbox = QHBoxLayout() t@@ -598,7 +618,10 @@ class ElectrumWindow(QMainWindow): self.show_message(str(e)) return - status, msg = self.wallet.sendtx( tx ) + h = self.wallet.send_tx(tx) + waiting_dialog(lambda: False if self.wallet.tx_event.isSet() else _("Please wait...")) + status, msg = self.wallet.receive_tx( h ) + if status: QMessageBox.information(self, '', _('Payment sent.')+'\n'+msg, _('OK')) self.do_clear() t@@ -1506,30 +1529,6 @@ class ElectrumGui: def server_list_changed(self): pass - def waiting_dialog(self): - - s = Timer() - s.start() - w = QDialog() - w.resize(200, 70) - w.setWindowTitle('Electrum') - l = QLabel('') - vbox = QVBoxLayout() - vbox.addWidget(l) - w.setLayout(vbox) - w.show() - def f(): - if self.wallet.up_to_date: - w.close() - else: - l.setText("Please wait...\nAddresses generated: %d\nKilobytes received: %.1f"\ - %(len(self.wallet.all_addresses()), self.wallet.interface.bytes_received/1024.)) - - w.connect(s, QtCore.SIGNAL('timersignal'), f) - self.wallet.interface.poke() - w.exec_() - w.destroy() - def restore_or_create(self): t@@ -1542,12 +1541,16 @@ class ElectrumGui: # ask for the server. if not ElectrumWindow.network_dialog( wallet, parent=None ): return False + waiting = lambda: False if wallet.up_to_date else "Please wait...\nAddresses generated: %d\nKilobytes received: %.1f"\ + %(len(wallet.all_addresses()), wallet.interface.bytes_received/1024.) + if not is_recovery: wallet.new_seed(None) wallet.init_mpk( wallet.seed ) wallet.up_to_date_event.clear() wallet.up_to_date = False - self.waiting_dialog() + wallet.interface.poke() + waiting_dialog(waiting) # run a dialog indicating the seed, ask the user to remember it ElectrumWindow.show_seed_dialog(wallet) #ask for password t@@ -1558,7 +1561,8 @@ class ElectrumGui: wallet.init_mpk( wallet.seed ) wallet.up_to_date_event.clear() wallet.up_to_date = False - self.waiting_dialog() + wallet.interface.poke() + waiting_dialog(waiting) if wallet.is_found(): # history and addressbook wallet.update_tx_history() DIR diff --git a/lib/wallet.py b/lib/wallet.py t@@ -795,10 +795,19 @@ class Wallet: return tx def sendtx(self, tx): - tx_hash = Hash(tx.decode('hex') )[::-1].encode('hex') + # synchronous + h = self.send_tx(tx) + self.tx_event.wait() + self.receive_tx(h) + + def send_tx(self, tx): + # asynchronous self.tx_event.clear() + tx_hash = Hash(tx.decode('hex') )[::-1].encode('hex') self.interface.send([('blockchain.transaction.broadcast', [tx])]) - self.tx_event.wait() + return tx_hash + + def receive_tx(self,tx_hash): out = self.tx_result if out != tx_hash: return False, "error: " + out