Форум сайта python.su
Всем здравствуйте!
Форма - 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)
Офлайн
решение единственное - в 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
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)
Офлайн
Спасибо огромное за примеры =)
Эх полез читать потоки.
Офлайн
> у меня в этом цикле (while quit:) таймер на 1 секунду, т.е. форма обновляется каждую секунду, а это медленно, кроме как в этом цикле оно не работает куда мне это дело прописать?
Как раз app.processEvents() нужен для таймера, если в теле цикла что то “тяжёлое”, то только тогда надо использовать потоки.
Онлайн
Да уже разобрался, единственное чего не могу найти - как передать в поток с вычислениями данные из формы?
Получается два класса:
1 - класс формы Main(QtGui.QMainWindow);
2 - класс потока Thread(QtCore.QThread);
Пока не выходит наладить взаимодействие между ними - научился передавать данные из потока на форму, но не на оборот, посоветуете чего?
Офлайн
Офлайн
Большое спасибо!
Офлайн