Найти - Пользователи
Полная версия: Потоки в PySide (PyQt)
Начало » GUI » Потоки в PySide (PyQt)
1
genus
Добрый день всем!
Недавно начал программировать GUI и столкнулся с проблемой того, что плохо понимаю, как работать с потоками. Представим себе следующий код:
import sys
from PySide import QtGui, QtCore
import time
def foo():
    time.sleep(1)
class mainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self)
        self.button = QtGui.QPushButton('Push', self)
        self.connect(self.button, QtCore.SIGNAL('clicked()'), QtGui.qApp, QtCore.SLOT('quit()'))
        self.timer = QtCore.QTimer()
        self.timer.timeout.connect(foo)
        self.timer.start(200)
app = QtGui.QApplication(sys.argv)
window = mainWindow()
window.show()
app.exec_()
Создаётся главное окно с кнопкой “Push”, при нажатии на которую программа закрывается. Одновременно начинает выполняться функция foo (предположим она выполняет какую-то важную работу в фоне).
Проблема в том, что программа зависает на время выполнения этой самой функции foo. Вроде бы она решается с помощью потоков, но я что-то совсем перестал понимать происходящее последнее время.

Буду очень признателен, если кто-нибудь откликнется
agalen
У тебя однопоточная программа, пока выполняется foo интерфейс откликаться не будет.
Для создания потоков см. модуль threading или используй QThread.
chudoff_a
чаще запускают в отдельном процессе, Qt не дружит с потоками .
reclosedev
chudoff_a
чаще запускают в отдельном процессе, Qt не дружит с потоками
Это еще почему?

Можно смело использовать QThread (посмотрите документацию). А вот с threading, из стандартной библиотеки, могут возникнуть проблемы с сигналами и т.п.

genus
при нажатии на которую программа закрывается.
Тогда нужно добавить:
QtGui.QApplication.setQuitOnLastWindowClosed(False)
до запуска цикла событий (app.exec_()), чтобы приложение не завершало работу при закрытии последнего окна.
genus
Спасибо за ответы!
reclosedev
chudoff_a
чаще запускают в отдельном процессе, Qt не дружит с потоками
Это еще почему?
Вот это как раз важный момент.
Насколько я понял, Tkinter (я изначально хотел писать на нём) не поддерживает потоки.


reclosedev
QtGui.QApplication.setQuitOnLastWindowClosed(False)
reclosedev, не совсем понял зачем это нужно? В моём коде просто иллюстрация с минимально работающим кодом, в реальности задача немного другая, конечно, но суть остаётся.
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