Найти - Пользователи
Полная версия: Передача информации в основной поток PyQt4
Начало » GUI » Передача информации в основной поток PyQt4
1 2
Razor
Здравствуйте, уважаемые коллеги. Возникла проблема: писал модуль, сделал 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?
py.user.next
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()
Singularity
Razor
Разумеецо
Растрелять
Razor
py.user.next, это все очень мило, но вы просто перефразировали мой пример. Как я уже сказал, сигнал уже отправляет, слот уже получает, в функцию информация передается, но в QLabel ничего не выводит. Если написать в функции:

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

Singularity
Растрелять
Это шутка и сленг, разумеется.
py.user.next
Razor
py.user.next, это все очень мило, но вы просто перефразировали мой пример.

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

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

Если вам не сложно, вы не могли бы немного перефразировать свой пример? Сделать на манер моего, потому что после того, как его перефразировал я, он не шибко работает. Либо у меня кривые руки, либо причина та же.
py.user.next
Razor
QLabel должен располагаться в функции
Тогда причём тут self.ui?

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

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

Так сначала нужно по-простому всё запустить, а потом уже, когда всё работает, применять декораторы.
Razor
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")
Сайт съел все отступы.
py.user.next
И где QLabel?
Razor
py.user.next
И где QLabel?
Ну хорошо, раз вы очень просите, я переписал для вас пример: https://www.dropbox.com/sh/c7tvssxmzl1fv4e/AABtDRCv_GA54WUz-BJK7v7Oa
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