Почему в PyQt6 все нажатия обрабатываются три раза?

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

Нарисовал в Qt Designer себе GUI, сконвертировал через pyuic6 -o.
В нем почему-то все нажатия кнопок, меню и т.п. срабатывают трижды.

Только что выпилил все что только можно, как из .ui, так и из главного файла. Если это вдруг важно - запускаю через PyCharm, используются стандартные настройки и Python 3.10.

У меня есть кнопка pb_Start, к которой connect простая функция, делающая print("Hey, start is starting!"), я жму кнопку, у меня в выводе появляется три строки "Hey, start is starting!" подряд.

Обновлять PyQt6 пробовал. На циклы проверял, циклов нигде не вижу. В интернете искал, вроде подобного не нашел.
В чем может быть проблема?
Возможно ли ее решить без полного пересоздания всего?

Полный код моих файлов в настоящий момент. В этих файлах происходит троекратный вывод print() для кнопки и пункта меню.

i_one_button.ui:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>502</width>
    <height>180</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <property name="layoutDirection">
   <enum>Qt::LeftToRight</enum>
  </property>
  <property name="styleSheet">
   <string notr="true">background-color: rgb(254, 214, 188);</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <layout class="QGridLayout" name="gridLayout">
    <item row="0" column="0">
     <widget class="QPushButton" name="pb_Start">
      <property name="enabled">
       <bool>true</bool>
      </property>
      <property name="font">
       <font>
        <pointsize>11</pointsize>
       </font>
      </property>
      <property name="styleSheet">
       <string notr="true">background-color: rgb(85, 170, 255);</string>
      </property>
      <property name="text">
       <string>Start</string>
      </property>
     </widget>
    </item>
   </layout>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>502</width>
     <height>21</height>
    </rect>
   </property>
   <widget class="QMenu" name="menuFile">
    <property name="title">
     <string>File</string>
    </property>
    <addaction name="mf_Open"/>
   </widget>
   <addaction name="menuFile"/>
  </widget>
  <action name="mf_Open">
   <property name="text">
    <string>Open</string>
   </property>
  </action>
 </widget>
 <resources/>
 <connections/>
</ui>

После при помощи команды pyuic6 ui_one_button.ui -o ui_one_button.py я преобразую его в файл ui_one_button.py.

ui_one_button.py:


from PyQt6 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(502, 180)
        MainWindow.setLayoutDirection(QtCore.Qt.LayoutDirection.LeftToRight)
        MainWindow.setStyleSheet("background-color: rgb(254, 214, 188);")
        self.centralwidget = QtWidgets.QWidget(parent=MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")
        self.pb_Start = QtWidgets.QPushButton(parent=self.centralwidget)
        self.pb_Start.setEnabled(True)
        font = QtGui.QFont()
        font.setPointSize(11)
        self.pb_Start.setFont(font)
        self.pb_Start.setStyleSheet("background-color: rgb(85, 170, 255);")
        self.pb_Start.setObjectName("pb_Start")
        self.gridLayout.addWidget(self.pb_Start, 0, 0, 1, 1)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(parent=MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 502, 21))
        self.menubar.setObjectName("menubar")
        self.menuFile = QtWidgets.QMenu(parent=self.menubar)
        self.menuFile.setObjectName("menuFile")
        MainWindow.setMenuBar(self.menubar)
        self.mf_Open = QtGui.QAction(parent=MainWindow)
        self.mf_Open.setObjectName("mf_Open")
        self.menuFile.addAction(self.mf_Open)
        self.menubar.addAction(self.menuFile.menuAction())

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

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pb_Start.setText(_translate("MainWindow", "Start"))
        self.menuFile.setTitle(_translate("MainWindow", "File"))
        self.mf_Open.setText(_translate("MainWindow", "Open"))

main_one_button.py:

import sys
from PyQt6.QtWidgets import QApplication, QMainWindow, QLineEdit
from ui_one_button import Ui_MainWindow


class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        self.mf_Open.triggered.connect(self.on_mf_Open_triggered)

        self.pb_Start.clicked.connect(self.on_pb_Start_clicked)

    def on_mf_Open_triggered(self):
        print("Hey, open is opening!")

    def on_pb_Start_clicked(self):
        print("Hey, start is starting!")


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec())

И после однократного нажатия на кнопку "Старт", в выводе появляется:

Hey, start is starting!
Hey, start is starting!
Hey, start is starting!

Ответы

▲ 2Принят

Qt может автоматически приконнектить слоты имеющие спец-имена, например:

on_pb_Start_clicked

обозначает: соедини меня с сигналом clicked у объекта pb_Start.

А последующий

self.pb_Start.clicked.connect(self.on_pb_Start_clicked)

делает еще одно подключение к сигналу, что вызывает двойной вызов слота при одном сигнале


main.py

class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

#        self.mf_Open.triggered.connect(self.on_mf_Open_triggered)
#        self.pb_Start.clicked.connect(self.on_pb_Start_clicked)
        self.mf_Open.triggered.connect(self.on_mfOpen_triggered)
        self.pb_Start.clicked.connect(self.on_pbStart_clicked)

#    def on_mf_Open_triggered(self):
    def on_mfOpen_triggered(self):
        print("Hey, open is opening!")

#    def on_pb_Start_clicked(self):
    def on_pbStart_clicked(self):
        print("Hey, start is starting!")

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec())

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