PyQt5 вызывает gui из преобразованного файла pyuic5 или пользовательского интерфейса c .loadUi - PullRequest
0 голосов
/ 04 апреля 2020

Привет, я новичок в python (до лекции 2 и половины MIT 6001 Введение в информатику и программирование в Python). Тем не менее я начал играть с Gtk & Glade, PyQt5 и Designer.

follow { ссылка } Я использовал pyuic5 для преобразования моего файла prova.ui, сгенерированного Designer, и импортировал его в код ниже:

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

from prova1 import Ui_MainWindow

class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()
       self.ui = Ui_MainWindow()
       self.ui.setupUi(self)


       self.ButtonQ.clicked.connect(self.QPushButtonQPressed) 

       self.ButtonA.clicked.connect(self.QPushButtonAPressed) 



    def QPushButtonQPressed(self):

        # This is executed when the button is pressed

        print('pppppppp exit from QQQQQQQQQQQQQQQQQQQQQQQQQQQQQ')

        sys.exit()


    def QPushButtonAPressed(self):

        # This is executed when the button is pressed

        print('exit from AAAAAAAAAAAAAAAAAAAAAAA')

        sys.exit()

if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWindow()
w.show()
sys.exit(app.exec_())

, но когда я запустил его в терминале, я получил :

  File "./main.py", line 80, in <module>
  w = MyWindow()
  File "./main.py", line 38, in __init__
  self.ButtonQ.clicked.connect(self.QPushButtonQPressed) 
  AttributeError: 'MyWindow' object has no attribute 'ButtonQ'

ошибка !!!!

при использовании loadui c вроде:

 import sys

 from PyQt5 import QtWidgets, uic


 class Ui(QtWidgets.QMainWindow):

      def __init__(self):

        super(Ui, self).__init__()

        uic.loadUi('prova1.ui', self)


        self.ButtonQ.clicked.connect(self.QPushButtonQPressed) 

        self.ButtonA.clicked.connect(self.QPushButtonAPressed)

        self.show() 


    def QPushButtonQPressed(self):

        # This is executed when the button is pressed

        print('pppppppp exit from QQQQQQQQQQQQQQQQQQQQQQQQQQQQQ')

        sys.exit()


    def QPushButtonAPressed(self):

        # This is executed when the button is pressed

        print('exit from AAAAAAAAAAAAAAAAAAAAAAA')

        sys.exit()


app = QtWidgets.QApplication(sys.argv)

window = Ui()

app.exec_()

программа работает как положено, то есть показывает окно gui и выйти, если нажата кнопка A или Quit

согласно файлу prova1.ui, преобразованному с помощью pyuic5, prova1.py:

# Form implementation generated from reading ui file 'prova1.ui'
#
# Created by: PyQt5 UI code generator 5.12.3
#
# WARNING! All changes made in this file will be lost!


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
     def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(256, 351)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setEnabled(True)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayoutWidget = QtWidgets.QWidget(self.centralwidget)
        self.gridLayoutWidget.setGeometry(QtCore.QRect(10, 0, 221, 261))
        self.gridLayoutWidget.setObjectName("gridLayoutWidget")
        self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget)
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.gridLayout.setObjectName("gridLayout")
        self.ButtonA = QtWidgets.QPushButton(self.gridLayoutWidget)
        font = QtGui.QFont()
        font.setFamily("Abyssinica SIL")
        font.setItalic(True)
        font.setUnderline(True)
        font.setStrikeOut(False)
        font.setKerning(False)
        self.ButtonA.setFont(font)
        self.ButtonA.setCheckable(True)
        self.ButtonA.setAutoDefault(False)
        self.ButtonA.setDefault(False)
        self.ButtonA.setObjectName("ButtonA")
        self.gridLayout.addWidget(self.ButtonA, 0, 0, 1, 1)
        self.C = QtWidgets.QPushButton(self.gridLayoutWidget)
        self.C.setObjectName("C")
        self.gridLayout.addWidget(self.C, 2, 0, 1, 1)
        self.B = QtWidgets.QPushButton(self.gridLayoutWidget)
        self.B.setObjectName("B")
        self.gridLayout.addWidget(self.B, 1, 0, 1, 1)
        self.ButtonQ = QtWidgets.QPushButton(self.gridLayoutWidget)
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.ButtonQ.setFont(font)
        self.ButtonQ.setCheckable(True)
        self.ButtonQ.setAutoDefault(False)
        self.ButtonQ.setDefault(False)
        self.ButtonQ.setObjectName("ButtonQ")
        self.gridLayout.addWidget(self.ButtonQ, 3, 0, 1, 1)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 256, 29))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.statusbar.setFont(font)
        self.statusbar.setAutoFillBackground(True)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

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

   def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.ButtonA.setText(_translate("MainWindow", "A"))
        self.C.setText(_translate("MainWindow", "C"))
        self.B.setText(_translate("MainWindow", "B"))
        self.ButtonQ.setText(_translate("MainWindow", "Q quit"))

Я уверен, что ошибка как-то связанные с определениями классов, но не может действительно gr asp это? Любая помощь?

1 Ответ

0 голосов
/ 04 апреля 2020

Хайке решил это

В первой версии MyWindow, ButonA и ButtonQ - это атрибуты self.ui, а не самого себя, поэтому вам нужно использовать что-то вроде self.ui.ButtonA. clicked.connect (...), et c.

...