Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » Передача информации в основной поток PyQt4 [RSS Feed]

#1 Июль 19, 2014 21:08:27

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

Передача информации в основной поток PyQt4

Здравствуйте, уважаемые коллеги. Возникла проблема: писал модуль, сделал GUI, написал Scrapy паука, но не могу передать информацию в основной поток GUI.

При разработке использовал модуль SimpleThread (http://habrahabr.ru/post/125699/) и запрограммировал кнопку в другой поток (чтобы Гуй не зависал при работе). Но не могу передать информацию в QLabel.

Разумеецо, использовал СЛОТ-СИГНАЛ:

from PyQt4 import QtCore
 
@QtCore.pyqtSlot(object)
def saySomething(stuff):
    print stuff
 
class Communicate(QtCore.QObject):
    speak = QtCore.pyqtSignal(object)
 
someone = Communicate()
someone.speak.connect(saySomething)
someone.speak.emit("Test text!")

Сигнал отправляется (если просто прописать print text, то текст отобразится, но вот self.ui.output.setText(text) не работает. Может ли кто-нибудь сказать почему?

Как отправить сигнал с параметром в основной поток GUI?

Отредактировано Razor (Июль 19, 2014 21:09:08)

Офлайн

#2 Июль 19, 2014 22:57:56

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9874
Репутация: +  854  -
Профиль   Отправить e-mail  

Передача информации в основной поток PyQt4

Razor
Но не могу передать информацию в QLabel.
Razor
Как отправить сигнал с параметром

#!/usr/bin/env python3
 
# Посылает сигнал с числами,
# формируя текст для метки
 
"""
Based on ZetCode PyQt4 tutorial
"""
 
import sys
from PyQt4 import QtGui, QtCore
 
 
class Example(QtGui.QWidget):
 
    changeLabel = QtCore.pyqtSignal(int, int)
 
    def __init__(self):
        super(Example, self).__init__()
 
        self.initUI()
 
    def initUI(self):
 
        self.setMouseTracking(True)
 
        self.label = QtGui.QLabel(self)
        self.changeLabel[int, int].connect(
            self.printCoordsToLabel)
 
        vbox = QtGui.QVBoxLayout()
        vbox.addWidget(self.label)
        vbox.addStretch(1)
        self.setLayout(vbox)
 
        self.setGeometry(450, 450, 300, 150)
        self.setWindowTitle('Signal')
        self.show()
 
    def mouseMoveEvent(self, event):
 
        pos = event.pos()
        self.changeLabel.emit(pos.x(), pos.y())
 
    def printCoordsToLabel(self, x, y):
 
        text = '(x = {}, y = {})'.format(x, y)
        self.label.setText(text)
 
 
def main():
 
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())
 
if __name__ == '__main__':
    main()



Отредактировано py.user.next (Июль 19, 2014 22:58:39)

Офлайн

#3 Июль 19, 2014 23:15:19

Singularity
Зарегистрирован: 2011-07-28
Сообщения: 1387
Репутация: +  75  -
Профиль   Отправить e-mail  

Передача информации в основной поток PyQt4

Razor
Разумеецо
Растрелять

Офлайн

#4 Июль 19, 2014 23:21:37

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

Передача информации в основной поток PyQt4

py.user.next, это все очень мило, но вы просто перефразировали мой пример. Как я уже сказал, сигнал уже отправляет, слот уже получает, в функцию информация передается, но в QLabel ничего не выводит. Если написать в функции:

def outLabel(self, text):
    print text
    self.ui.label.setText(text)
то print все выведет нормально, а вот в QLabel - никаких изменений. Я предполагаю, что это из-за потоков, хотя и не уверен. Но не имею понятия, как исправить (уже часов 20 убил на решение).

Singularity
Растрелять
Это шутка и сленг, разумеется.

Отредактировано Razor (Июль 19, 2014 23:27:03)

Офлайн

#5 Июль 20, 2014 02:01:41

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9874
Репутация: +  854  -
Профиль   Отправить e-mail  

Передача информации в основной поток PyQt4

Razor
py.user.next, это все очень мило, но вы просто перефразировали мой пример.

В твоём примере я QLabel как-то не наблюдаю.



Офлайн

#6 Июль 20, 2014 10:33:01

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

Передача информации в основной поток PyQt4

py.user.next
В твоём примере я QLabel как-то не наблюдаю.
QLabel должен располагаться в функции
@QtCore.pyqtSlot(object)
def saySomething(stuff):
    print stuff
    self.ui.label.setText(text)

Эта часть будет расположена непосредственно в GUI, тогда как остальная часть будет в источнике информации.

Если вам не сложно, вы не могли бы немного перефразировать свой пример? Сделать на манер моего, потому что после того, как его перефразировал я, он не шибко работает. Либо у меня кривые руки, либо причина та же.

Отредактировано Razor (Июль 20, 2014 10:34:48)

Офлайн

#7 Июль 20, 2014 11:13:01

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9874
Репутация: +  854  -
Профиль   Отправить e-mail  

Передача информации в основной поток PyQt4

Razor
QLabel должен располагаться в функции
Тогда причём тут self.ui?

Я имел в виду, что ты рассказываешь про QLabel, а код, в котором этот QLabel, не привёл. То есть предлагаешь нам догадываться, что ты там накодил.

Razor
как его перефразировал я, он не шибко работает

Так сначала нужно по-простому всё запустить, а потом уже, когда всё работает, применять декораторы.



Офлайн

#8 Июль 20, 2014 11:49:12

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

Передача информации в основной поток PyQt4

py.user.next
Так сначала нужно по-простому всё запустить, а потом уже, когда всё работает, применять декораторы.
Перефразировал ваш пример, он работает, но…так же, как и у меня:

# -*- coding: utf-8 -*-
from PyQt4 import QtCore
# Функция, отвечающая за вывод в GUI
def labels_output(self, text):
        print text  # Выведет текст, заданный во вводе
        # self.ui.last_sites_crawled.setText(text) - ничего не выведет
# Класс, через который передается сигнал
class ToLabel(QtCore.QObject):
    changeLabel = QtCore.pyqtSignal(object)
    def __init__(self):
        super(ToLabel, self).__init__()
        self.initUI()
    def initUI(self):
        self.changeLabel.connect(labels_output)
# Часть, которая отвечает за ввод
ex = ToLabel()
ex.changeLabel.emit("Hello")
Сайт съел все отступы.

Отредактировано Razor (Июль 20, 2014 11:53:26)

Офлайн

#9 Июль 20, 2014 12:25:35

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9874
Репутация: +  854  -
Профиль   Отправить e-mail  

Передача информации в основной поток PyQt4

И где QLabel?



Офлайн

#10 Июль 20, 2014 13:14:27

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

Передача информации в основной поток PyQt4

py.user.next
И где QLabel?
Ну хорошо, раз вы очень просите, я переписал для вас пример: https://www.dropbox.com/sh/c7tvssxmzl1fv4e/AABtDRCv_GA54WUz-BJK7v7Oa

Офлайн

  • Начало
  • » GUI
  • » Передача информации в основной поток PyQt4[RSS Feed]

Board footer

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

Powered by DjangoBB

Lo-Fi Version