Найти - Пользователи
Полная версия: Залипание GUI
Начало » GUI » Залипание GUI
1
baragoz
Всем здравствуйте!

Форма - 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 секунду, т.е. форма обновляется каждую секунду, а это медленно, кроме как в этом цикле оно не работает куда мне это дело прописать?

Заранее благодарю!
dimabest
решение единственное - в 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
baragoz
Спасибо огромное за примеры =)
Эх полез читать потоки.
Rodegast
> у меня в этом цикле (while quit:) таймер на 1 секунду, т.е. форма обновляется каждую секунду, а это медленно, кроме как в этом цикле оно не работает куда мне это дело прописать?

Как раз app.processEvents() нужен для таймера, если в теле цикла что то “тяжёлое”, то только тогда надо использовать потоки.
baragoz
Да уже разобрался, единственное чего не могу найти - как передать в поток с вычислениями данные из формы?
Получается два класса:
1 - класс формы Main(QtGui.QMainWindow);
2 - класс потока Thread(QtCore.QThread);
Пока не выходит наладить взаимодействие между ними - научился передавать данные из потока на форму, но не на оборот, посоветуете чего?
dimabest
http://python.su/forum/viewtopic.php?pid=61740#p61740
baragoz
Большое спасибо!
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