Открыть новое окно при нажатии кнопки в PyQt5 (Qt Designer)

Я использую Qt Designer для создания своего приложения. Есть главное окно MainWindow и форма Dialog , которую я хотел бы открывать по нажатию кнопки. Где я должен написать метод (возможно, не в main.py, как я полагал, а в разметке) открывающий эту форму диалога и как он должен выглядеть? При создании приложения есть 2 файла: 1 . Разметка uidesign.py и 2 . Логика работы виджетов main.py main.py (кратко, без импортов):
class MyWin(QtWidgets.QMainWindow): def __init__(self, parent=None): QtWidgets.QWidget.__init__(self, parent) self.ui = Ui_MainWindow() # Экземпляр класса Ui_MainWindow, в нем конструктор всего GUI. self.ui.setupUi(self) # Инициализация GUI self.ui.pushButton.clicked.connect(self.openDialog) # Открыть новую форму def openDialog(self): pass
Отслеживать
73.5k 110 110 золотых знаков 38 38 серебряных знаков 55 55 бронзовых знаков
задан 13 июн 2019 в 6:23
Никита Виноградов Никита Виноградов
121 1 1 золотой знак 1 1 серебряный знак 12 12 бронзовых знаков
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
import sys from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(219, 62) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget) self.verticalLayout.setObjectName("verticalLayout") self.pushButton = QtWidgets.QPushButton(self.centralwidget) self.pushButton.setObjectName("pushButton") MainWindow.setCentralWidget(self.centralwidget) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.pushButton.setText(_translate("MainWindow", "click me")) class ClssDialog(QtWidgets.QDialog): def __init__(self, parent=None): super(ClssDialog, self).__init__(parent) self.verticalLayout = QtWidgets.QVBoxLayout(self) self.verticalLayout.setObjectName("verticalLayout") self.pushButton = QtWidgets.QPushButton(self) self.pushButton.setObjectName("pushButton") self.pushButton.clicked.connect(self.btnClosed) self.verticalLayout.addWidget(self.pushButton) self.setWindowTitle("Dialog") self.pushButton.setText("Close Dialog") def btnClosed(self): self.close() class MyWin(QtWidgets.QMainWindow): def __init__(self): super().__init__() self.ui = Ui_MainWindow() # Экземпляр класса Ui_MainWindow, в нем конструктор всего GUI. self.ui.setupUi(self) # Инициализация GUI self.ui.pushButton.clicked.connect(self.openDialog) # Открыть новую форму def openDialog(self): # pass dialog = ClssDialog(self) dialog.exec_() if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) window = MyWin() window.show() sys.exit(app.exec_())

Отслеживать
ответ дан 13 июн 2019 в 6:47
73.5k 110 110 золотых знаков 38 38 серебряных знаков 55 55 бронзовых знаков
- python
- pyqt5
- pyqt
- qt-designer
- qdialog
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.8.3130
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Диалоговые окна в PyQt5

Диалоговые окна (диалоги) являются неотъемлемой частью большинства современных графических приложений. Диалог в обычной жизни — это беседа между двумя и более людьми. В компьютерном приложении, диалог – это окно, которое используется, чтобы «беседовать» с приложением. Диалоги используются для ввода и изменения данных, изменения настроек приложения, и так далее.
QInputDialog
QInputDialog — простой удобный диалог для получения единственного значения от пользователя. Введённое значение может быть строкой, числом или пунктом из списка.
Пример имеет кнопку и виджет редактирования строки. Кнопка показывает диалог ввода. Вводимый текст может быть отображён в виджете редактирования строки.
Эта строка показывает диалог ввода. Первая строка – это заголовок диалога, вторая – сообщение внутри диалога. Диалог возвращает введённый текст и логическое значение. Если мы нажимаем кнопку «ОК», то логическое значение является правдой.
Текст, который мы получили из диалога, устанавливается в виджет редактирования строки.
QColorDialog
QColorDialog — виджет диалога для выбора цветовых значений.
" "Пример приложения показывает кнопку и QFrame. Фон виджета устанавливается чёрным. Используя QColorDialog, мы можем менять фон.
Это первоначальный цвет фона QtGui.QFrame.
Это строка высветит QColorDialog.
"Мы проверяем, является ли цвет валидным. Если мы нажимаем кнопку «Cancel», возвращается невалидный цвет. Если цвет валиден, мы меняем цвет фона, используя таблицы стилей (CSS).
QFontDialog
QFontDialog – это виджет диалога для выбора шрифта.
В нашем примере, мы имеем кнопку и метку. С помощью QFontDialog, мы меняем шрифт метки.
QFileDialog
QFileDialog – это диалог, который позволяет пользователям выбирать файлы или папки. Файлы могут быть выбраны и для открытия, и для сохранения.
Пример показывает строку меню, виджет редактирования текста и строку состояния. Пункт меню показывает QtGui.QFileDialog, который используется для выбора файла. Содержимое файла загружается в виджет редактирования текста.
Мы показываем QFileDialog. Первая строка в методе getOpenFileName() – это заголовок. Вторая строка указывает на показываемую директорию. По умолчанию, файловый фильтр установлен в положение «Все файлы (*)».
Выбранный файл читается и содержимое файла записывается в виджет редактирования текста.
В этой части руководства PyQt5, мы работали с диалогами.
Для вставки кода на Python в комментарий заключайте его в теги
- Модуль csv - чтение и запись CSV файлов
- Создаём сайт на Django, используя хорошие практики. Часть 1: создаём проект
- Онлайн-обучение Python: сравнение популярных программ
- Книги о Python
- GUI (графический интерфейс пользователя)
- Курсы Python
- Модули
- Новости мира Python
- NumPy
- Обработка данных
- Основы программирования
- Примеры программ
- Типы данных в Python
- Видео
- Python для Web
- Работа для Python-программистов
- Сделай свой вклад в развитие сайта!
- Самоучитель Python
- Карта сайта
- Отзывы на книги по Python
- Реклама на сайте
Как через кнопку открыть второе окно в PyQt5?
Здравствуйте, не могу разобраться с казалось бы банальным.
Есть файлыwindow_catalogue.py и add_product_to_catalogue.py, необходимо в окне windo_catalogue через условную кнопку "Открыть новое окно", открыть add_product_to_catalogue.
window_catalogue.py
import sys from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtWidgets import QTableWidgetItem import add_product_to_catalogue # Абсолютный путь временное решевние sys.path.append('C:/Python project/test') class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(1000, 800) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget) self.verticalLayout.setObjectName("verticalLayout") self.catalogue_table = QtWidgets.QTableWidget(self.centralwidget) self.catalogue_table.setObjectName("catalogue_table") self.catalogue_table.setColumnCount(5) self.catalogue_table.setRowCount(0) item = QtWidgets.QTableWidgetItem() item.setText("Штрих код") font = QtGui.QFont() font.setBold(False) font.setItalic(False) font.setUnderline(False) font.setWeight(50) font.setStrikeOut(False) font.setKerning(True) font.setStyleStrategy(QtGui.QFont.NoAntialias) item.setFont(font) self.catalogue_table.setHorizontalHeaderItem(0, item) item = QtWidgets.QTableWidgetItem() self.catalogue_table.setHorizontalHeaderItem(1, item) item = QtWidgets.QTableWidgetItem() self.catalogue_table.setHorizontalHeaderItem(2, item) item = QtWidgets.QTableWidgetItem() self.catalogue_table.setHorizontalHeaderItem(3, item) item = QtWidgets.QTableWidgetItem() self.catalogue_table.setHorizontalHeaderItem(4, item) self.catalogue_table.horizontalHeader().setCascadingSectionResizes(False) self.verticalLayout.addWidget(self.catalogue_table) self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") self.button_create = QtWidgets.QPushButton(self.centralwidget) self.button_create.setObjectName("button_create") self.horizontalLayout.addWidget(self.button_create) self.button_edit = QtWidgets.QPushButton(self.centralwidget) self.button_edit.setObjectName("button_edit") self.horizontalLayout.addWidget(self.button_edit) self.button_delete = QtWidgets.QPushButton(self.centralwidget) self.button_delete.setObjectName("button_delete") self.horizontalLayout.addWidget(self.button_delete) spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem) self.verticalLayout.addLayout(self.horizontalLayout) MainWindow.setCentralWidget(self.centralwidget) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "Каталог товаров")) item = self.catalogue_table.horizontalHeaderItem(1) item.setText(_translate("MainWindow", "Тип товара")) item = self.catalogue_table.horizontalHeaderItem(2) item.setText(_translate("MainWindow", "Название товара")) item = self.catalogue_table.horizontalHeaderItem(3) item.setText(_translate("MainWindow", "Цена закупки")) item = self.catalogue_table.horizontalHeaderItem(4) item.setText(_translate("MainWindow", "Описание")) self.button_create.setText(_translate("MainWindow", "Открыть другое окно")) self.button_edit.setText(_translate("MainWindow", "Редактировать")) self.button_delete.setText(_translate("MainWindow", "Удалить")) class Widget(QtWidgets.QMainWindow, Ui_MainWindow): def __init__(self, parent=None): super(Widget, self).__init__(parent) self.setupUi(self) self.output_data_in_table() self.catalogue_table.resizeColumnsToContents() # Блокируем возможность редактирования таблицы self.catalogue_table.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers) self.button_delete.clicked.connect(self.delete_row) self.button_create.clicked.connect(self.open_window) def output_data_in_table(self): pass def delete_row(self): """ Удаление выделеной строки """ index_row = self.catalogue_table.currentIndex().row() bar_code = self.catalogue_table.item(index_row, 0).text() self.catalogue_table.removeRow(index_row) print('строка удалена') def open_window(self): """ Открыть 2 окно """ new_window = add_product_to_catalogue() new_window.show() if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) w = Widget() w.show() sys.exit(app.exec_())
add_product_to_catalogue.py
from PyQt5 import QtCore, QtGui, QtWidgets, QtCore class Ui_window_add_to_catalogue(object): def setupUi(self, window_add_to_catalogue): """ Этот участок кода удалил, т.к. превышаю количество допустимых символов в форме сайта """ class Window(QtWidgets.QWidget, Ui_window_add_to_catalogue): """ Наследю класс созданый через qt designer """ def __init__(self, parent=None): super(Window, self).__init__(parent) self.setupUi(self) self.doublespibox_purchase_price.setButtonSymbols(QtWidgets.QAbstractSpinBox.NoButtons) self.lineedit_barcode.setInputMask("9999999999") self.lineedit_product_name.setMaxLength(40) self.button_create.clicked.connect(self.create) self.button_clear.clicked.connect(self.clear) item = ['1', '2', '3', '4', '5', '6', '7', '8'] self.combobox_product_tupe.addItems(item) def create(self): barcode = self.lineedit_barcode.text() name = self.lineedit_product_name.text() price = self.doublespibox_purchase_price.text() notes = self.textedit_description.toPlainText() product_type = self.combobox_product_tupe.currentText() data = [barcode, product_type, name, price, notes] print(data) def clear(self): """ Востанавливает окно к дефолтному состоянию, сбрасывает все данные введеные пользовательом """ self.lineedit_barcode.clear() self.lineedit_product_name.clear() self.doublespibox_purchase_price.setValue(0.00) self.textedit_description.clear() self.combobox_product_tupe.setCurrentIndex(0) if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) w = Window() w.show() sys.exit(app.exec_())
У меня просто вылетает приложение, и в консоли PyCharm отображается:
Process finished with exit code -1073740791 (0xC0000409)
- Вопрос задан более года назад
- 432 просмотра
Как открыть новое окно при нажатии на кнопку. QtDesinger
Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нем неправильно.
Необходимо обновить браузер или попробовать использовать другой.
Yahooo0
Новичок
Пользователь
Окт 17, 2020 1 0 1
Оc Windows 10 , Python 3.7.5
Спойлер: Версия библиотек
appdirs 1.4.4
certifi 2020.6.20
chardet 3.0.4
click 7.1.2
distlib 0.3.1
docutils 0.16
filelock 3.0.12
idna 2.10
importlib-metadata 2.0.0
Kivy 1.11.1
kivy-deps.glew 0.1.12
kivy-deps.sdl2 0.1.23
Kivy-Garden 0.1.4
pip 20.2.3
Pygments 2.7.1
pypiwin32 223
PyQt5 5.15.1
PyQt5-sip 12.8.1
PyQt5-stubs 5.14.2.2
pyqt5-tools 5.15.1.1.7.5
python-dotenv 0.14.0
pywin32 228
requests 2.24.0
setuptools 50.3.0
six 1.15.0
urllib3 1.25.10
virtualenv 20.0.32
wheel 0.35.1
zipp 3.3.0
Всем привет, я полный ноль в программировании и только изучаю язык Python. И изучать я решил сразу с практики, так как чтение книг для меня нудное задача. Решил для начала создать простое приложение в котором на главном окне есть кнопка и при нажатии на нее открывалась бы второе окно, а первое закрылось. В QtDesinger создал два окна и импортировал их в py файл. Далее создал файл test.py и импортировал туда классы из двух окон и по примерам с инета пробовал сделать действие при котором нажатие на кнопку открывал бы второе окно. Но выдает ошибку AttributeError: 'Ui_MainWindow' object has no attribute 'close'.
Код из test.py
from PyQt5 import QtWidgets, QtGui,QtCore from calk import Ui_MainWindow from calk2 import Ui_Form import sys class mywindow(QtWidgets.QMainWindow): def __init__(self): super(mywindow, self).__init__() self.ui = Ui_MainWindow() self.ui.setupUi(self) def show_mywindow(self): self.ui.pushButton.clicked.connect(self.show_mywindow2) self.ui.pushButton.clicked.connect(self.ui.close) self.ui.show() def show_mywindow2(self): self.ui2 = mywindow2() self.ui2.show() class mywindow2(QtWidgets.QMainWindow): def __init__(self): super(mywindow2, self).__init__() self.ui2 = Ui_Form() self.ui2.setupUi(self) if __name__ == '__main__': app = QtWidgets.QApplication(sys.argv) w = mywindow() w.show() w.show_mywindow() sys.exit(app.exec_())
Код из 1го окна сделанного в QtDesinger
from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(326, 342) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.label = QtWidgets.QLabel(self.centralwidget) self.label.setGeometry(QtCore.QRect(120, 0, 47, 13)) self.label.setObjectName("label") self.label_2 = QtWidgets.QLabel(self.centralwidget) self.label_2.setGeometry(QtCore.QRect(10, 30, 47, 13)) self.label_2.setObjectName("label_2") self.label_3 = QtWidgets.QLabel(self.centralwidget) self.label_3.setGeometry(QtCore.QRect(10, 60, 47, 13)) self.label_3.setObjectName("label_3") self.label_4 = QtWidgets.QLabel(self.centralwidget) self.label_4.setGeometry(QtCore.QRect(10, 90, 47, 13)) self.label_4.setObjectName("label_4") self.label_5 = QtWidgets.QLabel(self.centralwidget) self.label_5.setGeometry(QtCore.QRect(10, 120, 47, 13)) self.label_5.setObjectName("label_5") self.label_6 = QtWidgets.QLabel(self.centralwidget) self.label_6.setGeometry(QtCore.QRect(10, 150, 47, 13)) self.label_6.setObjectName("label_6") self.label_7 = QtWidgets.QLabel(self.centralwidget) self.label_7.setGeometry(QtCore.QRect(10, 180, 47, 13)) self.label_7.setObjectName("label_7") self.label_8 = QtWidgets.QLabel(self.centralwidget) self.label_8.setGeometry(QtCore.QRect(10, 210, 47, 13)) self.label_8.setObjectName("label_8") self.label_9 = QtWidgets.QLabel(self.centralwidget) self.label_9.setGeometry(QtCore.QRect(130, 30, 47, 13)) self.label_9.setObjectName("label_9") self.label_10 = QtWidgets.QLabel(self.centralwidget) self.label_10.setGeometry(QtCore.QRect(130, 60, 47, 13)) self.label_10.setObjectName("label_10") self.label_11 = QtWidgets.QLabel(self.centralwidget) self.label_11.setGeometry(QtCore.QRect(130, 90, 47, 13)) self.label_11.setObjectName("label_11") self.label_12 = QtWidgets.QLabel(self.centralwidget) self.label_12.setGeometry(QtCore.QRect(130, 120, 47, 13)) self.label_12.setObjectName("label_12") self.label_13 = QtWidgets.QLabel(self.centralwidget) self.label_13.setGeometry(QtCore.QRect(130, 150, 47, 13)) self.label_13.setObjectName("label_13") self.label_14 = QtWidgets.QLabel(self.centralwidget) self.label_14.setGeometry(QtCore.QRect(130, 180, 47, 13)) self.label_14.setObjectName("label_14") self.label_15 = QtWidgets.QLabel(self.centralwidget) self.label_15.setGeometry(QtCore.QRect(130, 210, 47, 13)) self.label_15.setObjectName("label_15") self.pushButton = QtWidgets.QPushButton(self.centralwidget) self.pushButton.setGeometry(QtCore.QRect(240, 260, 75, 23)) self.pushButton.setObjectName("pushButton") MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 326, 21)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.label.setText(_translate("MainWindow", "TextLabel")) self.label_2.setText(_translate("MainWindow", "TextLabel")) self.label_3.setText(_translate("MainWindow", "TextLabel")) self.label_4.setText(_translate("MainWindow", "TextLabel")) self.label_5.setText(_translate("MainWindow", "TextLabel")) self.label_6.setText(_translate("MainWindow", "TextLabel")) self.label_7.setText(_translate("MainWindow", "TextLabel")) self.label_8.setText(_translate("MainWindow", "TextLabel")) self.label_9.setText(_translate("MainWindow", "TextLabel")) self.label_10.setText(_translate("MainWindow", "TextLabel")) self.label_11.setText(_translate("MainWindow", "TextLabel")) self.label_12.setText(_translate("MainWindow", "TextLabel")) self.label_13.setText(_translate("MainWindow", "TextLabel")) self.label_14.setText(_translate("MainWindow", "TextLabel")) self.label_15.setText(_translate("MainWindow", "TextLabel")) self.pushButton.setText(_translate("MainWindow", "ok"))
Код из 2го окна
from PyQt5 import QtCore, QtGui, QtWidgets class Ui_Form(object): def setupUi(self, Form): Form.setObjectName("Form") Form.resize(313, 294) self.label = QtWidgets.QLabel(Form) self.label.setGeometry(QtCore.QRect(120, 10, 47, 13)) self.label.setObjectName("label") self.label_2 = QtWidgets.QLabel(Form) self.label_2.setGeometry(QtCore.QRect(20, 50, 47, 13)) self.label_2.setObjectName("label_2") self.label_3 = QtWidgets.QLabel(Form) self.label_3.setGeometry(QtCore.QRect(110, 50, 47, 13)) self.label_3.setObjectName("label_3") self.label_4 = QtWidgets.QLabel(Form) self.label_4.setGeometry(QtCore.QRect(210, 50, 47, 13)) self.label_4.setObjectName("label_4") self.label_5 = QtWidgets.QLabel(Form) self.label_5.setGeometry(QtCore.QRect(60, 120, 47, 13)) self.label_5.setObjectName("label_5") self.label_6 = QtWidgets.QLabel(Form) self.label_6.setGeometry(QtCore.QRect(190, 120, 47, 13)) self.label_6.setObjectName("label_6") self.label_7 = QtWidgets.QLabel(Form) self.label_7.setGeometry(QtCore.QRect(130, 190, 47, 13)) self.label_7.setObjectName("label_7") self.retranslateUi(Form) QtCore.QMetaObject.connectSlotsByName(Form) def retranslateUi(self, Form): _translate = QtCore.QCoreApplication.translate Form.setWindowTitle(_translate("Form", "Form")) self.label.setText(_translate("Form", "TextLabel")) self.label_2.setText(_translate("Form", "TextLabel")) self.label_3.setText(_translate("Form", "TextLabel")) self.label_4.setText(_translate("Form", "TextLabel")) self.label_5.setText(_translate("Form", "TextLabel")) self.label_6.setText(_translate("Form", "TextLabel")) self.label_7.setText(_translate("Form", "TextLabel"))
Ошибка при запуске программы
Спойлер: Ошибка
Traceback (most recent call last):
File "C:/docs/asd.py", line 34, in
w.show_mywindow()
File "C:/docs/asd.py", line 14, in show_mywindow
self.ui.pushButton.clicked.connect(self.ui.close)
AttributeError: 'Ui_MainWindow' object has no attribute 'close'
Process finished with exit code 1