PyQt5: Проблема с pyqtSignal и с QLabel

В программе я хотел закрепить навыки в сигналах и в виджете QLabel, но наткнулся на проблему.

В программе я хотел реализовать пару действий: функция screen() - делает скриншот, сохраняя фото в файл 1.png.

Далее испуская сигнал, который должен запустить функцию updatelabel(). updatelabel()- функция, которая должна вывести этот скриншот(1.png) в label.

Файл с GUI(asd.py):

from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
       MainWindow.setObjectName("MainWindow")
       MainWindow.resize(1248, 840)
       self.centralwidget = QtWidgets.QWidget(MainWindow)
       self.centralwidget.setObjectName("centralwidget")
       self.label = QtWidgets.QLabel(self.centralwidget)
       self.label.setGeometry(QtCore.QRect(4, 5, 1241, 821))
       self.label.setText("")
       self.label.setObjectName("label")
       MainWindow.setCentralWidget(self.centralwidget)

       self.retranslateUi(MainWindow)
       QtCore.QMetaObject.connectSlotsByName(MainWindow)

def retranslateUi(self, MainWindow):
    _translate = QtCore.QCoreApplication.translate
    MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))


if __name__ == "__main__":
   import sys
   app = QtWidgets.QApplication(sys.argv)
   MainWindow = QtWidgets.QMainWindow()
   ui = Ui_MainWindow()
   ui.setupUi(MainWindow)
   MainWindow.show()
   sys.exit(app.exec_())

Главный файл, делающий скриншот и выводящий его в label(main.py):

from PyQt5 import *
from PyQt5.QtCore import *
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import *
from asd import *
import pyautogui
import sys
#Импортирую модули

class Signal(QObject):
    trigger = pyqtSignal()#создаю сигнал


class Main (QMainWindow, Ui_MainWindow): # создаю главный класс
     def __init__(self):
         super(Main, self).__init__()
    
         self.ui = self.setupUi(Ui_MainWindow()) #импортирую GUI с файла asd.py
         self.sign = Signal()#создаю экземпляр класса
         self.sign.trigger.connect(self.updatelabel)# присоединяю сигнал к функции updatelabel
         self.screen()#запускаю функцию screen

    def screen(self):
        while True:# создаю вечный цикл, который делает скриншот, сохраняя его в файл "1.png"
            scren = pyautogui.screenshot("1.png")#сохраняю скрин
            self.sign.trigger.emit()#испускаю сигнал, чтобы запустилась функция updatelabel

    def updatelabel(self):#функция, которая должна обновить виджет QLabel, используя QPixmap
        while True:# создаю вечный цикл
           pix = QPixmap("1.png")
           self.ui.label.setPixmap(pix)#вывожу скриншот



if __name__ == '__main__':#ну тут такие, дефолтные действия, которые я думаю не стоит объяснять
    app = QApplication(sys.argv)
    ex = Main()
    ex.show()
    sys.exit(app.exec_())

Ошибка:

Traceback (most recent call last):
File "C:\!Python\gui\main.py", line 39, in <module>
ex = Main()
File "C:\!Python\gui\main.py", line 18, in __init__
self.ui = self.setupUi(Ui_MainWindow())
File "C:\!Python\gui\asd.py", line 16, in setupUi
MainWindow.setObjectName("MainWindow")
AttributeError: 'Ui_MainWindow' object has no attribute 'setObjectName'

В чем проблема?


Ответы (1 шт):

Автор решения: S. Nick

Для того чтобы создать собственный сигнал вам достаточно класса QObject

Проблема в строке

self.ui = self.setupUi(Ui_MainWindow())

Вам не понадобятся циклы while True в интерфейсе - от слова вообще.

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *

from asd import *
import pyautogui

        
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1200, 700)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(4, 5, 1241, 821))
        self.label.setText("")
        self.label.setObjectName("label")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))


#class Signal(QThread):
class Signal(QObject):                                      # +++ QObject
    trigger = pyqtSignal(list)


class Main (QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(Main, self).__init__()
    
#        self.ui = self.setupUi(Ui_MainWindow())            # тут проблема
        self.setupUi(self)                                  # +++ 
        
        layout = QtWidgets.QVBoxLayout(self.centralwidget)
        layout.addWidget(self.label)  
         
        self.sign = Signal()
        self.sign.trigger.connect(self.updatelabel)
#        self.sign.start()
        
        self.screen()

    def screen(self):
#        while True:
        scren = pyautogui.screenshot("1.png")
        self.sign.trigger.emit([scren])

    def updatelabel(self, scren):
#        while True:
        pix = QPixmap("1.png")           
        self.label.setPixmap(pix)


if __name__ == '__main__':
    print(sys.argv)
    app = QApplication(sys.argv)
    ex = Main()
    ex.show()
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка