Skip to content

Instantly share code, notes, and snippets.

@fmayer
Created September 30, 2010 14:33
Show Gist options
  • Save fmayer/604670 to your computer and use it in GitHub Desktop.
Save fmayer/604670 to your computer and use it in GitHub Desktop.
# Copyright (c) 2010 Florian Mayer <flormayer (at) aim (dot) com>
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
import sys
import time
import threading
from PyQt4 import QtGui, QtCore
def blocking(runinmain, parent):
time.sleep(2)
runinmain(
parent.inp.setText, ("Hello World", ), {}
)
class QTestWindow(QtGui.QMainWindow):
def __init__(self, crunner):
QtGui.QMainWindow.__init__(self)
main = QtGui.QVBoxLayout()
self.inp = QtGui.QTextEdit(self)
main.addWidget(self.inp)
threading.Thread(
target=blocking, args=(crunner.runInMainThread, self)
).start()
class CodeRunner(QtCore.QObject):
def __init__(self):
QtCore.QObject.__init__(self)
self.qobj = QtCore.QObject()
self.connect(
self.qobj,
QtCore.SIGNAL(
'runCode(PyQt_PyObject,PyQt_PyObject,PyQt_PyObject)'
),
self._runCode
)
@staticmethod
def _runCode(fun, args, kwargs):
fun(*args, **kwargs)
def runInMainThread(self, fun, args, kwargs):
self.qobj.emit(
QtCore.SIGNAL('runCode(PyQt_PyObject,PyQt_PyObject,PyQt_PyObject)'),
fun, args, kwargs
)
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
crunner = CodeRunner()
win = QTestWindow(crunner)
win.show()
app.exec_()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment