- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
概述
我在该行之后导入模块时遇到问题QtWidgets.QApplication(sys.argv)
,假设我得到了这个小片段 main.py
:
import sys
import importlib
from PyQt5 import QtWidgets
print('Sys Path:')
print(' %s\n' % '\n '.join(sys.path))
if sys.argv[-1] == '1':
print('Importing Before...\n')
from PyQt5 import Qt
app = QtWidgets.QApplication(sys.argv)
elif sys.argv[-1] == '2':
print('Importing After...\n')
app = QtWidgets.QApplication(sys.argv)
from PyQt5 import Qt
print('Done')
python main.py 1
,一切都会按预期进行。python main.py 2
,进程会挂起(可能处于无限循环中)而不会出现任何错误。 python main.py 2
的输出:
(py352) D:\sources\personal\python\pyqt\mcve>python main.py 2
Sys Path:
D:\sources\personal\python\pyqt\mcve
D:\sources\personal\python
d:\virtual_envs\py352\Scripts\python35.zip
d:\virtual_envs\py352\DLLs
d:\virtual_envs\py352\lib
d:\virtual_envs\py352\Scripts
c:\Python352\Lib
c:\Python352\DLLs
d:\virtual_envs\py352
d:\virtual_envs\py352\lib\site-packages
Importing After...
(HANG)
尝试
在 win7 上用几个 virtualenvs 测试:
Python 3.5.1 (v3.5.1:37a07cee5969, Dec 6 2015, 01:54:25) [MSC v.1900 64 bit (AMD64)] on win32
win7
Win32 上的 Python 3.5.2(v3.5.2:4def2a2901a5,2016 年 6 月 25 日,22:01:18)[MSC v.1900 32 位(英特尔)]
Pyqt 是使用 pip 安装在 virtualenvs 上的,版本是这些:
>>> QtCore.QT_VERSION
329472
>>> QtCore.QT_VERSION_STR
'5.7.0'
>>> QtCore.PYQT_VERSION_STR
'5.7'
相关信息
#pyqt freenode
channel 的一些非常好的人帮助我测试了 repo,但他们都无法重现问题,他们使用的 python 版本和平台是:
问题
from PyQt5 import Qt
(或其他 pyqt 模块)卡在我的盒子上而其他人无法重现的原因是什么?最佳答案
这(还)不是真正的答案,但它可能提供了如何找到答案的第一步。
以下是我在对该问题的第一条评论中建议的最小测试用例。它只测试一件事:在创建QApplication
后调用importlib.import_module
是否会使解释器在您的系统上挂起?请注意,目前,它仅尝试从 python 标准库导入模块。一步一个脚印至关重要,并注意避免引入任何可能混淆的变量。
请完全按照下面的描述运行此脚本,并将输出添加到您的问题中。 (即使选项 2 没有挂起,sys.path
详细信息也可能相关)。
import sys, importlib
from PyQt5 import QtWidgets
print('Sys Path:')
print(' %s\n' % '\n '.join(sys.path))
mod = None
modname = 'collections.abc'
# modname = 'PyQt5.Qt'
if sys.argv[-1] == '1':
print('Importing Before...\n')
mod = importlib.import_module(modname)
app = QtWidgets.QApplication(sys.argv)
elif sys.argv[-1] == '2':
print('Importing After...\n')
app = QtWidgets.QApplication(sys.argv)
mod = importlib.import_module(modname)
# from PyQt5 import Qt
print('Result: %r' % mod)
像这样运行脚本:
$ python /tmp/test.py 1
然后像这样:
$ python /tmp/test.py 2
在我的系统(ArchLinux、Python-3.5.2、Qt-5.7.1、PyQt-5.7)上,第二个产生以下输出:
Sys Path:
/tmp
/usr/lib/python35.zip
/usr/lib/python3.5
/usr/lib/python3.5/plat-linux
/usr/lib/python3.5/lib-dynload
/usr/lib/python3.5/site-packages
Importing After...
Result: <module 'collections.abc' from '/usr/lib/python3.5/collections/abc.py'>
更新:
第一步确定 importlib
本身不是问题的原因。第二步是确定哪个特定的导入模块是问题的根源。
我已经在测试脚本中添加了两行(注释)以允许完成此操作。第一个检查导入 PyQt5.Qt
是否会触发挂起。如果是,第二个检查正常的 import
语句是否也会触发挂起。
请注意,from PyQt5 import Qt
有效地导入了一切,包括一些非常重量级且可能有问题的模块,如 QtWebEngineWidgets
。因此,有必要进一步细化导入,以正确识别问题的确切来源。
更新 2:
QtWebEngineWidgets
是众所周知的问题来源,通常需要小心处理。以下解释器 session 输出似乎与您当前的问题相关:
>>> from PyQt5 import QtWidgets, QtCore
>>> app = QtWidgets.QApplication([''])
>>> from PyQt5 import QtWebEngineWidgets
Qt WebEngine seems to be initialized from a plugin. Please set Qt::AA_ShareOpenGLContexts using QCoreApplication::setAttribute before constructing QGuiApplication.
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: QtWebEngineWidgets must be imported before a QCoreApplication instance is created
>>>
>>> QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_ShareOpenGLContexts)
>>> from PyQt5 import QtWebEngineWidgets
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: QtWebEngineWidgets must be imported before a QCoreApplication instance is created
这是所有正常行为(尽管目前我找不到任何官方文档)。但是让我们使用 Qt
模块尝试同样的事情:
>>> from PyQt5 import QtWidgets, QtCore
>>> QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_ShareOpenGLContexts)
>>> app = QtWidgets.QApplication([''])
>>> from PyQt5 import Qt
>>> Qt.QWeb
Qt.QWebChannel( Qt.QWebEngineUrlRequestInterceptor( Qt.QWebHitTestResult( Qt.QWebSocketCorsAuthenticator(
Qt.QWebChannelAbstractTransport( Qt.QWebEngineUrlRequestJob( Qt.QWebInspector( Qt.QWebSocketProtocol(
Qt.QWebDatabase( Qt.QWebEngineUrlSchemeHandler( Qt.QWebPage( Qt.QWebSocketServer(
Qt.QWebElement( Qt.QWebFrame( Qt.QWebPluginFactory( Qt.QWebView(
Qt.QWebElementCollection( Qt.QWebHistory( Qt.QWebSecurityOrigin(
Qt.QWebEngineCookieStore( Qt.QWebHistoryInterface( Qt.QWebSettings(
Qt.QWebEngineUrlRequestInfo( Qt.QWebHistoryItem( Qt.QWebSocket(
>
所以看起来 Qt
模块在 创建 QApplication
之后导入时有特殊处理 - 尽管一些 QWebEngine
类可用,其中大部分已被省略(例如 QWebEngineView
、QWebEnginePage
等)。但似乎在您的特定设置中,这可能无法正常工作。如果是这样,您可能需要与 PyQt 的作者讨论这个问题,因为这可能需要了解 Qt
模块的内部工作原理。
关于python - QtWidgets.QApplication(sys.argv) 后无法导入 PyQt 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41172301/
我想使用鼠标移动 QtWidgets.QtWidget(不是 QPushButton、QLabel 等)。我在网上到处搜索,但找不到这个问题的答案。 mousePressEvent 似乎是这样,但它不
我想编译Qt例子。我收到错误 QtWidgets: No such file or directory #include greaterThan(QT_MAJOR_VERSION, 4): QT +=
我将像这样在基于小部件的应用程序中部署 qtvirtualkeyboard: #include int main(int argc, char *argv[]) { qputenv("QT_
我现在正在编写一个程序,该程序必须管理接收请求时创建的大量 QWidget,但我不知道如何在 QObject 类中创建小部件。编译器提示“QObject:无法为位于不同线程中的父对象创建子对象。” G
我创建了一个简单的 Qt 控制台应用程序(基于 Qt 提供的示例代码)。虽然这是一个控制台应用程序,但 ldd 显示了很多链接的 X11 内容。 我注意到我的 .pro 文件中有 QT += widg
我在 QPushButton 上有这个信号: void MainWindow::on_addNode_clicked() { ui->nodesTable->insertRow(ui->nod
我在 qt 应用程序中创建了一个 opengl 程序,我为此使用了这个视频教程 http://www.youtube.com/watch?v=1nzHSkY4K18 .但是我的小部件不起作用,它确实显
我正在尝试从其子组件InstrumentSelector 获取父组件的一些属性:SamplerModule。 从 InstrumentSelector 构造函数中,我运行 parent->metaOb
我的 GLWidget(继承自 QtOpenGL.QGLWidget)没有出现在屏幕上,而它应该在其他小部件的右侧可见。但是,当我从水平布局切换时: layout_final = Qtgui.QHB
我使用 PyQt5 及其所有强大的布局和小部件编写了许多代码。但不知何故,我错过了如何正确导入我的代码所需的大量模块。一切正常,我只想了解使用 PyQt5 时的最佳实践。我读到没有精确的方法,但欢迎任
我正在尝试在 Maya 中编写一些代码,如果这会在下面的脚本示例中造成任何困惑,我很抱歉。问题是我想制作我的自定义 PyQt 类,稍后将在我的布局中用作 Widget,但我对这件事缺乏了解,导致错误
我有一个 PyQt5 窗口,它将打开一个我创建的对话框窗口,该窗口只是要求用户执行某些操作,然后单击一个关闭窗口的按钮。这两个窗口是用class RenameDialog(QtWidgets.QMai
我有以下问题。我想尽可能少地浪费内存,因此每当我在它上面加载另一个 QWidget 时,都会删除一个底层 QWidget。例如。我有几个内容,我想通过点击一个按钮在它们之间切换。 所以我尝试创建一个
我正在尝试创建一个嵌入现有 QWidget 窗口内的 QQuickView 子窗口。下面的代码我创建了一个新的单独的 QQuickView 窗口而不是子窗口。 主要.cpp subWindow::su
我正在使用 qmake -project 和 qmake Prog.pro 构建我的 Qt 应用程序。 当我运行 Makefile 时出现此错误: mainwindow.h:11:21: fatal
我最近更新到了适用于 Python 的新版 Qt5。在这样做的过程中,我不得不根据已经发生的一些显着变化来修改我的代码。我想深入了解我创建的这行代码。这感觉像是解决获取 string 问题的肮脏方式。
我正在使用 Qt 阅读有关 Python 上的 Tabwidgets 的教程。我已经了解它的基础知识。我想编写一个包含多个选项卡的应用程序,每个选项卡由几个小部件组成。我在 codeloop 上找到了
我正在尝试使用 addWidget 函数将FigureCanvasQTAgg 参数作为小部件添加到某些布局中,但发生了 TypeError。仅当尝试运行使用 pyinstaller 构建的独立应用程序
有人可以向我解释一下,如果在下面的代码中我在每次调用 QApplication 构造函数之间删除 del app ,为什么会出现段错误?同样,将 QApplication 对象分配给具有不同名称的变量
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
我是一名优秀的程序员,十分优秀!