Как внутри класса описывающего окно сделать выбор показывать окно или нет?

Рейтинг: 1Ответов: 1Опубликовано: 27.08.2023

Внутри класса описываю функции окна.
В определенный момент происходит проверка параметра, в результате которого выводится диалоговое окно с вопросом показывать окно или нет (если да, то нужно продолжить работу и отобразить окно).

Сделал упрощенный пример:

ui_one_button.py:

from PyQt6 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(502, 180)
        MainWindow.setLayoutDirection(QtCore.Qt.LayoutDirection.LeftToRight)
        MainWindow.setStyleSheet("background-color: rgb(254, 214, 188);")
        self.centralwidget = QtWidgets.QWidget(parent=MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))

main_one_button.py:

import sys
from PyQt6.QtWidgets import QApplication, QMainWindow, QMessageBox
from ui_one_button import Ui_MainWindow


class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        if True:
            msg_box = QMessageBox.warning(
                self,
                "Warning!",
                "Do you want to show main window!?",
                buttons=QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No
            )

            if msg_box == QMessageBox.StandardButton.No:
                print("Clicked No! Not Showing Window!")
                return

            print("Clicked Yes! Showing Window!")


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    print("Wow!")
    sys.exit(app.exec())

В примере перед открытием главного окна выводится QMessageBox с вопросом.

Как мне оформить это дело так, чтобы при нажатии кнопки No у меня не произошло отображения главного окна, но вся программа от этого не закрылась, для примера сработал print("Wow!")?

Ответы

▲ 1Принят

Чтобы не отображать главное окне, просто не показывайте его.
Но не понятно, что вы будите делать дальше и как вы собираетесь после этого выходить из программы?

Обратите внимание, я добавил библиотеку pynput. Эта библиотека позволяет управлять и отслеживать устройства ввода.

Я понял вашу задачу так:

import sys
from pynput import keyboard                                         # !!! +++

#from PyQt6 import QtCore, QtGui, QtWidgets                         # PyQt6
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *    


# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
def get_key_name(key):
    if isinstance(key, keyboard.KeyCode):
        return key.char
    else:
        return str(key)
 
def on_press(key):
    key_name = get_key_name(key)
#    print('Key {} pressed.'.format(key_name))
 
def on_release(key):
    key_name = get_key_name(key)
    print('Key {} released.'.format(key_name))
 
    if key_name == 'Key.esc':
        print('Exiting...')
        return False
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    

#from ui_one_button import Ui_MainWindow
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(502, 180)
        MainWindow.setLayoutDirection(QtCore.Qt.LayoutDirection.LeftToRight)
        MainWindow.setStyleSheet("background-color: rgb(254, 214, 188);")
        self.centralwidget = QtWidgets.QWidget(parent=MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
 

class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        if True:
            msg_box = QMessageBox.warning(
                self,
                "Warning!",
                "Do you want to show main window!?",
                buttons=QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No
            )

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
            if msg_box == QMessageBox.StandardButton.No:
                print("""\n
                Нажал «No». Окно не отображается!
                Нажимайте любые клавиши, 
                когда вам надо выйти из приложение - нажмите «Escape».\n
                """)
#                return
                print("Wow!")
                
                with keyboard.Listener(
                    on_press = on_press,
                    on_release = on_release) as listener:
                    listener.join()
                print(f'=================================')
                sys.exit(1)
                
            else:
                print("Clicked Yes! Showing Window!")
                self.show()
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                
            
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
#    window.show()
#    print("Wow!")
    sys.exit(app.exec())

введите сюда описание изображения

введите сюда описание изображения