Как закрыть окно qt python
Перейти к содержимому

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

  • автор:

Как закрывать окно 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()
  • Вопрос задан более трёх лет назад
  • 4353 просмотра

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

Оценить 2 комментария

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

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

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

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

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

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

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

Как закрыть окно при вызове нового 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()

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

QWidget — базовый виджет для всех интерфейсных объектов¶

Если виджет не имеет родителя (parent), то виджет отображается как окно, иначе оно распологается на родительском виджете.

Если в параметре flags указан тип окна, то компонент, имея родителя, будет обладать свои собственным окном, но привязан к родительскому окну.

Флаги виджета из класса QtCore.Qt

  • Widget — тип по умолчанию для класса QWidget
  • Window — указывает, что компонент является окном, независимо от того, имеет он родителя или нет.

Окно выводится с рамкой и заголовком, в котором расположены кнопки Свернуть, Развернуть и Закрыть. По умолчанию размеры окна можно изменять с по­мощью мыши

Окно выводится с рамкой и заголовком, в котором располо­жены кнопки Справка и Закрыть. Размеры окна можно изменять с помощью мыши.

Окно выводится без рамки и заголовка. Кроме того, окно может отбрасывать тень. Изменить размеры окна с по­мощью мыши нельзя

Окно выводится с рамкой и заголовком (меньшем по высоте, чем обычное окно), в котором расположена кнопка Закрыть. Размеры окна можно изменять с помощью мыши

Окно выводится без рамки и заголовка. Изменить размеры окна с помощью мыши нельзя

Окно выводится без рамки и заголовка. Изменить размеры окна с помощью мыши нельзя. Значение по умолчанию для класса

Окно вообще не отображается на экране

Окно выводится с рамкой и заголовком (меньшем по высоте, чем обычное окно) без кнопок. Изменить размеры окна с помощью мыши нельзя.

Для окон верхнего уровня можно дополнительно указать следующие атрибуты из класса QtCore.Qt через оператор |:

  • MSWindowsFixedSizeDialogHint — запрещает изменение размеров окна.

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

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