Как закрыть окно qt python
На этом шаге мы рассмотрим реализацию этой операции .
В предыдущих шагах для закрытия окна мы использовали слот quit() и метод exit([returnCode=0]) объекта приложения. Однако эти методы не только закрывают текущее окно, но и завершают выполнение всего приложения. Чтобы закрыть только текущее окно, следует воспользоваться методом close() класса QWidget . Метод возвращает значение True , если окно успешно закрыто, и False — в противном случае. Закрыть сразу все окна приложения позволяет слот closeAllWindows() класса QApplication .
Если для окна атрибут WA_DeleteOnClose из класса QtCore.Qt установлен в значение True , то после закрытия окна объект окна будет автоматически удален, в противном случае окно просто скрывается. Значение атрибута можно изменить с помощью метода setAttribute() :
window.setAttribute(QtCore.Qt.WA_DeleteOnClose, True)
После вызова метода close() или нажатия кнопки Закрыть в заголовке окна генерируется событие QEvent.Close . Если внутри класса определить метод с предопределенным названием closeEvent() , то это событие можно перехватить и обработать. В качестве параметра метод принимает объект класса QCloseEvent , который содержит методы accept() (позволяет закрыть окно) и ignore() (запрещает закрытие окна). Вызывая эти методы, можно контролировать процесс закрытия окна.
В качестве примера закроем окно по нажатию кнопки.
# -*- coding: utf-8 -*- from PyQt5 import QtCore, QtWidgets import sys app = QtWidgets.QApplication(sys.argv) window = QtWidgets.QWidget(flags=QtCore.Qt.Dialog) window.setWindowTitle("Закрытие окна из программы") window.resize(300, 70) button = QtWidgets.QPushButton("Закрыть окно", window) button.setFixedSize(150, 30) button.move(75, 20) button.clicked.connect(window.close) window.show() sys.exit(app.exec_())
Архив с файлом можно взять здесь.
Внешний вид приложения изображен на рисунке 1.
Рис.1. Внешний вид приложения
Примечание . Закрыв последнее окно приложения, мы тем самым автоматически завершим и само приложение. Не забывайте об этом.
Со следующего шага мы начнем рассматривать обработку сигналов и событий .
PyQt5 закрытие окна не прерывающее скрипт
Здравствуйте! Мне нужно вывести PyQt окно подождать пока юзер нажмёт на кнопку, закрыть окно и продолжить скрипт. Кто знает как это сделать?
Отслеживать
задан 24 фев 2017 в 18:15
user235381 user235381
19 1 1 серебряный знак 6 6 бронзовых знаков
Именно так и делать — вывести окно, закрыть окно и продолжить скрипт не убивая его через sys.exit(. ) или же отловил вызванное этой функцией исключение SystemExit .
24 фев 2017 в 18:58
Можно поподробнее?
25 фев 2017 в 7:23
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Перепробовал все варианты, и понял, что лучше всего подходит метод close()
Отслеживать
ответ дан 25 фев 2017 в 11:01
user235381 user235381
19 1 1 серебряный знак 6 6 бронзовых знаков
Ну, в общем-то да, вызвать close() при нажатии на кнопку и продолжить без принудительного завершения скрипта sys.exit(. ) . Все правильно, мне добавить нечего. Думаю, пример уже не нужен?
25 фев 2017 в 21:55
А что если как-то так:
import sys from PyQt5.QtCore import QPropertyAnimation, Qt, QRectF from PyQt5.QtGui import QFontDatabase from PyQt5.QtWidgets import (QPushButton, QApplication, QStyleOptionButton, QStylePainter, QStyle) class PushButtonFont(QPushButton): LoadingText = "\uf110" def __init__(self, *args, **kwargs): super(PushButtonFont, self).__init__(*args, **kwargs) self.resize(250, 250) self.fontSize = self.font().pointSize() * 2 self._rotateAnimationStarted = False self._rotateAnimation = QPropertyAnimation(self) self._rotateAnimation.setTargetObject(self) self._rotateAnimation.setStartValue(1) self._rotateAnimation.setEndValue(12) self._rotateAnimation.setDuration(1000) self._rotateAnimation.setLoopCount(-1) # Бесконечная петля self._rotateAnimation.valueChanged.connect(self.update) self.clicked.connect(self._onClick) def paintEvent(self, _): option = QStyleOptionButton() self.initStyleOption(option) painter = QStylePainter(self) if self._rotateAnimationStarted: option.text = "" painter.drawControl(QStyle.CE_PushButton, option) if not self._rotateAnimationStarted: return painter.save() font = self.font() font.setPointSize(self.fontSize) font.setFamily("FontAwesome") painter.setFont(font) # преобразовать координаты в середину painter.translate(self.rect().center()) # поворот на 90 градусов painter.rotate(self._rotateAnimation.currentValue() * 30) fm = self.fontMetrics() # Положительный средний текст после преобразования координат w = fm.width(self.LoadingText) h = fm.height() painter.drawText( QRectF(0 - w * 2, 0 - h, w * 2 * 2, h * 2), Qt.AlignCenter, self.LoadingText) painter.restore() def _onClick(self): if self._rotateAnimationStarted: self._rotateAnimationStarted = False self._rotateAnimation.stop() return self._rotateAnimationStarted = True self._rotateAnimation.start() def update(self, _=None): super(PushButtonFont, self).update() if __name__ == "__main__": app = QApplication(sys.argv) # Загрузка шрифтов в библиотеку шрифтов QFontDatabase.addApplicationFont( "Fonts/FontAwesome/fontawesome-webfont.ttf") w = PushButtonFont("Нажмите, чтобы загрузить " "fa_spinner") w._onClick() w.show() sys.exit(app.exec_())
Отслеживать
ответ дан 22 окт 2018 в 23:05
72.6k 105 105 золотых знаков 38 38 серебряных знаков 55 55 бронзовых знаков
- python
- pyqt5
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.10.27.43697
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Закрыть окно при потере фокуса pyqt5
Кто нибудь, подскажите как закрыть простое окно при потере фокуса?
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 35 36 37 38 39 40 41
#!/usr/bin/python3 import sys from PyQt5.QtWidgets import QApplication, QWidget from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QLabel from PyQt5 import QtCore def text(): with open("/home/al/programs/py/weather/text_file", "r") as f: return f.read() class Example(QWidget): def __init__(self): super().__init__() self.setWindowFlag(Qt.FramelessWindowHint) self.setWindowTitle('no title') self.setGeometry(1030, 0, 300, 200) self.setWindowOpacity(0.9) self.label = QLabel(self) self.label.setText(text()) self.label.setStyleSheet("background-color: none") self.label.setMargin(15) app = QApplication(sys.argv) w = Example() w.show() def change_text(): w.label.setText(text()) timer = QtCore.QTimer() timer.timeout.connect(change_text) timer.start(3000) sys.exit(app.exec_())
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Закрыть форму при потере фокуса
Простое применение Private Sub Form_LostFocus() DoCmd.Close acForm, Me.Name End Sub выдаёт.
Вычисления при потере фокуса
Как запрограммировать вычисление на потерю фокуса? Когда я нажимаю на закрытие или другие кнопки.
Задержка при потере фокуса
Добрый день! Небольшой контрол, по умолчанию выглядит примерно так: При наведении курсора.
Переход на страницу при потере фокуса
Привет всем. Подскажите пожалуйста следующее. Вот код: <form method="post".
Действие при потере фокуса окна
Всем привет. Пишу программу-тесты на С++. Для того, чтобы отвечали на вопросы честно, появилась.
Python-сообщество
- Начало
- » GUI
- » Как правильно закрыть дочернее окна и открыть главное PyQt
#1 Янв. 14, 2019 19:16:24
gtandrey Зарегистрирован: 2019-01-14 Сообщения: 2 Репутация: 0 Профиль Отправить e-mail
Как правильно закрыть дочернее окна и открыть главное PyQt
Помогите решить вопрос, уже 3 дня ищу решение
Есть Главная форма на ней кнопка, чтобы открыть второе окно с настройками и скрыть главную форму
Во втором окне есть 2 кнопки отмена и применить
соответственно они закрывают второе окно и открывают главное
но к сожалению при нажатии кнопки cancel во втором окне закрывается и главное и второе окно
import sys from form_main import * from form_day import * from PyQt5 import QtCore, QtGui, QtWidgets class FormMain(QtWidgets.QMainWindow): def __init__(self, parent=None): QtWidgets.QWidget.__init__(self, parent) self.ui = Ui_form_main() self.ui.setupUi(self) self.ui.ButtonDay.clicked.connect(self.show_form_day) def show_form_day(self): self.form_day = FormDay(self) self.form_day.show() class FormDay(QtWidgets.QMainWindow): def __init__(self, parent=None): QtWidgets.QWidget.__init__(self, parent) self.form_day = Ui_form_day() self.form_day.setupUi(self) #. настройки form_main.hide() if __name__=="__main__": app = QtWidgets.QApplication(sys.argv) form_main = FormMain() form_main.show() sys.exit(app.exec_())
from PyQt5 import QtCore, QtGui, QtWidgets class Ui_form_day(object): def setupUi(self, form_day): form_day.setObjectName("form_day") form_day.resize(1024, 600) self.centralwidget = QtWidgets.QWidget(form_day) self.ButtonCancel.setFont(font) self.ButtonCancel.setStyleSheet("") self.ButtonCancel.setObjectName("ButtonCancel") #. self.ButtonCancel.clicked.connect(self.push_button_cancel) self.ButtonApply.clicked.connect(self.push_button_apply) def push_button_cancel(self): print('cancel') form_main.show() self.hide()