Python

PyQt6/PySide6 ошибка пропущенного аргумента

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

вся суть вопроса:
https://ru.stackoverflow.com/questions/1539413/pyqt6-pyside6-ошибка-пропущенного-аргумента
Проблема заключается в том, что в методе adding_balance вы создаете новый экземпляр QDialog и пытаетесь применить к нему UI через вызов self.ui.setupUi(self.window2). Однако, в этот момент self.ui уже переопределена в вашем основном классе Bank, что вызывает конфликт.

Вы можете решить проблему, изолируя UI для каждого окна в отдельные атрибуты. Например:

 class Bank(QMainWindow): 
def __init__(self, window2):
super(Bank, self).__init__()
self.main_ui = Ui_MainWindow() # Изменил здесь
self.main_ui.setupUi(self) # И здесь
self.window2 = window2

# Остальной код...

def adding_balance(self):
self.window2 = QDialog()
self.adding_ui = AddingDialog() # Изменил здесь
self.adding_ui.setupUi(self.window2) # И здесь
self.window2.show()

# Остальной код...
Теперь, когда вы вызываете adding_balance, self.adding_ui.setupUi(self.window2) не будет конфликтовать с self.main_ui.

В целом, каждый экземпляр диалогового окна или главного окна должен иметь свой собственный Ui класс. Это улучшит структуру вашего кода и устранит подобные конфликты.
Жасулан Орынбайулы
Жасулан Орынбайулы
3 288
Лучший ответ
Добавить аргумент

При включении без этой строки:

self.ui.setupUi(self)
self.ui.setupUi(self, self)

и в adding_balance(self) добавить:

self.ui.setupUi(self.window2, self.window2)
Евгений Болтин Так window2 вне области видимости adding_balance. Adding_balance задет window2 изначально, я никак не могу его передать
Евгений Болтин А ой, извиняюсь, напутал
Попробую
Проблема, которую вы описываете, связана с отсутствием передачи аргументов в функцию обработчика кнопки. Когда вы подключаете функцию-обработчик к кнопке, она должна иметь определенную сигнатуру с заданными аргументами, иначе возникает ошибка.

Вот пример кода, в котором кнопка открывает всплывающее диалоговое окно:


from PyQt6.QtWidgets import QApplication, QMainWindow, QDialog, QPushButton

class Dialog(QDialog):
def __init__(self, parent=None):
super().__init__(parent)
self.setWindowTitle('Dialog')

class MainWindow(QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)

button = QPushButton('Open Dialog', self)
button.clicked.connect( self.open _dialog)

def open_dialog(self):
dialog = Dialog(self)
dialog.exec()

app = QApplication([])
window = MainWindow()
window.show()
app.exec()


Здесь мы создаем главное окно `MainWindow` и кнопку `Open Dialog`. При нажатии на кнопку вызывается метод `open_dialog`, который создает и отображает всплывающее диалоговое окно `Dialog`.

Важно отметить, что метод `open_dialog` не принимает никаких аргументов в данном примере.

Убедитесь, что вы передаете правильные аргументы в функцию обработчика кнопки и что ваша функция имеет правильную сигнатуру (включая необходимые аргументы).

Если у вас возникнут дополнительные вопросы или проблемы, пожалуйста, уточните их.
Потому что экземпляр класса нужно создать, а не просто класс впихнуть.

Не
 self.ui = AddingDialog 
А
 self.ui = AddingDialog() 
NZ
Nurdaulet Zhaksilik
34 941
Для создания всплывающего диалогового окна в PyQt6/PySide6, которое будет открываться при нажатии кнопки из главного окна, вы можете использовать следующий шаблонный код:

Создайте файл с вашим главным окном, сгенерированным с помощью Qt Designer (назовем его main_window.ui).

Создайте еще один файл для вашего всплывающего диалогового окна (например, dialog.ui) с помощью Qt Designer. В этом окне вы можете разместить необходимые элементы управления и настройки.

Компилируйте файлы .ui в Python-код с помощью pyuic6. Вы можете выполнить следующую команду в командной строке:

bash
Copy code
pyuic6 main_window.ui -o main_window_ui.py
pyuic6 dialog.ui -o dialog_ui.py
Создайте файл Python для вашего приложения и используйте их следующим образом:
python
Copy code
import sys
from PyQt6.QtWidgets import QApplication, QMainWindow, QDialog
from main_window_ui import Ui_MainWindow
from dialog_ui import Ui_Dialog

class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.ui.openDialogButton.clicked.connect(self.open_dialog)

def open_dialog(self):
dialog = QDialog(self)
dialog_ui = Ui_Dialog()
dialog_ui.setupUi(dialog)
result = dialog.exec()

def main():
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())

if __name__ == '__main__':
main()
В этом коде open_dialog метод связывает кнопку "openDialogButton" из главного окна с функцией open_dialog, которая создает и открывает всплывающее диалоговое окно. Вы можете настроить содержимое диалогового окна в файле dialog.ui и добавить необходимую логику обработки событий.

Запустите ваше приложение с помощью python ваш_файл.py.

Теперь у вас должно быть всплывающее диалоговое окно, которое открывается при нажатии кнопки в вашем главном окне.