Почему создание экземпляра объекта QWidget в PyQt5 приведет к сбою во время работы? [дубликат] ⇐ Python
-
Anonymous
Почему создание экземпляра объекта QWidget в PyQt5 приведет к сбою во время работы? [дубликат]
Я не знаю, почему создание экземпляра объекта QWidget в PyQt5 приведет к сбою во время работы?
Я пытаюсь решить проблему, упрощая код (от кода 1 и от кода 2 до кода 3). Однако на какое-то время меня смутила одна проблема.
Если вы не хотите рассматривать процесс упрощения, вы можете пропустить его и перейти к коду 3.
В следующем коде это не приведет к сбою.
Код 1:
импортировать копию импортировать систему из PyQt5.QtWidgets импортировать QApplication, QMainWindow из PyQt5.QtWidgets импортировать QWidget из PyQt5.QtCore импортировать QRect, QObject из PyQt5 импортировать QtCore из PyQt5 импортировать Qt из PyQt5 импортировать QtGui класс QWidgetChecker: @staticmethod защита существует( объект ) -> логическое значение: вернуть объект != Нет класс QWidgetHandler: @staticmethod Защиту SetGeometry( объект, позиция ): если QWidgetChecker.Exist(obj) == False: поднять исключение («ОШИБКА!!! Объект НЕ существует.») obj.setGeometry(позиция) вернуть объект защита Создать( себя ): self.mainWindow = QWidget() вернуть себя класс QApplicationHandler(QWidgetHandler): защита __init__(сам): супер().__init__() защита Очистить(сам): если QApplication.instance(): QApplication.instance().exit() Защиту CreateWindow( себя, заголовок ): self.Очистить() self.app = QApplication(sys.argv) self.mainWindow = QMainWindow() self.mainWindow.setWindowTitle(заголовок) вернуть себя защита Показать( себя ): если QWidgetChecker.Exist(self.mainWindow) == False: поднять исключение («ОШИБКА!!! Объект НЕ существует.») self.mainWindow.show() защита SysExit( себя ): если QWidgetChecker.Exist(self.app) == False: поднять исключение («ОШИБКА!!! Объект НЕ существует.») sys.exit(self.app.exec_()) защита Закрыть( себя ): если QWidgetChecker.Exist(self.mainWindow) == False: поднять исключение («ОШИБКА!!! Объект НЕ существует.») self.mainWindow.close() def GetInfo(obj) : return [obj,type(obj)] если __name__ == '__main__': rectMainWindow = QRect(0,0,1000,1000) inst = QApplicationHandler() # виджет = QWidget() inst = inst.CreateWindow('title') inst.mainWindow = QWidgetHandler.SetGeometry( inst.mainWindow, rectMainWindow) # inst.mainWindow.setCentralWidget(виджет) inst.Показать() inst.SysExit() Однако после того, как я раскомментировал следующее утверждение,
виджет = QWidget() создание экземпляра объекта QWidget в PyQt5.
При работе с ядром Anaconda Spyder произойдет сбой. См. следующий код.
Код 2:
импортировать копию импортировать систему из PyQt5.QtWidgets импортировать QApplication, QMainWindow из PyQt5.QtWidgets импортировать QWidget из PyQt5.QtCore импортировать QRect, QObject из PyQt5 импортировать QtCore из PyQt5 импортировать Qt из PyQt5 импортировать QtGui класс QWidgetChecker: @staticmethod защита существует( объект ) -> логическое значение: вернуть объект != Нет класс QWidgetHandler: @staticmethod Защиту SetGeometry( объект, позиция ): если QWidgetChecker.Exist(obj) == False: поднять исключение («ОШИБКА!!! Объект НЕ существует.») obj.setGeometry(позиция) вернуть объект класс QApplicationHandler(QWidgetHandler): защита __init__(сам): супер().__init__() защита Очистить(сам): если QApplication.instance(): QApplication.instance().exit() Защиту CreateWindow( себя, заголовок ): self.Очистить() self.app = QApplication(sys.argv) self.mainWindow = QMainWindow() self.mainWindow.setWindowTitle(заголовок) вернуть себя защита Показать( себя ): если QWidgetChecker.Exist(self.mainWindow) == False: поднять исключение («ОШИБКА!!! Объект НЕ существует.») self.mainWindow.show() защита SysExit( себя ): если QWidgetChecker.Exist(self.app) == False: поднять исключение («ОШИБКА!!! Объект НЕ существует.») sys.exit(self.app.exec_()) защита Закрыть( себя ): если QWidgetChecker.Exist(self.mainWindow) == False: поднять исключение («ОШИБКА!!! Объект НЕ существует.») self.mainWindow.close() def GetInfo(obj) : return [obj,type(obj)] если __name__ == '__main__': rectMainWindow = QRect(0,0,1000,1000) inst = QApplicationHandler() виджет = QWidget() inst = inst.CreateWindow('title') inst.mainWindow = QWidgetHandler.SetGeometry( inst.mainWindow, rectMainWindow) # inst.mainWindow.setCentralWidget(виджет) inst.Показать() inst.SysExit() Я попытался сократить его, составив код следующим образом.
Код 3:
из PyQt5.QtWidgets импортировать QWidget если __name__ == '__main__': виджет = QWidget() виджет.шоу() IDE
Анаконда Спайдер Консоль Я гуглю.
В официальной документации PyQt: QWidget в PyQt5
он говорит, что для отображения QWidget нужно просто создать экземпляр объекта QWidget, а затем вызвать метод show класса QWidget.
Интересно, что я что-то пропустил или неправильно прочитал документацию.
Спасибо за ответ. Любые ответы приветствуются.
Изменить:
Я также пытался установить положение объекта QWidget.
Однако при работе он по-прежнему вылетает.
Код 4:
из PyQt5.QtWidgets импортировать QWidget из PyQt5.QtCore импортировать QRect если __name__ == '__main__': виджетПос = QRect(0,0,1000,1000) виджет = QWidget() виджет.setGeometry(виджетПос) виджет.шоу() Изменить:
Я знаю почему. Забыл добавить
app = QApplication(sys.argv) перед утверждением виджет = QWidget()
и
sys.exit(app.exec()) после заявления виджет.шоу()
Подробнее см. в коде 5.
Код 5:
из PyQt5.QtWidgets импортировать QWidget из PyQt5.QtWidgets импортирует QApplication импортировать систему если __name__ == "__main__": приложение = QApplication(sys.argv) окно = QWidget() окно.шоу() sys.exit(app.exec()) Благодаря этой ссылке я доработал код из примера по ссылке
(хотя ссылка в примере содержит некоторую ошибку). запуск виджета
Я не знаю, почему создание экземпляра объекта QWidget в PyQt5 приведет к сбою во время работы?
Я пытаюсь решить проблему, упрощая код (от кода 1 и от кода 2 до кода 3). Однако на какое-то время меня смутила одна проблема.
Если вы не хотите рассматривать процесс упрощения, вы можете пропустить его и перейти к коду 3.
В следующем коде это не приведет к сбою.
Код 1:
импортировать копию импортировать систему из PyQt5.QtWidgets импортировать QApplication, QMainWindow из PyQt5.QtWidgets импортировать QWidget из PyQt5.QtCore импортировать QRect, QObject из PyQt5 импортировать QtCore из PyQt5 импортировать Qt из PyQt5 импортировать QtGui класс QWidgetChecker: @staticmethod защита существует( объект ) -> логическое значение: вернуть объект != Нет класс QWidgetHandler: @staticmethod Защиту SetGeometry( объект, позиция ): если QWidgetChecker.Exist(obj) == False: поднять исключение («ОШИБКА!!! Объект НЕ существует.») obj.setGeometry(позиция) вернуть объект защита Создать( себя ): self.mainWindow = QWidget() вернуть себя класс QApplicationHandler(QWidgetHandler): защита __init__(сам): супер().__init__() защита Очистить(сам): если QApplication.instance(): QApplication.instance().exit() Защиту CreateWindow( себя, заголовок ): self.Очистить() self.app = QApplication(sys.argv) self.mainWindow = QMainWindow() self.mainWindow.setWindowTitle(заголовок) вернуть себя защита Показать( себя ): если QWidgetChecker.Exist(self.mainWindow) == False: поднять исключение («ОШИБКА!!! Объект НЕ существует.») self.mainWindow.show() защита SysExit( себя ): если QWidgetChecker.Exist(self.app) == False: поднять исключение («ОШИБКА!!! Объект НЕ существует.») sys.exit(self.app.exec_()) защита Закрыть( себя ): если QWidgetChecker.Exist(self.mainWindow) == False: поднять исключение («ОШИБКА!!! Объект НЕ существует.») self.mainWindow.close() def GetInfo(obj) : return [obj,type(obj)] если __name__ == '__main__': rectMainWindow = QRect(0,0,1000,1000) inst = QApplicationHandler() # виджет = QWidget() inst = inst.CreateWindow('title') inst.mainWindow = QWidgetHandler.SetGeometry( inst.mainWindow, rectMainWindow) # inst.mainWindow.setCentralWidget(виджет) inst.Показать() inst.SysExit() Однако после того, как я раскомментировал следующее утверждение,
виджет = QWidget() создание экземпляра объекта QWidget в PyQt5.
При работе с ядром Anaconda Spyder произойдет сбой. См. следующий код.
Код 2:
импортировать копию импортировать систему из PyQt5.QtWidgets импортировать QApplication, QMainWindow из PyQt5.QtWidgets импортировать QWidget из PyQt5.QtCore импортировать QRect, QObject из PyQt5 импортировать QtCore из PyQt5 импортировать Qt из PyQt5 импортировать QtGui класс QWidgetChecker: @staticmethod защита существует( объект ) -> логическое значение: вернуть объект != Нет класс QWidgetHandler: @staticmethod Защиту SetGeometry( объект, позиция ): если QWidgetChecker.Exist(obj) == False: поднять исключение («ОШИБКА!!! Объект НЕ существует.») obj.setGeometry(позиция) вернуть объект класс QApplicationHandler(QWidgetHandler): защита __init__(сам): супер().__init__() защита Очистить(сам): если QApplication.instance(): QApplication.instance().exit() Защиту CreateWindow( себя, заголовок ): self.Очистить() self.app = QApplication(sys.argv) self.mainWindow = QMainWindow() self.mainWindow.setWindowTitle(заголовок) вернуть себя защита Показать( себя ): если QWidgetChecker.Exist(self.mainWindow) == False: поднять исключение («ОШИБКА!!! Объект НЕ существует.») self.mainWindow.show() защита SysExit( себя ): если QWidgetChecker.Exist(self.app) == False: поднять исключение («ОШИБКА!!! Объект НЕ существует.») sys.exit(self.app.exec_()) защита Закрыть( себя ): если QWidgetChecker.Exist(self.mainWindow) == False: поднять исключение («ОШИБКА!!! Объект НЕ существует.») self.mainWindow.close() def GetInfo(obj) : return [obj,type(obj)] если __name__ == '__main__': rectMainWindow = QRect(0,0,1000,1000) inst = QApplicationHandler() виджет = QWidget() inst = inst.CreateWindow('title') inst.mainWindow = QWidgetHandler.SetGeometry( inst.mainWindow, rectMainWindow) # inst.mainWindow.setCentralWidget(виджет) inst.Показать() inst.SysExit() Я попытался сократить его, составив код следующим образом.
Код 3:
из PyQt5.QtWidgets импортировать QWidget если __name__ == '__main__': виджет = QWidget() виджет.шоу() IDE
Анаконда Спайдер Консоль Я гуглю.
В официальной документации PyQt: QWidget в PyQt5
он говорит, что для отображения QWidget нужно просто создать экземпляр объекта QWidget, а затем вызвать метод show класса QWidget.
Интересно, что я что-то пропустил или неправильно прочитал документацию.
Спасибо за ответ. Любые ответы приветствуются.
Изменить:
Я также пытался установить положение объекта QWidget.
Однако при работе он по-прежнему вылетает.
Код 4:
из PyQt5.QtWidgets импортировать QWidget из PyQt5.QtCore импортировать QRect если __name__ == '__main__': виджетПос = QRect(0,0,1000,1000) виджет = QWidget() виджет.setGeometry(виджетПос) виджет.шоу() Изменить:
Я знаю почему. Забыл добавить
app = QApplication(sys.argv) перед утверждением виджет = QWidget()
и
sys.exit(app.exec()) после заявления виджет.шоу()
Подробнее см. в коде 5.
Код 5:
из PyQt5.QtWidgets импортировать QWidget из PyQt5.QtWidgets импортирует QApplication импортировать систему если __name__ == "__main__": приложение = QApplication(sys.argv) окно = QWidget() окно.шоу() sys.exit(app.exec()) Благодаря этой ссылке я доработал код из примера по ссылке
(хотя ссылка в примере содержит некоторую ошибку). запуск виджета
Мобильная версия