QFileDialog открытие проводника и выбор файла

При помощи Qt Designer создал дизайн. И теперь пытаюсь прописать логику.
Не могу понять как правильно записать действие по клику. Уже кучу всего перепробовал. Либо вовсе перестает запускаться приложение, либо запускается, но по клику вылетает сразу же.

main.py:

from checker import Ui_MainWindow
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QFileDialog
import sys

class Cheker(QtWidgets.QMainWindow, Ui_MainWindow):

    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.show()

        self.btn_download.addAction(self.add_file)


    @QtCore.pyqtSlot()
    def add_file(self):
        action = self.sender()
        if action.btn_download():
            fname = QFileDialog.getOpenFileName(self)[0]
            f = open(fname, 'r')
            with f:
                data = f.read()
                self.tableWidget.setItem(data)

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    check = Cheker()
    sys.exit(app.exec_())

checker.py:

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(553, 379)
        MainWindow.setMouseTracking(True)
        MainWindow.setStyleSheet("background-color: rgb(217, 217, 217);")
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.btn_download = QtWidgets.QPushButton(self.centralwidget)
        self.btn_download.setGeometry(QtCore.QRect(30, 10, 111, 31))
        font = QtGui.QFont()
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.btn_download.setFont(font)
        self.btn_download.setStyleSheet("background-color: rgb(255, 255, 255);")
        self.btn_download.setObjectName("btn_download")
        self.btn_clear = QtWidgets.QPushButton(self.centralwidget)
        self.btn_clear.setGeometry(QtCore.QRect(160, 10, 111, 31))
        font = QtGui.QFont()
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.btn_clear.setFont(font)
        self.btn_clear.setMouseTracking(False)
        self.btn_clear.setAutoFillBackground(False)
        self.btn_clear.setStyleSheet("background-color: rgb(255, 255, 255);")
        self.btn_clear.setObjectName("btn_clear")
        self.result_viev = QtWidgets.QListView(self.centralwidget)
        self.result_viev.setGeometry(QtCore.QRect(380, 170, 141, 41))
        font = QtGui.QFont()
        font.setPointSize(12)
        self.result_viev.setFont(font)
        self.result_viev.setStyleSheet("background-color: rgb(255, 255, 255);")
        self.result_viev.setObjectName("result_viev")
        self.status_viev = QtWidgets.QListView(self.centralwidget)
        self.status_viev.setEnabled(False)
        self.status_viev.setGeometry(QtCore.QRect(380, 250, 141, 41))
        self.status_viev.setStyleSheet("background-color: rgb(255, 255, 255);")
        self.status_viev.setObjectName("status_viev")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(380, 140, 111, 16))
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(True)
        font.setItalic(False)
        font.setWeight(75)
        self.label.setFont(font)
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(380, 220, 111, 16))
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(True)
        font.setUnderline(False)
        font.setWeight(75)
        font.setStrikeOut(False)
        font.setKerning(True)
        self.label_2.setFont(font)
        self.label_2.setObjectName("label_2")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(380, 60, 101, 51))
        font = QtGui.QFont()
        font.setPointSize(14)
        font.setBold(True)
        font.setUnderline(True)
        font.setWeight(75)
        self.pushButton.setFont(font)
        self.pushButton.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
        self.pushButton.setStyleSheet("border-color: rgb(188, 0, 0);\n"
"background-color: rgb(255, 255, 255);")
        self.pushButton.setObjectName("pushButton")
        self.tableWidget = QtWidgets.QTableWidget(self.centralwidget)
        self.tableWidget.setGeometry(QtCore.QRect(10, 60, 361, 311))
        self.tableWidget.setStyleSheet("background-color: rgb(244, 244, 244);")
        self.tableWidget.setObjectName("tableWidget")
        self.tableWidget.setColumnCount(0)
        self.tableWidget.setRowCount(0)
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
        MainWindow.setTabOrder(self.btn_download, self.btn_clear)
        MainWindow.setTabOrder(self.btn_clear, self.result_viev)
        MainWindow.setTabOrder(self.result_viev, self.status_viev)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "FB - чекер "))
        self.btn_download.setText(_translate("MainWindow", "Загрузить"))
        self.btn_clear.setText(_translate("MainWindow", "Очистить"))
        self.label.setText(_translate("MainWindow", "Код с почты"))
        self.label_2.setText(_translate("MainWindow", "Статус"))
        self.pushButton.setText(_translate("MainWindow", "СТАРТ"))

Буду признателен


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

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

Кнопка излучает сигнал clicked(), когда она активируется мышью, пробелом или сочетанием клавиш.
Подключитесь к этому сигналу, чтобы выполнить действие кнопки.

Сигналы и слоты используются для связи между объектами. Механизм сигналов и слотов является центральной особенностью Qt и, вероятно, той частью, которая больше всего отличается от функций, предоставляемых другими фреймворками.

Я не знаю для чего вы решили использовать виджет QTableWidget и что вы туда решили записывать,
поэтому я заменил его на виджет QTextEdit.

Я улучшил написание статической функции getOpenFileName()

q1411810.py

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QFileDialog
from checker import Ui_MainWindow

        
class Cheker(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.show()
        
# ???        self.btn_download.addAction(self.add_file)
        self.btn_download.clicked.connect(self.add_file)                  # !!! +++
        
    @QtCore.pyqtSlot()
    def add_file(self):
# ???        action = self.sender()
# ???        if action.btn_download():

        fname, filetype = QFileDialog.getOpenFileName(
            self, 
            "Open file",
            ".", 
            "Python Files (*.py);;Text Files(*.txt)"
        )
        if fname:
#            f = open(fname, 'r')
#            with f:
            with open(fname, 'r', encoding='utf-8') as f:
                data = f.read()
# ???                self.tableWidget.setItem(data)
                self.textEdit.setText(data)
     
      
if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    check = Cheker()
    sys.exit(app.exec_())

checker.py

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(553, 379)
        MainWindow.setMouseTracking(True)
        MainWindow.setStyleSheet("background-color: rgb(217, 217, 217);")
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.btn_download = QtWidgets.QPushButton(self.centralwidget)
        self.btn_download.setGeometry(QtCore.QRect(30, 10, 111, 31))
        font = QtGui.QFont()
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.btn_download.setFont(font)
        self.btn_download.setStyleSheet("background-color: rgb(255, 255, 255);")
        self.btn_download.setObjectName("btn_download")
        self.btn_clear = QtWidgets.QPushButton(self.centralwidget)
        self.btn_clear.setGeometry(QtCore.QRect(160, 10, 111, 31))
        font = QtGui.QFont()
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.btn_clear.setFont(font)
        self.btn_clear.setMouseTracking(False)
        self.btn_clear.setAutoFillBackground(False)
        self.btn_clear.setStyleSheet("background-color: rgb(255, 255, 255);")
        self.btn_clear.setObjectName("btn_clear")
        self.result_viev = QtWidgets.QListView(self.centralwidget)
        self.result_viev.setGeometry(QtCore.QRect(380, 170, 141, 41))
        font = QtGui.QFont()
        font.setPointSize(12)
        self.result_viev.setFont(font)
        self.result_viev.setStyleSheet("background-color: rgb(255, 255, 255);")
        self.result_viev.setObjectName("result_viev")
        self.status_viev = QtWidgets.QListView(self.centralwidget)
        self.status_viev.setEnabled(False)
        self.status_viev.setGeometry(QtCore.QRect(380, 250, 141, 41))
        self.status_viev.setStyleSheet("background-color: rgb(255, 255, 255);")
        self.status_viev.setObjectName("status_viev")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(380, 140, 111, 16))
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(True)
        font.setItalic(False)
        font.setWeight(75)
        self.label.setFont(font)
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(380, 220, 111, 16))
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(True)
        font.setUnderline(False)
        font.setWeight(75)
        font.setStrikeOut(False)
        font.setKerning(True)
        self.label_2.setFont(font)
        self.label_2.setObjectName("label_2")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(380, 60, 101, 51))
        font = QtGui.QFont()
        font.setPointSize(14)
        font.setBold(True)
        font.setUnderline(True)
        font.setWeight(75)
        self.pushButton.setFont(font)
        self.pushButton.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
        self.pushButton.setStyleSheet("border-color: rgb(188, 0, 0);\n"
"background-color: rgb(255, 255, 255);")
        self.pushButton.setObjectName("pushButton")
        
        '''
        self.tableWidget = QtWidgets.QTableWidget(self.centralwidget)
        self.tableWidget.setGeometry(QtCore.QRect(10, 60, 361, 311))
        self.tableWidget.setStyleSheet("background-color: rgb(244, 244, 244);")
        self.tableWidget.setObjectName("tableWidget")
        self.tableWidget.setColumnCount(0)
        self.tableWidget.setRowCount(0)
        '''
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv        
        self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
        self.textEdit.setGeometry(QtCore.QRect(10, 60, 361, 311))
        self.textEdit.setStyleSheet("background-color: rgb(244, 244, 244);")
        self.textEdit.setObjectName("textEdit")        
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
        MainWindow.setTabOrder(self.btn_download, self.btn_clear)
        MainWindow.setTabOrder(self.btn_clear, self.result_viev)
        MainWindow.setTabOrder(self.result_viev, self.status_viev)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "FB - чекер "))
        self.btn_download.setText(_translate("MainWindow", "Загрузить"))
        self.btn_clear.setText(_translate("MainWindow", "Очистить"))
        self.label.setText(_translate("MainWindow", "Код с почты"))
        self.label_2.setText(_translate("MainWindow", "Статус"))
        self.pushButton.setText(_translate("MainWindow", "СТАРТ"))

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

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

→ Ссылка