来自Pyqt5的.show()和/或.exec()在Spyder中不起作用

问题描述 投票:1回答:1

我有Python 3.6.3和Spyder 3.2.4,它们都是昨天在安装了Windows 10的计算机上与Pyqt5一起安装的。我在Spyder中运行一些以前编写的Pyqt5代码时遇到了问题。以下代码显示了重现问题的最小代码段。

Spyder IPython控制台在运行代码时无限期挂起,永远不会打开窗口。 Ctrl-C不会停止执行,因此我必须杀死Spyder。如果我尝试逐行运行它,我会观察到“w.show()”执行但什么都不做,而“app.exec()”是挂起的行。相反,如果我从命令行控制台运行它,“w.show()”会出现一个非功能窗口,而“app.exec()”使窗口起作用。我在Spyder中运行的所有非pyqt代码执行得很好。

我更喜欢在Spyder中开发代码,因为从命令行运行代码通常需要30-60秒才能启动(大概来自导入)。

我可以在旧的(现在已损坏的)系统上运行Spyder中的代码,所以很明显这是我的安装或计算机的问题。但我不知道是什么。我已经尝试禁用我的病毒软件,使用pip更新所有相关软件包,从Anaconda提示重置Spyder,然后重新启动计算机。还有其他想法吗?

import sys
from PyQt5.QtWidgets import QApplication, QWidget

if not QApplication.instance():
   app = QApplication(sys.argv)
else:
   app = QApplication.instance()
print("app started")
w = QWidget()
w.resize(250, 250)
w.move(200, 200)
w.setWindowTitle('Test window')
print('app setting')
w.show()
print("shown")
app.exec_()
#sys.exit(app.exec_())
print("exit")
python-3.x pyqt5 spyder
1个回答
0
投票

在python中运行它时,需要修改如下。我已经修改了你的脚本,以便能够为你运行一些主要的PyQt约定。另请参阅我的内联注释,以了解您尝试使用打印行完成的任务。请享用!

# -*- coding: utf-8 -*-

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QWidget

class MyMainUI(QtWidgets.QMainWindow):

    def __init__(self, parent=None):

        print ' Start Main'

        super(MyMainUI, self).__init__(parent)
        self.setWindowTitle('Test window')
        self.resize(250, 250)
        self.move(200, 200)
        MySpidercodeHook()

    def MySpiderCodeHook(self):
        ...link/run code...

if __name__ == '__main__':

    app = QApplication(sys.argv)      # no QApplication.instance() > returns -1 or error. 
                                      # Your setting up something that cannot yet be peeked
                                      # into at this stage.

    print("app started")
    w = MyMainUI()                    # address your main GUI application
                                      # not solely a widgetname..that is confusing...

    x = 200
    y = 200
#    w.move(x, y)                     # normally this setting is done within the mainUI. 
                                      # See also PyQT conventions.
    print 'app setting: moving window to position : %s' % ([x, y])
    w.show()
    print("shown")
    app.exec_()
    #sys.exit(app.exec_())  # if active then print "exit" is not shown.. 
                            # now is while using app.exec_()
    #sys.exit(-1)       # will returns you '-1' value as handle. Can be any integer.
    print("exit")
    sys.stdout.flush()  # line used to print "printing text" when you're in an IDE 
                        # like Komodo EDIT.
© www.soinside.com 2019 - 2024. All rights reserved.