Причина в том, что, поскольку вы используете пользовательский интерфейс c, он автоматически включает функцию автоматического подключения, которая автоматически определяет имена функций на основе имен объектов / сигналов и подключает их, , даже если функции не иметь декораторы слотов Qt .
В результате ваш слот будет фактически называться трижды :
- без аргументов (
clicked()
); - с аргументом
checked
(clicked(bool)
): аргумент игнорируется Qt, так как функция не принимает ничего, но функция все равно будет вызываться , так как нет подписи слота для него было указано; - снова с аргументом
checked
, поскольку вы вручную подключили его в своем коде;
Если вы хотите продолжать использовать автоматическое подключение, используйте уникальный слот-декоратор для , который специфицирует c функцию, в противном случае вручную подключите к функции (возможно, со слотом, если вам нужна спецификационная c подпись), которая не использует автоматическое подключение именования ионов, но не используют оба.
class askForPartnerUrl(QDialog):
def __init__(self):
super(askForPartnerUrl, self).__init__()
loadUi('askForPartnerURL.ui', self)
# ...
# remove the following lines:
# self.save_button.clicked.connect(self.on_save_button_clicked)
# self.later_button.clicked.connect(self.on_later_button_clicked)
# self.never_button.clicked.connect(self.on_never_button_clicked)
# manual connection
self.later_button.clicked.connect(self.saveLater)
# using the auto connection; the function doesn't need arguments, so
# you can ignore the argument type signature
@pyqtSlot()
def on_never_button_clicked(self):
addNeverID(getFromFile("id.txt"))
# ...
# with a normal function; in this case no slot decorator is required since
# you don't have arguments
def saveLater(self):
url_is_valid = False
# ...
PS: причина, по которой он "застревает", вероятно, связана с тем, как Python имеет дело с окончанием программа (которая по умолчанию происходит после закрытия последнего окна в Qt) в MacOS: после первого вызова close()
PyQt пытается выйти из QApplication (освободить память и т. д. c ...), но при этом исходное событие щелчка все еще находится в процессе запуска сигналов в оставшийся второй и третий слот, следовательно, «l oop» (но это не фактический l oop, и третий слот никогда не вызывается потому что это второй, который блокирует все).
Обратите внимание, что это упрощение большое , я не эксперт в использовании памяти и низкоуровневом программировании, но это принципиально то, что происходит.