С Новым годом! Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.70/30: Рейтинг темы: голосов - 30, средняя оценка - 4.70
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
PyQt5

Как создать заново и показать вторую форму в модальном режиме?

03.09.2021, 08:57. Показов 6469. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем здравствуйте.

Вторая форма находится в файле second_form.py:
Python
1
2
3
4
5
6
7
8
9
10
11
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
 
class SecondForm(QDialog):
    def __init__(self, parent):
        super().__init__(parent)
        self.setWindowTitle('Вторая форма')
        self.resize(200, 200)
        self.setAttribute(Qt.WA_DeleteOnClose)
        self.setModal(True)
Первая стартовая форма:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
 
import second_form
 
class DlgMain(QDialog):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('Заголовок главного окна приложения')
        self.resize(400, 300)
 
        self.btnUpdate = QPushButton('Создать заново и показать вторую форму', self)
        self.btnUpdate.setGeometry(50, 200, 300, 50)
        self.btnUpdate.clicked.connect(self.evt_btn_update_clicked)  # Подсоединяем обработчик события clicked кнопки
 
    def evt_btn_update_clicked(self):
        dlg_second = SecondForm(self)  # Создание Второго окна приложения
        dlg_second.show()
 
 
if __name__ == '__main__':
    app = QApplication(sys.argv)
    dlgMain = DlgMain()
    dlgMain.show()
    sys.exit(app.exec_())
Вторая форма каждый раз при закрытии по крестику (а лучше по своей особой кнопке) должна гарантированно уничтожаться.
Что не так? Что лишнее? Как из первой формы увидеть переменную, изменённую во второй форме?

Добавлено через 3 минуты
Я ужен задавал подобный вопрос, но теперь задача изменилась. Вторая форма находится в отдельном файле.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.09.2021, 08:57
Ответы с готовыми решениями:

Работа с Assigned - создать вторую форму, показать и закрыть
Создается форма- form2 := TForm2.Create(Owner); form2.ShowModal(); form2.Free; Потом закрываю форм2. Нажимаю кнопку - ...

Как показать вторую форму
Всем Привет Вопрос :как использовать Form2 Socket e внизу отметил код на красный цвет using System; using...

Как показать вторую форму
Сделал 2 форму "About", а как сделать так чтобы при нажатии на первой форме кнопки вылазила вторая ? Вещаю обработчик на первой форме: ...

30
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
03.09.2021, 09:10
Цитата Сообщение от jkrnd Посмотреть сообщение
Что не так?
А что не так? Ну вызови exec() вместо show(). Точно прибьется по закрытию.
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
03.09.2021, 10:24  [ТС]
iSmokeJC, вот скрин:
Миниатюры
Как создать заново и показать вторую форму в модальном режиме?  
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
03.09.2021, 10:30
jkrnd, у меня твой код работает. На линуксе правда.

Добавлено через 4 минуты
Попробуй exec(). И setModal() убери, она и так модальная будет
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
03.09.2021, 10:35  [ТС]
Цитата Сообщение от iSmokeJC Посмотреть сообщение
Попробуй exec()
попробовал
Цитата Сообщение от iSmokeJC Посмотреть сообщение
setModal() убери
убрал
тот же результат

Добавлено через 1 минуту
вот так всё работает. Разделить на два файла не могу:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
 
 
class DlgMain(QDialog):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('Заголовок окна')
        self.resize(400, 300)
 
        self.btnUpdate = QPushButton('Показать вторую форму', self)
        self.btnUpdate.setGeometry(150, 200, 200, 30)
        self.btnUpdate.clicked.connect(self.evt_btn_update_clicked)  # Подсоединяем обработчик события clicked кнопки
 
    def evt_btn_update_clicked(self):
        dlg_second = SecondForm(self)  # Создание Второго окна приложения
        dlg_second.show()
 
 
class SecondForm(QDialog):
    def __init__(self, parent):
        super().__init__(parent)
        self.setWindowTitle('Вторая форма')
        self.resize(200, 200)
        self.setAttribute(Qt.WA_DeleteOnClose)
        self.setModal(True)
 
 
if __name__ == '__main__':
    app = QApplication(sys.argv)
    dlgMain = DlgMain()
    dlgMain.show()
    sys.exit(app.exec_())
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
03.09.2021, 10:37
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import sys
from PySide2 import QtWidgets, QtCore, QtGui
 
 
class SecondForm(QtWidgets.QDialog):
    def __init__(self, parent: QtWidgets.QWidget = None):
        QtWidgets.QDialog.__init__(self, parent)
        self.setWindowTitle('Вторая форма')
        self.resize(200, 200)
 
 
class DlgMain(QtWidgets.QDialog):
    def __init__(self, parent: QtWidgets.QWidget = None):
        QtWidgets.QDialog.__init__(self, parent)
        self.setWindowTitle('Заголовок главного окна приложения')
        self.resize(400, 300)
 
        self.btnUpdate = QtWidgets.QPushButton('Создать заново и показать вторую форму', self)
        self.btnUpdate.setGeometry(50, 200, 300, 50)
        self.btnUpdate.clicked.connect(self.evt_btn_update_clicked)
 
    def evt_btn_update_clicked(self):
        SecondForm(self).exec_()
 
 
if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    dlgMain = DlgMain()
    dlgMain.show()
    sys.exit(app.exec_())
1
290 / 205 / 68
Регистрация: 18.09.2019
Сообщений: 407
Записей в блоге: 58
03.09.2021, 11:19
Цитата Сообщение от jkrnd Посмотреть сообщение
Вторая форма каждый раз при закрытии по крестику (а лучше по своей особой кнопке) должна гарантированно уничтожаться.
jkrnd, ведь по умолчанию виджеты вообще не уничтожаются. У себя в блоге я проводил маленькое исследование https://www.cyberforum.ru/blog... g7193.html, но разработчики Qt, как я понял, всё же не рекомендуют использовать атрибут WA_DeleteOnClose. И в общем случае после выполнения close() виджет просто переходит в состояние hidden и до него можно достучаться.
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
03.09.2021, 11:36  [ТС]
Fudthhh, мне нужно чтобы код
Python
1
2
3
4
5
class SecondForm(QtWidgets.QDialog):
    def __init__(self, parent: QtWidgets.QWidget = None):
        QtWidgets.QDialog.__init__(self, parent)
        self.setWindowTitle('Вторая форма')
        self.resize(200, 200)
находился в отдельном файле с именем second_form.py
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
03.09.2021, 13:07
Лучший ответ Сообщение было отмечено jkrnd как решение

Решение

jkrnd, ак сделай импорт нужных виджетов и размести его там, я не вижу проблемы.

Добавлено через 3 минуты
Как можно писать GUI если даже элементарные основы не разобраны:

second_form.py
Python
1
2
3
4
5
6
7
8
from PySide2 import QtWidgets, QtCore, QtGui
 
 
class SecondForm(QtWidgets.QDialog):
    def __init__(self, parent: QtWidgets.QWidget = None):
        QtWidgets.QDialog.__init__(self, parent)
        self.setWindowTitle('Вторая форма')
        self.resize(200, 200)
main.py
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import sys
from second_form import SecondForm
from PySide2 import QtWidgets, QtCore, QtGui
 
 
class DlgMain(QtWidgets.QDialog):
    def __init__(self, parent: QtWidgets.QWidget = None):
        QtWidgets.QDialog.__init__(self, parent)
        self.setWindowTitle('Заголовок главного окна приложения')
        self.resize(400, 300)
 
        self.btnUpdate = QtWidgets.QPushButton('Создать заново и показать вторую форму', self)
        self.btnUpdate.setGeometry(50, 200, 300, 50)
        self.btnUpdate.clicked.connect(self.evt_btn_update_clicked)
 
    def evt_btn_update_clicked(self):
        SecondForm(self).exec_()
 
 
if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    dlgMain = DlgMain()
    dlgMain.show()
    sys.exit(app.exec_())
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
03.09.2021, 13:43  [ТС]
Похоже что так писать нельзя:
Python
1
import second_form
А нужно так:
Python
1
from second_form import SecondForm
Или так:
Python
1
from second_form import *
А что означает
Python
1
parent: QtWidgets.QWidget = None
в конструкторе?

Добавлено через 15 минут
Добавив
Python
1
print('Создана вторая форма')
в конструктор второй формы я вижу что она каждый раз создаётся заново. А куда мне добавить
Python
1
print('Уничтожена вторая форма')
Есть ли в Python нечто подобное событиям OnQueryUnload, OnQueryQlose, OnUnload, OnQlose?
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
03.09.2021, 14:59
Цитата Сообщение от jkrnd Посмотреть сообщение
Похоже что так писать нельзя:
Можно, тогда вызов будет таким:
Python
1
second_form.SecondForm(self).exec_()
Цитата Сообщение от jkrnd Посмотреть сообщение
parent: QtWidgets.QWidget = None
Читай про аннотации

Цитата Сообщение от jkrnd Посмотреть сообщение
в конструктор второй формы я вижу что она каждый раз создаётся заново.
Цитата Сообщение от jkrnd Посмотреть сообщение
Вторая форма каждый раз при закрытии по крестику (а лучше по своей особой кнопке) должна гарантированно уничтожаться.
В чем проблема?
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
03.09.2021, 15:05  [ТС]
Цитата Сообщение от Fudthhh Посмотреть сообщение
В чем проблема?
1. Сделать на второй форме кнопку с функцией закрытия второй формы.
2. Где можно отследить что вторая форма выгружается?
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
03.09.2021, 15:13
jkrnd,

1) Создать кнопку, прикрепить ей сигнал self.close
2) Можно переопределить метод self.closeEvent и добавить туда self.deleteLeter()
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
03.09.2021, 15:55  [ТС]
Fudthhh, Спасибо.

Не по теме:

Я нечаянно щёлкнул не по той cсылке и таким образом не желая этого отписался от рассылки по этой теме.

0
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
06.09.2021, 08:15  [ТС]
Почему я не могу создать вторую форму как QMainWindows, только как QDialog?
Вот так всё работает:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# first_form.py
import sys
from second_form import *
from PyQt5 import QtWidgets, QtCore, QtGui
 
class DlgMain(QtWidgets.QDialog):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('Заголовок главного окна приложения')
        self.resize(400, 300)
 
        self.btn1 = QtWidgets.QPushButton('Создать заново и показать вторую форму', self)
        self.btn1.setGeometry(50, 130, 300, 50)
        self.btn1.clicked.connect(self.evt_btn1_clicked)
 
    def evt_btn1_clicked(self):
        form2 = SecondForm(self) 
        form2.exec_()               
        # SecondForm(self).exec_()  # Можно и без создания экземпляра
 
 
if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    dlgMain = DlgMain()
    dlgMain.show()
    sys.exit(app.exec_())
и вторая форма:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# second_form.py
from PyQt5 import QtWidgets, QtCore, QtGui
 
class SecondForm(QtWidgets.QDialog):
    def __init__(self, parent):
        super().__init__(parent)
        print('Создана вторая форма')
        self.setWindowTitle('Вторая форма')
        self.resize(200, 200)
 
        self.btnClose = QtWidgets.QPushButton('Закрыть вторую форму', self)
        self.btnClose.setGeometry(20, 50, 170, 50)
        self.btnClose.clicked.connect(self.evt_btn_close_clicked)
 
    def evt_btn_close_clicked(self):
        self.close()
Стоит поменять во второй форме QDialog на QMainWindows - вылет из приложения.
0
290 / 205 / 68
Регистрация: 18.09.2019
Сообщений: 407
Записей в блоге: 58
06.09.2021, 11:55
Ну дыкть
Code
1
2
3
4
5
6
user@linux:~/projects/qtprobe> python3 first_form.py
Создана вторая форма
Traceback (most recent call last):
  File "first_form.py", line 18, in evt_btn1_clicked
    form2.exec_()               
AttributeError: 'SecondForm' object has no attribute 'exec_'
нету метода exec_() у класса QMainWindow() - пользуйте show().
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
07.09.2021, 08:33  [ТС]
iamvic, Если не трудно, посмотрите мой проект. Выкладываю целиком в архиве. Если запускаем файл q_calendar.py - всё работает. Если запускаем файл first_form.py в надежде из него запустить форму-календарь - приложение вылетает ничего не сообщая. Хотелось бы оставить файл q_calendar.py без изменений. Пусть обе формы будут не QDialog, а QMainWindow.
Вложения
Тип файла: rar Ver1.5.rar (16.8 Кб, 10 просмотров)
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
07.09.2021, 08:50
jkrnd, я думаю стоит отложить GUI и пробежаться по основам, на каждый чих вопрос задаешь, смысл дальше тебе "помогать", приложение не может просто вылететь, всегда есть как минимум код ошибки.
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
07.09.2021, 09:50  [ТС]
Fudthhh, подскажите пожалуйста какие лучше видеокурсы или книги. То что я читал и смотрел ответы на мои вопросы не даёт.
0
290 / 205 / 68
Регистрация: 18.09.2019
Сообщений: 407
Записей в блоге: 58
10.09.2021, 11:05
Лучший ответ Сообщение было отмечено jkrnd как решение

Решение

jkmd, Вы знаете - самое смешное, что ошибки-то в Вашем приложении нет.
Вы получвете ровно то, что заказали. То есть с точки зрения Qt ситуация вполне штатная -
в first_form.py Вы открываете окно верхнего уровня (родителя нет, предок QMainWindow),
а затем по нажатию кнопки открываете второе окно верхнего уровня (тоже родителя нет,
предок тоже QMainWindow). У меня на Windows под VirtualBox это второе окошко даже
промаргивается и тут же исчезает. Qt его просто душит, наверное, потому что подклассы
наследуются от одного и того же предка. Это такие такие особенности поведения окон
верхнего уровня. Если не лень, то могу предложить пошарить у меня в блоге -
записывал я себе в склерозник те ситуации когда нарывался на подобное.
Поэтому требование явного указания наличия или отсутствия родителей вполне обосновано.
Хотя, с другой стороны, Qt полон противоречий

А в Ваших текстах можно сделать такие изменения:

first_form.py
Python
1
2
3
4
    def evt_btn1_clicked(self):
        # form = Calendar()  # Создание экземпляра класса Calendar
        form = Calendar(self)  # Создание экземпляра класса Calendar
        form.show()        # Показать форму
q_calendar.py
Python
1
2
3
4
5
    # Конструктор класса
    # def __init__(self):
        # super().__init__()  # Вызов конструктора класса-родителя
    def __init__(self, parent=None):
        super(Calendar, self).__init__(parent)  # Вызов конструктора класса-родителя
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.09.2021, 11:05
Помогаю со студенческими работами здесь

Как показать вторую форму из первой
Подскажите пожалуйста, что нужно чтобы банально вызвать форму из другой формы? Из кода в этой теме я понял, что форма вызывается...

Как показать вторую форму справа от первой?
Как показать вторую форму справа от первой ? на скрине пример

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

Открыть форму в модальном режиме
Как это сделать. При нажатии кнопки - чтобы открывалось уже созданное окно (форма) с названием About. Варианты, которые нашел на...

Заново показать форму после завершения стороннего процесса, запущенного из нее
Добрый день! Имеется форма, из которой запускается программа через WinExec. При запуске программы, форма невидима, пока работает программа....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru