Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 28, 2010 22:39:53

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

Залипание GUI

Всем здравствуйте!

Форма - QWidget.

На событие нажатия кнопки установил вызов функции. Эта функция включает в себя цикл while quit:. Цикл выполняется, пока пока переменная quit равна единице (в ноль ее устанавливает другая кнопка формы). Задача состоит в том, что при нажатии на кнопку с циклом, форма зависает полностью. Пробовал добавлять в цикл self.update(), что по моим подозрениям должно было обновить форму… Не обновило. Кнопка остается в событии onclicked() как я понимаю.

Подскажите куда копать. Не откажусь и от примеров “на пальцах” =)
Очень хотелось бы узнать про правильную реализацию:

1.одной кнопкой запускается функция на выполнение.
2.в функции происходят действия с элементами формы (обновление, добавление элементов и т.д.)
3.другой (или той же самой) кнопкой завершается выполнение этой функции.

форум и гугл курил, ни чего не нашел.
Про update() QWidget'а читал в официальной документации http://doc.crossplatform.ru/qt/4.3.2/qwidget.html.

Заранее спасибо!

——–ADD——-

Блиныч очепятался в названии темы - ЗалиПание =)

——–ADD——-

Я наверное тупой вопрос задал… Ну киньте ссылку чтоли, сам разберусь.

——–ADD——-

Нашел. Если кто по такому же вопросу наткнется на эту тему втыкайте app.processEvents() в функцию с долгой процедурой (которая вешает форму), где app = QtGui.QApplication(sys.argv)

Снова обращаюсь к форумчанам. Одной задачей стало меньше, но следом появилась вторая - у меня в этом цикле (while quit:) таймер на 1 секунду, т.е. форма обновляется каждую секунду, а это медленно, кроме как в этом цикле оно не работает куда мне это дело прописать?

Заранее благодарю!



Отредактировано (Дек. 29, 2010 00:52:40)

Офлайн

#2 Дек. 29, 2010 01:49:55

dimabest
От:
Зарегистрирован: 2009-02-12
Сообщения: 253
Репутация: +  0  -
Профиль   Отправить e-mail  

Залипание GUI

решение единственное - в onclick-функции создать поток (наследник от QThread), передав ему параметром флаг quit.

def onclick(self):
self.thread = MyThread(self.quit)
QObject.connect(self.thread, SIGNAL('my_signal_1(PyQt_PyObject)'), self.signal_1)
QObject.connect(self.thread, SIGNAL('my_signal_2(PyQt_PyObject)'), self.signal_2)
# и т.д.
self.thread.start()

def signal_1(self, data):
# data - данные из потока
# можно обновлять GUI
Обновлять GUI из потока нельзя, поэтому поток будет только посылать сигналы с данными. На сигналы нужно подписать обработчики, которые данные будут получать и обновлять GUI.

В методе run() потока запустить свой while-цикл, и делать всякую полезную работу, при этом проверяя флаг quit.
class MyThread(QThread):
def __init__(self, quit):
QThread.__init__(self)
self.quit = quit

def run(self):
while self.quit:
# делаем работу
data = 10
# посылаем сигналы
self.emit(SIGNAL('my_signal_1(PyQt_PyObject)'), data)
Поток сам завершится, как только флаг quit установят в False



Офлайн

#3 Дек. 29, 2010 02:34:31

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

Залипание GUI

Спасибо огромное за примеры =)
Эх полез читать потоки.



Офлайн

#4 Дек. 29, 2010 22:45:58

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2756
Репутация: +  184  -
Профиль   Отправить e-mail  

Залипание GUI

> у меня в этом цикле (while quit:) таймер на 1 секунду, т.е. форма обновляется каждую секунду, а это медленно, кроме как в этом цикле оно не работает куда мне это дело прописать?

Как раз app.processEvents() нужен для таймера, если в теле цикла что то “тяжёлое”, то только тогда надо использовать потоки.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Онлайн

#5 Дек. 30, 2010 00:49:14

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

Залипание GUI

Да уже разобрался, единственное чего не могу найти - как передать в поток с вычислениями данные из формы?
Получается два класса:
1 - класс формы Main(QtGui.QMainWindow);
2 - класс потока Thread(QtCore.QThread);
Пока не выходит наладить взаимодействие между ними - научился передавать данные из потока на форму, но не на оборот, посоветуете чего?



Офлайн

#6 Дек. 30, 2010 02:03:52

dimabest
От:
Зарегистрирован: 2009-02-12
Сообщения: 253
Репутация: +  0  -
Профиль   Отправить e-mail  

Офлайн

#7 Дек. 30, 2010 09:18:58

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

Залипание GUI

Большое спасибо!



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version