LINUX.ORG.RU

PyQt5: как правильно назначить событие на кнопку?

 , ,


0

1

Привет всем. Пишу тут утилиту для создания загрузочных флешек. На PyQt 5. Делаю всё согласно книге (да много источников просматривал) Для создания главного окна применял Qt Designer, затем конвертировал форму в класс Python. Создал ещё один файл, подключил форму, всё работает. Прописываю действие для кнопки (открытие диалога About), функцию, запускаю приложение - и кнопка не работает. Что только не перепробовал уже. Такое чувство что интерпретатор тупо игнорит строку с назначением обработчика, ибо даже если там намеренно сделать ошибку - прога запускается как ни в чём не бывало. Где ошибка? Вот форма:

# -*- coding: utf-8 -*-

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(420, 301)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth())
        MainWindow.setSizePolicy(sizePolicy)
        MainWindow.setMinimumSize(QtCore.QSize(420, 301))
        MainWindow.setMaximumSize(QtCore.QSize(420, 301))
        icon = QtGui.QIcon.fromTheme("drive-removable-media")
        MainWindow.setWindowIcon(icon)
        self.centralWidget = QtWidgets.QWidget(MainWindow)
        self.centralWidget.setObjectName("centralWidget")
        self.label = QtWidgets.QLabel(self.centralWidget)
        self.label.setGeometry(QtCore.QRect(10, 0, 59, 21))
        self.label.setObjectName("label")
        self.comboBox = QtWidgets.QComboBox(self.centralWidget)
        self.comboBox.setGeometry(QtCore.QRect(10, 20, 401, 32))
        self.comboBox.setObjectName("comboBox")
        self.label_2 = QtWidgets.QLabel(self.centralWidget)
        self.label_2.setGeometry(QtCore.QRect(10, 60, 59, 18))
        self.label_2.setObjectName("label_2")
        self.toolButton = QtWidgets.QToolButton(self.centralWidget)
        self.toolButton.setGeometry(QtCore.QRect(380, 80, 33, 34))
        self.toolButton.setText("")
        icon = QtGui.QIcon.fromTheme("document-open")
        self.toolButton.setIcon(icon)
        self.toolButton.setObjectName("toolButton")
        self.label_3 = QtWidgets.QLabel(self.centralWidget)
        self.label_3.setGeometry(QtCore.QRect(10, 120, 41, 18))
        self.label_3.setObjectName("label_3")
        self.lineEdit = QtWidgets.QLineEdit(self.centralWidget)
        self.lineEdit.setGeometry(QtCore.QRect(10, 140, 201, 32))
        self.lineEdit.setObjectName("lineEdit")
        self.label_4 = QtWidgets.QLabel(self.centralWidget)
        self.label_4.setGeometry(QtCore.QRect(220, 120, 71, 18))
        self.label_4.setObjectName("label_4")
        self.comboBox_3 = QtWidgets.QComboBox(self.centralWidget)
        self.comboBox_3.setGeometry(QtCore.QRect(220, 140, 191, 32))
        self.comboBox_3.setObjectName("comboBox_3")
        self.comboBox_3.addItem("")
        self.comboBox_3.addItem("")
        self.comboBox_3.addItem("")
        self.line = QtWidgets.QFrame(self.centralWidget)
        self.line.setGeometry(QtCore.QRect(10, 180, 401, 16))
        self.line.setFrameShape(QtWidgets.QFrame.HLine)
        self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line.setObjectName("line")
        self.progressBar = QtWidgets.QProgressBar(self.centralWidget)
        self.progressBar.setGeometry(QtCore.QRect(10, 210, 401, 23))
        self.progressBar.setProperty("value", 0)
        self.progressBar.setObjectName("progressBar")
        self.cancelButton = QtWidgets.QPushButton(self.centralWidget)
        self.cancelButton.setGeometry(QtCore.QRect(320, 260, 88, 34))
        icon = QtGui.QIcon.fromTheme("dialog-cancel")
        self.cancelButton.setIcon(icon)
        self.cancelButton.setObjectName("cancelButton")
        self.writeButton = QtWidgets.QPushButton(self.centralWidget)
        self.writeButton.setGeometry(QtCore.QRect(230, 260, 88, 34))
        icon = QtGui.QIcon.fromTheme("dialog-ok")
        self.writeButton.setIcon(icon)
        self.writeButton.setObjectName("writeButton")
        self.aboutButton = QtWidgets.QPushButton(self.centralWidget)
        self.aboutButton.setGeometry(QtCore.QRect(10, 260, 88, 34))
        icon = QtGui.QIcon.fromTheme("help-about")
        self.aboutButton.setIcon(icon)
        self.aboutButton.setObjectName("aboutButton")
        self.lineEdit_2 = QtWidgets.QLineEdit(self.centralWidget)
        self.lineEdit_2.setGeometry(QtCore.QRect(10, 80, 361, 32))
        self.lineEdit_2.setObjectName("lineEdit_2")
        MainWindow.setCentralWidget(self.centralWidget)

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

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "QImageWriter"))
        self.label.setText(_translate("MainWindow", "Device:"))
        self.label_2.setText(_translate("MainWindow", "ISO:"))
        self.label_3.setText(_translate("MainWindow", "Label:"))
        self.lineEdit.setText(_translate("MainWindow", "USB_STICK"))
        self.label_4.setText(_translate("MainWindow", "Filesystem:"))
        self.comboBox_3.setItemText(0, _translate("MainWindow", "FAT32"))
        self.comboBox_3.setItemText(1, _translate("MainWindow", "NTFS"))
        self.comboBox_3.setItemText(2, _translate("MainWindow", "EXT4"))
        self.cancelButton.setText(_translate("MainWindow", "Cancel"))
        self.writeButton.setText(_translate("MainWindow", "Write"))
        self.aboutButton.setText(_translate("MainWindow", "About"))


Вот код исполняемого файла:
#!/usr/bin/env python3

from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox
from mainwindow import *
import sys

class QImageWriter (QMainWindow, Ui_MainWindow):
    def  __init__(self):
        QMainWindow.__init__(self)
        self.window = QtWidgets.QMainWindow()
        self.setupUi(self.window)
        
        self.aboutButton.clicked.connect(self.about)
        
        
def about(self):
        
        msg = QMessageBox()
        msg.setIcon(QMessageBox.Information)
        msg.setText('QImageWriter - a tool for write disk images to USB drive, written on PyQt5\nThis program redistributed under GNU GPLv3 license. \
                     Copyright (C) 2017 Aleksey Samoilov aka Sunderland93')
        msg.setWindowTitle('About')
        msg.exec_()
        
        
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(window)
    
    window.show()
    sys.exit(app.exec_())

и к тому же def about(self) объявлено вне класса QImageWriter

Sahas ★★★★☆
()

И да, QImageWriter очень плохое название, т.к. есть такой класс в Qt.

fluorite ★★★★★
()
Ответ на: комментарий от fluorite

Понял ошибку, исправил. Но вот about() так и не работает:

#!/usr/bin/env python3

from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox
from mainwindow import *
import sys

class MainProg (QMainWindow, Ui_MainWindow):
    def  __init__(self):
        QMainWindow.__init__(self)
        self.window = QtWidgets.QMainWindow()
        self.setupUi(self.window)
        
        self.aboutButton.clicked.connect(self.about)
        
    def about(self):
            msg = QMessageBox()
            msg.setIcon(QMessageBox.Information)
            msg.setWindowTitle('About')
            msg.exec_()
        
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainProg()
    ui = Ui_MainWindow()
    ui.setupUi(window)
    
    window.show()
    sys.exit(app.exec_())

Sunderland93 ★★★★★
() автор топика
Ответ на: комментарий от Sunderland93

Тогда у меня запускается пустое окно без виджетов

Не нужны тебе виджеты. Поверь мне на слово.

anonymous
()
Ответ на: комментарий от fluorite

Всё, разобрался. Вот так оказывается надо было:

#!/usr/bin/env python3

from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox
from mainwindow import *
import sys

class MainProg (Ui_MainWindow):
    def  __init__(self,  window):
        Ui_MainWindow.__init__(self)
        self.setupUi(window)
        
        self.aboutButton.clicked.connect(self.about)
        
    def about(self):
            msg = QMessageBox()
            msg.setIcon(QMessageBox.Information)
            msg.setWindowTitle('About')
            msg.exec_()
        
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = QMainWindow()
    
    prog = MainProg(window)
    
    window.show()
    sys.exit(app.exec_())

Sunderland93 ★★★★★
() автор топика

Раз уж тему не закрыл, вот ещё вопрос. После закрытия диалога выбора файла, генерируется исключение

FileNotFoundError: [Errno 2] Нет такого файла или каталога: "

Никак не могу разобраться в чём причина. Вот код

#!/usr/bin/env python3

from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox, QFileDialog
from mainwindow import *
import sys

class MainProg (QMainWindow, Ui_MainWindow):
    def  __init__(self,  window):
        QMainWindow.__init__(self)
        self.setupUi(window)
        
        self.openisoButton.clicked.connect(self.openISO)
        self.aboutButton.clicked.connect(self.about)
        
        
    def openISO(self):
        iso = QFileDialog.getOpenFileName(self, 'Open ISO', '/home')[0]
        f = open(iso)
        data = f.read()
        self.textEdit.setText(data)
        f.close()

Sunderland93 ★★★★★
() автор топика
Ответ на: комментарий от Sunderland93

Ещё в консоли появляется строка

StdErr: KSambaShare: Could not find smb.conf!
Исключение «unhandled FileNotFoundError»

Sunderland93 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.