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_())
