从PySide或PyQt4导入

0 投票
1 回答
4579 浏览
提问于 2025-04-21 08:34

我想用PyQt4或PySide来导入模块,哪个安装了就用哪个。不过不知道为什么,我不能这样做:

from PyQt4 import QtGui
from QtGui import QApplication

最后一行我必须这样写,我也不太明白为什么:

from PyQt4.QtGui import QApplication

这倒不是让我太烦恼,但在用安装的库导入多个东西时,这就变得很麻烦了:

try:
    from PyQt4 import QtGui, QtWebKit, QtCore
    from PyQt4.QtGui import QApplication, QMainWindow, QFrame, QAction, ...
    ...
except ImportError:
    from PySide import QtGui, QtWebKit, QtCore
    from PySide.QtGui import QApplication, QMainWindow, QFrame, QAction, ...
    ...

这样写起来挺重复的。

还有,这样写也不行,Python不允许:

import PyQt4 as SomeQt
from SomeQt import QtGui

所以我找不到一个好的方法来减少PyQt4和PySide部分之间的重复。有没有更好的办法?直接用import *会不会有什么问题:

try:
    from PyQt4 import QtGui, QtWebKit, QtCore
    from PyQt4.QtGui import *
    ...
except ImportError:
    from PySide import QtGui, QtWebKit, QtCore
    from PySide.QtGui *
    ...

至少可以减少必要的重复吗?

1 个回答

1

我会这样做:

try:
    from PyQt4.QtCore import *
    from PyQt4.QtGui import *
    ...
except ImportError:
    from PySide.QtCore import *
    from PySide.QtGui import *
    ...

...
QThread()
QApplication()
QWidget()
...

在Python社区和最佳实践中,通常不推荐使用通配符导入。这是因为这样会不必要地污染你的命名空间。就我个人而言,我不太在意Qt,因为它的每个类名都是以Q开头,比如QSomething。在我看来,这样的命名方式很不容易和我自己或第三方模块中的其他类名冲突。

为了安全起见,你也可以这样做:

try:
    from PyQt4 import QtCore as Qc
    from PyQt4 import QtGui as Qg
    ...
except ImportError:
    from PySide import QtCore as Qc
    from PySide import QtGui as Qg
    ...

...
Qc.QThread()
Qc.QApplication()
Qg.QWidget()
...

撰写回答