Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 10, 2013 12:42:21

genus
Зарегистрирован: 2013-01-10
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Потоки в PySide (PyQt)

Добрый день всем!
Недавно начал программировать 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. Вроде бы она решается с помощью потоков, но я что-то совсем перестал понимать происходящее последнее время.

Буду очень признателен, если кто-нибудь откликнется

Офлайн

#2 Янв. 10, 2013 15:42:49

agalen
От:
Зарегистрирован: 2011-03-23
Сообщения: 185
Репутация: +  17  -
Профиль   Отправить e-mail  

Потоки в PySide (PyQt)

У тебя однопоточная программа, пока выполняется foo интерфейс откликаться не будет.
Для создания потоков см. модуль threading или используй QThread.



Офлайн

#3 Янв. 10, 2013 22:54:56

chudoff_a
Зарегистрирован: 2012-11-11
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Потоки в PySide (PyQt)

чаще запускают в отдельном процессе, Qt не дружит с потоками .

Офлайн

#4 Янв. 11, 2013 16:06:28

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Потоки в PySide (PyQt)

chudoff_a
чаще запускают в отдельном процессе, Qt не дружит с потоками
Это еще почему?

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

genus
при нажатии на которую программа закрывается.
Тогда нужно добавить:
QtGui.QApplication.setQuitOnLastWindowClosed(False)
до запуска цикла событий (app.exec_()), чтобы приложение не завершало работу при закрытии последнего окна.

Офлайн

#5 Янв. 11, 2013 18:05:14

genus
Зарегистрирован: 2013-01-10
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Потоки в PySide (PyQt)

Спасибо за ответы!

reclosedev
chudoff_a
чаще запускают в отдельном процессе, Qt не дружит с потоками
Это еще почему?
Вот это как раз важный момент.
Насколько я понял, Tkinter (я изначально хотел писать на нём) не поддерживает потоки.


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

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version