Форум сайта python.su
Здравствуйте, уважаемые коллеги. Возникла проблема: писал модуль, сделал 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!")
Отредактировано Razor (Июль 19, 2014 21:09:08)
Офлайн
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)
Офлайн
RazorРастрелять
Разумеецо
Офлайн
py.user.next, это все очень мило, но вы просто перефразировали мой пример. Как я уже сказал, сигнал уже отправляет, слот уже получает, в функцию информация передается, но в QLabel ничего не выводит. Если написать в функции:
def outLabel(self, text): print text self.ui.label.setText(text)
SingularityЭто шутка и сленг, разумеется.
Растрелять
Отредактировано Razor (Июль 19, 2014 23:27:03)
Офлайн
Razor
py.user.next, это все очень мило, но вы просто перефразировали мой пример.
Офлайн
py.user.nextQLabel должен располагаться в функции
В твоём примере я QLabel как-то не наблюдаю.
@QtCore.pyqtSlot(object) def saySomething(stuff): print stuff self.ui.label.setText(text)
Отредактировано Razor (Июль 20, 2014 10:34:48)
Офлайн
RazorТогда причём тут self.ui?
QLabel должен располагаться в функции
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")
Отредактировано Razor (Июль 20, 2014 11:53:26)
Офлайн
И где QLabel?
Офлайн
py.user.nextНу хорошо, раз вы очень просите, я переписал для вас пример: https://www.dropbox.com/sh/c7tvssxmzl1fv4e/AABtDRCv_GA54WUz-BJK7v7Oa
И где QLabel?
Офлайн