Как закрывать окно PyQT5?
Доброго времени суток! Столкнулся с такой проблемой, после закрытия окна и повторном его открытии все функции класса, при их вызове, начинают ложно срабатывать несколько раз, причем количество ложных срабатываний равно количеству закрытия окна (т.е. 2 раза закрыли окно, то после открытия функции сработают ложно 2 раза). Помогите решить проблему или скажите, что я не так делаю!
вот 2 класса, которые реализуют 2 окна:
from PyQt5 import QtCore from PyQt5.QtCore import Qt from PyQt5.QtGui import * from PyQt5.QtWidgets import * from basedata import addCategory, getCategory, addProduct, getProduct from structs import ProductStruct class ProductList(QWidget): def __init__(self): super().__init__() self.s = [] self.add_window = AddProduct(self) self.exit = QPushButton('Выход') self.new_product = QPushButton('Добавить товар') self.supplier = QLabel() self.lv = QListView() self.table = QTableView() self.sti = QStandardItemModel(parent=self.lv) self.t = QStandardItemModel(parent=self.table) self.grid = QGridLayout() self.split = QSplitter(Qt.Horizontal) self.hbox1 = QHBoxLayout() self.hbox2 = QHBoxLayout() self.vbox = QVBoxLayout() def closeEvent(self, event): self.sti.clear() self.t.clear() if event: event.accept() else: self.close() def on_click(self, s): self.t.clear() self.t = getProduct(self.s, s.indexes()[0].data()) self.t.setHorizontalHeaderLabels(['Название', 'Описание', 'Цена']) self.table.setModel(self.t) def view_add_window(self): self.add_window.view() def view(self, supplier): self.setGeometry(400, 100, 635, 300) self.setWindowIcon(QIcon('./Icon/edit1')) self.setWindowTitle('Постовляемый товар') self.setWindowModality(Qt.ApplicationModal) self.s = supplier self.supplier.setText('Поставщик ' + supplier) self.supplier.setFont(QFont('Calibry', 12)) self.supplier.setAlignment(QtCore.Qt.AlignHCenter) self.new_product.clicked.connect(self.add_window.view) self.exit.clicked.connect(self.close) arr = getCategory() if arr != '': self.sti = arr self.split.addWidget(self.lv) self.split.addWidget(self.table) self.grid.addWidget(self.supplier, 0, 1) self.grid.addWidget(self.split, 1, 0, 1, 3) self.grid.addWidget(self.new_product, 2, 0) self.grid.addWidget(self.exit, 2, 2) self.t.setHorizontalHeaderLabels(['Название', 'Описание', 'Цена']) self.table.setModel(self.t) self.lv.setModel(self.sti) self.lv.selectionModel().selectionChanged.connect(self.on_click) self.setLayout(self.grid) self.show() class AddProduct(QWidget): def __init__(self, w): super().__init__() self.window = w self.add = QPushButton('Добавить') self.add_category = QPushButton('Добавить категорию') self.cancel = QPushButton('Отмена') self.name = QLabel('Название') self.name_text = QLineEdit() self.characteristic = QLabel('Характеристика') self.characteristic_text = QTextEdit() self.price = QLabel('Цена (руб.)') self.price_text = QLineEdit() self.category = QLabel('Категории') self.category_list = QComboBox() self.category_item_model = QStandardItemModel(parent=self.category_list) self.grid = QGridLayout() def closeEvent(self, event): if event: self.clearFields() event.accept() else: self.clearFields() self.close() def addCategory(self): category, ok = QInputDialog.getText(self, 'Добавление категории', 'Введите категорию') if ok: self.category_list.addItem(category) addCategory(category) item = QStandardItem(category) self.window.sti.appendRow(item) def clearFields(self): self.category_list.clear() self.name_text.clear() self.characteristic_text.clear() self.price_text.clear() def addProduct(self): ok = QMessageBox.question(self, 'Внимание!', 'Вы уверены, что хотите добавить данный товар?', QMessageBox.No | QMessageBox.Yes) if ok == QMessageBox.Yes: p = ProductStruct(self.category_list.currentText(), self.window.s, self.name_text.text(), self.characteristic_text.toPlainText(), self.price_text.text()) print(self.category_list.currentText()) addProduct(p) self.closeEvent() def view(self): self.setGeometry(400, 100, 500, 300) self.setWindowIcon(QIcon('./Icon/edit1')) self.setWindowTitle('Новый товар') self.setWindowModality(Qt.ApplicationModal) self.add_category.clicked.connect(self.addCategory) self.add.clicked.connect(self.addProduct) self.cancel.clicked.connect(self.closeEvent) arr = getCategory() if arr != '': self.category_item_model = arr self.grid.addWidget(self.category, 0, 0) self.grid.addWidget(self.category_list, 0, 1) self.grid.addWidget(self.add_category, 0, 2) self.grid.addWidget(self.name, 2, 0) self.grid.addWidget(self.name_text, 2, 1, 1, 2) self.grid.addWidget(self.characteristic, 3, 0) self.grid.addWidget(self.characteristic_text, 3, 1, 3, 2) self.grid.addWidget(self.price, 6, 0) self.grid.addWidget(self.price_text, 6, 1, 1, 2) self.grid.addWidget(self.add, 8, 0) self.grid.addWidget(self.cancel, 8, 2) self.category_list.setModel(self.category_item_model) self.setLayout(self.grid) self.show()
- Вопрос задан более трёх лет назад
- 4364 просмотра
2 комментария
Оценить 2 комментария
Python-сообщество
![]()
- Начало
- » 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 Сообщения: 2653 Репутация: 180 Профиль Отправить e-mail
Закрыть окно при потере фокуса pyqt5
Зачем тебе это нужно?
С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.
QWidget — базовый виджет для всех интерфейсных объектов¶
Если виджет не имеет родителя (parent), то виджет отображается как окно, иначе оно распологается на родительском виджете.
Если в параметре flags указан тип окна, то компонент, имея родителя, будет обладать свои собственным окном, но привязан к родительскому окну.
Флаги виджета из класса QtCore.Qt
- Widget — тип по умолчанию для класса QWidget
- Window — указывает, что компонент является окном, независимо от того, имеет он родителя или нет.
Окно выводится с рамкой и заголовком, в котором расположены кнопки Свернуть, Развернуть и Закрыть. По умолчанию размеры окна можно изменять с помощью мыши
Окно выводится с рамкой и заголовком, в котором расположены кнопки Справка и Закрыть. Размеры окна можно изменять с помощью мыши.
Окно выводится без рамки и заголовка. Кроме того, окно может отбрасывать тень. Изменить размеры окна с помощью мыши нельзя
Окно выводится с рамкой и заголовком (меньшем по высоте, чем обычное окно), в котором расположена кнопка Закрыть. Размеры окна можно изменять с помощью мыши
Окно выводится без рамки и заголовка. Изменить размеры окна с помощью мыши нельзя
Окно выводится без рамки и заголовка. Изменить размеры окна с помощью мыши нельзя. Значение по умолчанию для класса
Окно вообще не отображается на экране
Окно выводится с рамкой и заголовком (меньшем по высоте, чем обычное окно) без кнопок. Изменить размеры окна с помощью мыши нельзя.
Для окон верхнего уровня можно дополнительно указать следующие атрибуты из класса QtCore.Qt через оператор |:
- MSWindowsFixedSizeDialogHint — запрещает изменение размеров окна.
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.7k 112 112 золотых знаков 38 38 серебряных знаков 55 55 бронзовых знаков
- python
- pyqt5
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.26.3951