Не срабатывает обработчик нажатия на кнопку, Python, PyQt5

Рейтинг: 1Ответов: 1Опубликовано: 19.05.2023

Делаю приложение на PyQt 5 и появлась проблема. У меня есть два окна, собственно два класса в коде: App и ReportWindow. Проблема возникла с методом pdf_build класса ReportWindow. В теории при нажатии на кнопку graphics_pdf_btn в консоль должно выводиться "Ok!", в моём же случае ничего не происходит. Подскажите, в чём может быть проблема?

#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5 import uic
import reportBuilder
import my_func_modul as myf

class App(QWidget):
    def __init__(self):
        self.start()
        self.report()
    def start(self):
        self.ui = uic.loadUi("settings.ui")
        self.ui.show()
    def report(self):
        self.ui.report_button.clicked.connect(lambda: self.test())
    def test(self):
        date = self.ui.dateChoose.date()
        day = date.day(); month = date.month(); year = date.year()
        day_str = myf.date_transform(day, month, year)
        method_index = self.ui.boxOfMethods.currentIndex()
        method_text = self.ui.boxOfMethods.currentText()
        result = reportBuilder.report_builder_to_pdf(method=method_index)
        self.open_report_window(day_str, result)
    def open_report_window(self, day_of_report, result):
        self.report_window = ReportWindow(day_of_report, result)
        self.report_window.start()
class ReportWindow(QWidget):
    def __init__(self, day, result):
        self.day_of_report = day
        self.result = result
        self.start()
        self.pdf_build()
    def start(self):
        self.ui = uic.loadUi("report.ui")
        self.ui.show()
        self.ui.day_of_report.setText(f"Отчёт за {self.day_of_report}")

    def pdf_build(self):
        self.ui.graphics_pdf_btn.clicked.connect(self.graphs_pdf_build)
    def graphs_pdf_build(self):
        print("Ok!")
if __name__== '__main__':
    app = QApplication(sys.argv)
    main = App()
app.exec_()

Ответы

▲ 1

Проблема, скорее всего, связана с порядком вызовов в классе ReportWindow. В методе init() вы вызываете метод self.start(), который загружает интерфейс и отображает его, и после этого вызываете метод self.pdf_build(), который устанавливает обработчик событий для кнопки. Однако, в том месте, где вы пытаетесь установить обработчик событий, кнопка ещё не была создана, поскольку она создаётся в методе start().

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

class ReportWindow(QWidget):
    def __init__(self, day, result):
        super().__init__() 
        self.day_of_report = day
        self.result = result
        self.start()

    def start(self):
        self.ui = uic.loadUi("report.ui")
        self.ui.day_of_report.setText(f"Отчёт за {self.day_of_report}")
        
    def showEvent(self, event):
        super().showEvent(event) 
        self.pdf_build() 

    def pdf_build(self):
        self.ui.graphics_pdf_btn.clicked.connect(self.graphs_pdf_build)

    def graphs_pdf_build(self):
        print("Ok!")