Перейти к содержимому

Как закрыть окно qt python

  • автор:

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
73.6k 110 110 золотых знаков 38 38 серебряных знаков 55 55 бронзовых знаков

  • python
  • pyqt5
    Важное на Мете
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.3.2953

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Как закрыть окно 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. Внешний вид приложения

Примечание . Закрыв последнее окно приложения, мы тем самым автоматически завершим и само приложение. Не забывайте об этом.

Со следующего шага мы начнем рассматривать обработку сигналов и событий .

Python-сообщество

[RSS Feed]

  • Начало
  • » GUI
  • » Закрыть окно при потере фокуса pyqt5

#1 Март 25, 2022 03:14:24

almax Зарегистрирован: 2018-09-21 Сообщения: 9 Репутация: 0 Профиль Отправить e-mail

Закрыть окно при потере фокуса pyqt5

Если взять простое окно, как сделать так, что бы при потере фокуса оно закрывалось?

import sys from PyQt5.QtWidgets import QApplication, QWidget from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QLabel class Example(QWidget): def __init__(self): super().__init__() self.setWindowFlag(Qt.FramelessWindowHint) self.setWindowTitle('no title') self.setGeometry(1030, 0, 300, 200) self.label = QLabel(self) self.label.setText('text') app = QApplication(sys.argv) w = Example() w.show() sys.exit(app.exec_()) 

#2 Март 25, 2022 13:03:41

Rodegast От: Пятигорск Зарегистрирован: 2007-12-28 Сообщения: 2647 Репутация: 179 Профиль Отправить e-mail

Закрыть окно при потере фокуса pyqt5

Зачем тебе это нужно?

С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Как закрыть окно при вызове нового pyqt5?

Здравствуйте. Помогите пожалуйста. Как закрыть главное окно при открытии нового? Суть в том что, после нажатия на кнопку Button_enter открывается новое, при этом нужно чтобы закрывалось старое.
5ad91974ecce7938074646.png5ad919a601316911149241.png 5ad919adbf3a9505696997.png

  • Вопрос задан более трёх лет назад
  • 1211 просмотров

2 комментария

Средний 2 комментария

Пожалуйста, используйте тег код.
Deka007 @Deka007 Автор вопроса

import sys from PyQt5 import QtCore, QtGui, QtWidgets import sqlite3 from base import client_base class Authorization_Window(object): def auth_Form(self): self.authwindow = QtWidgets.QMainWindow() self.authform = Authorization_Window() self.authform.setupUi(self.authwindow) self.authwindow.destroy() def client_window(self): # вызов дочернего окна self.window = QtWidgets.QMainWindow() self.client = client_base() self.client.setupUi(self.window) self.window.show() def auth_Check(self): username = self.lineEdit_login.text() password = self.lineEdit_pass.text() connection = sqlite3.connect("login.db") result = connection.execute("SELECT * FROM USERS WHERE USERNAME = ? AND PASSWORD = ?", (username, password)) if (len(result.fetchall()) > 0): #если логин и пароль совпадают с БД, происходит вызов нового окна print("User Found! ") self.client_window() self.auth_Form() else: print("User not Found! ") def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.setEnabled(True) MainWindow.resize(220, 195) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.label_login = QtWidgets.QLabel(self.centralwidget) self.label_login.setGeometry(QtCore.QRect(50, 10, 101, 16)) self.label_login.setObjectName("label_login") self.label_pass = QtWidgets.QLabel(self.centralwidget) self.label_pass.setGeometry(QtCore.QRect(50, 50, 61, 16)) self.label_pass.setObjectName("label_pass") self.lineEdit_login = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit_login.setGeometry(QtCore.QRect(50, 30, 113, 20)) self.lineEdit_login.setObjectName("lineEdit_login") self.lineEdit_pass = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit_pass.setGeometry(QtCore.QRect(50, 70, 113, 20)) self.lineEdit_pass.setObjectName("lineEdit_pass") self.Button_enter = QtWidgets.QPushButton(self.centralwidget) self.Button_enter.setGeometry(QtCore.QRect(50, 110, 111, 23)) self.Button_enter.setObjectName("Button_enter") ###################EVENT################# self.Button_enter.clicked.connect(self.auth_Check) ################################################ MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 220, 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_login.setText(_translate("MainWindow", "Имя пользователя:")) self.label_pass.setText(_translate("MainWindow", "Пароль:")) self.Button_enter.setText(_translate("MainWindow", "Войти")) def enter(): #вызов главного окна входа по логину и паролю app = QtWidgets.QApplication(sys.argv) enter_windows = QtWidgets.QMainWindow() ui_window = Authorization_Window() ui_window.setupUi(enter_windows) enter_windows.show() sys.exit(app.exec_()) enter()

Решения вопроса 0
Ответы на вопрос 1

delvin-fil

Crazy Linux-admin
Ответ написан более трёх лет назад
Deka007 @Deka007 Автор вопроса

5ad9980ee52d7993424397.png

Что-то не то, обработчик кнопки понял как работает, а вот как закрыть главное окно(def enter()) при открытии нового хз.
уже вывел отдельно

По идее после того как нажимаю кнопку «Войти» должно открыться новое окно и окно авторизации закрыться.
Однако окно авторизации не закрывается(((

5ad998a382ff3043946355.png

delvin-fil

Deka007,
. auth_Form.close()
Или так?
Deka007 @Deka007 Автор вопроса
Alex F, так это не работает, мы не можем вызвать close()

delvin-fil

Deka007, Набросал на PyQt4
Код под катом

from PyQt4 import QtGui, QtCore import sys class Second(QtGui.QMainWindow): def __init__(self, parent=None): super(Second, self).__init__(parent) self.pushButton2 = QtGui.QPushButton("Выход") self.setCentralWidget(self.pushButton2) self.connect(self.pushButton2, QtCore.SIGNAL("clicked()"), QtGui.qApp.quit) class First(QtGui.QMainWindow): def __init__(self, parent=None): super(First, self).__init__(parent) self.pushButton = QtGui.QPushButton("Ткни сюда") self.setCentralWidget(self.pushButton) self.pushButton.clicked.connect(self.on_pushButton_clicked, ) self.dialog = Second(self) def on_pushButton_clicked(self): self.hide() self.dialog.setWindowTitle("Спрятали предыдущее") self.dialog.resize(300, 70) self.dialog.show() def main(): app = QtGui.QApplication(sys.argv) main = First() main.show() sys.exit(app.exec_()) if __name__ == '__main__': main()

Думаю, под 5-ую переписать вас не затруднит.

delvin-fil

5adc82f17b714101795429.png

И да, дайте уже нормальный код, не скрины.

Deka007 @Deka007 Автор вопроса
Alex F, код написан вначале в комментах))

delvin-fil

Deka007, Это скриншот. Набирать его вручную не горю желанием.
Deka007 @Deka007 Автор вопроса

5adc9764cec9c799325446.png

Извиняюсь за своё поведение но где тут скриншот?

import sys from PyQt5 import QtCore, QtGui, QtWidgets import sqlite3 from base import client_base class Authorization_Window(object): def auth_Form(self): self.authwindow = QtWidgets.QMainWindow() self.authform = Authorization_Window() self.authform.setupUi(self.authwindow) self.authwindow.destroy() def client_window(self): # вызов дочернего окна self.window = QtWidgets.QMainWindow() self.client = client_base() self.client.setupUi(self.window) self.window.show() def auth_Check(self): username = self.lineEdit_login.text() password = self.lineEdit_pass.text() connection = sqlite3.connect("login.db") result = connection.execute("SELECT * FROM USERS WHERE USERNAME = ? AND PASSWORD = ?", (username, password)) if (len(result.fetchall()) > 0): #если логин и пароль совпадают с БД, происходит вызов нового окна print("User Found! ") self.client_window() self.auth_Form() else: print("User not Found! ") def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.setEnabled(True) MainWindow.resize(220, 195) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.label_login = QtWidgets.QLabel(self.centralwidget) self.label_login.setGeometry(QtCore.QRect(50, 10, 101, 16)) self.label_login.setObjectName("label_login") self.label_pass = QtWidgets.QLabel(self.centralwidget) self.label_pass.setGeometry(QtCore.QRect(50, 50, 61, 16)) self.label_pass.setObjectName("label_pass") self.lineEdit_login = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit_login.setGeometry(QtCore.QRect(50, 30, 113, 20)) self.lineEdit_login.setObjectName("lineEdit_login") self.lineEdit_pass = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit_pass.setGeometry(QtCore.QRect(50, 70, 113, 20)) self.lineEdit_pass.setObjectName("lineEdit_pass") self.Button_enter = QtWidgets.QPushButton(self.centralwidget) self.Button_enter.setGeometry(QtCore.QRect(50, 110, 111, 23)) self.Button_enter.setObjectName("Button_enter") ###################EVENT################# self.Button_enter.clicked.connect(self.auth_Check) ################################################ MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 220, 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_login.setText(_translate("MainWindow", "Имя пользователя:")) self.label_pass.setText(_translate("MainWindow", "Пароль:")) self.Button_enter.setText(_translate("MainWindow", "Войти")) def enter(): #вызов главного окна входа по логину и паролю app = QtWidgets.QApplication(sys.argv) enter_windows = QtWidgets.QMainWindow() ui_window = Authorization_Window() ui_window.setupUi(enter_windows) enter_windows.show() sys.exit(app.exec_()) enter()

Я посмотрел ваш пример на PyQt4. Дело в том что в PyQt5 нет SiGNAL(«clicked()») однако
есть
from PyQt5.QtCore import pyqtSignal, QObject

closeApp = pyqtSignal()

но как связать это я даже не знаю.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *