Найти - Пользователи
Полная версия: [PyQt] Вызов метода потока из GUI потока
Начало » GUI » [PyQt] Вызов метода потока из GUI потока
1
mironich
Как правильно это делать?
Если напрямую подкл. сигнал к слоту, то вызов происходит как будто в главном потоке…
Можно ли вызывать в Qthread.run и не костыль ли это: каждый раз Qthread.start дергать. ?
Просто сейчас примерный код такой код:
class MainForm(QWidget):
	signal = pyqtSignal(str)
	def __init__(self):
		QWidget.__init__(self)
		self.button = QPushButton(u'Запустить поток')
		self.button.clicked.connect(lambda: self.signal.emit('Нужная строка....'))
class WorckThread(QThread):
	arg_ = ''
	def method(self):
	    #Тут долгая блокирующая операция....
	def run(self):
	    if not self.isRunning():
		self.exec_()
	    self.method('Нужная строка....')
	    
		 
class Main(QApplication):
	def __init__(self):
	    .......
	    .......
	    .......
	    self.main_form = MainForm()
	    self.worckthread = WorckThread()
	
	def start_block_thread(self):
 	    self.worckthread.arg_ = 'Нужная строка....'
	    self.worckthread.run()
	    
if __name__ == '__main__':
	Main()
А хотелось бы:
		 
class Main(QApplication):
	def __init__(self):
	    .......
	    .......
	    .......
	    self.main_form = MainForm()
	    self.worckthread = WorckThread()
           self.main_form.button.connect( self.worckthread.method)

reclosedev

mironich
Можно ли вызывать в Qthread.run и не костыль ли это: каждый раз Qthread.start дергать. ?
Ничего плохого, просто каждый раз создается новый поток.
self.button.clicked.connect(self.worckthread.start)
Причем пока старый не завершился, start не даст создать новый.

mironich
А хотелось бы:
self.main_form.button.connect( self.worckthread.method)
Qt здесь не узнает к какому потоку относится method и в какую очередь сообщений это отправлять, поэтому соединяет сигнал напрямую.
Чтобы можно было соединять сигналы из разных потоков, нужен наследник QObject с методами. В документации Qthread как раз и рекомендуют это делать
http://qt-project.org/doc/qt-4.8/QThread.html#details
from PyQt4 import QtGui, QtCore
import time
 
class Worker(QtCore.QObject):
    def method1(self):
        print 'sleep in method1'
        time.sleep(5)
        print text
    
    def method2(self):
        print 'sleep in method2'
        time.sleep(5)
        print text
        
class MyWidget(QtGui.QWidget):
    def __init__(self, *args, **kwargs):
        super(MyWidget, self).__init__(*args, **kwargs)
        self.worker_thread = QtCore.QThread(self)
        self.worker = Worker()
        self.worker.moveToThread(self.worker_thread)
        self.worker_thread.start()
        
        button1 = QtGui.QPushButton("Start1", self)
        button2 = QtGui.QPushButton("Start2", self)
        button1.clicked.connect(self.worker.method1)
        button2.clicked.connect(self.worker.method2)
        
        layout = QtGui.QVBoxLayout(self)
        layout.addWidget(button1)
        layout.addWidget(button2)
         
app = QtGui.QApplication([])
widget = MyWidget()
widget.show()
app.exec_()
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB