from PyQt4.QtCore import *
import os.path
import time
-
+import traceback
+import sys
import threading
class WaitingDialog(QThread):
def __init__(self, parent, message, run_task, on_complete=None):
QThread.__init__(self)
+ self.parent = parent
self.d = QDialog(parent)
self.d.setWindowTitle('Please wait')
l = QLabel(message)
vbox = QVBoxLayout(self.d)
vbox.addWidget(l)
self.run_task = run_task
- if on_complete:
- self.d.connect(self.d, SIGNAL('done'), lambda: on_complete(*self.result))
+ self.on_complete = on_complete
+ self.d.connect(self.d, SIGNAL('done'), self.close)
self.d.show()
def run(self):
- self.result = self.run_task()
+ self.error = None
+ try:
+ self.result = self.run_task()
+ except Exception as e:
+ traceback.print_exc(file=sys.stdout)
+ self.error = str(e)
self.d.emit(SIGNAL('done'))
+
+ def close(self):
self.d.accept()
-
+ if self.error:
+ QMessageBox.warning(self.parent, _('Error'), self.error, _('OK'))
+ return
+
+ if self.on_complete:
+ self.on_complete(*self.result)
+
class Timer(QThread):
class HelpButton(QPushButton):
def __init__(self, text):
QPushButton.__init__(self, '?')
+ self.help_text = text
self.setFocusPolicy(Qt.NoFocus)
self.setFixedWidth(20)
- self.clicked.connect(lambda: QMessageBox.information(self, 'Help', text, 'OK') )
+ self.alt = None
+ self.clicked.connect(self.onclick)
+ def set_alt(self, func):
+ self.alt = func
+
+ def onclick(self):
+ if self.alt:
+ apply(self.alt)
+ else:
+ QMessageBox.information(self, 'Help', self.help_text, 'OK')
return hbox
def text_dialog(parent, title, label, ok_label, default=None):
+ from qrtextedit import QRTextEdit
dialog = QDialog(parent)
dialog.setMinimumWidth(500)
dialog.setWindowTitle(title)
l = QVBoxLayout()
dialog.setLayout(l)
l.addWidget(QLabel(label))
- txt = QTextEdit()
+ txt = QRTextEdit()
if default:
txt.setText(default)
l.addWidget(txt)
if __name__ == "__main__":
app = QApplication([])
- WaitingDialog(None, 'testing ...', lambda: [time.sleep(1)], lambda x: QMessageBox.information(None, 'done', "done", _('OK'))).start()
+ t = WaitingDialog(None, 'testing ...', lambda: [time.sleep(1)], lambda x: QMessageBox.information(None, 'done', "done", _('OK')))
+ t.start()
app.exec_()