PyQt - 可以运行两个应用程序吗?

时间:2011-05-26 16:43:55

标签: python user-interface pyqt

两个文件。每个都运行新窗口并自行工作。我需要同时运行它们 当我运行first.pyw时,只显示一个(第二个)窗口。

是否有可能两个同时运行它们?

first.pyw:

import sys
from PyQt4.QtGui import *
import second

class first(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)
        self.setWindowTitle('first')

app = QApplication(sys.argv)
firstApp = first()
firstApp.show()
sys.exit(app.exec_())

second.pyw:

import sys
from PyQt4.QtGui import *

class second(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)
        self.setWindowTitle('second')

app2 = QApplication(sys.argv)
secondApp = second()
secondApp.show()
sys.exit(app2.exec_())

如何运行两个不同模块的应用程序?

3 个答案:

答案 0 :(得分:3)

接受的答案基本上是正确的,但在某些情况下,您希望一个接一个地运行多个QApplication,例如:

  • 单元测试
  • 一个不需要运行X服务器的命令行工具(因此启动时没有QApplication),但如果用户的系统支持,可以选择显示一个窗口

我最终使用multiprocessing模块在​​一个单独的进程中启动每个QApplication,以便每个模块独立于其他进程。

from multiprocessing import Queue, Process
class MyApp(Process):

   def __init__(self):
       self.queue = Queue(1)
       super(MyApp, self).__init__()

   def run(self):
       app = QApplication([])
       ...
       self.queue.put(return_value)

app1 = MyApp()
app1.start()
app1.join()
print("App 1 returned: " + app1.queue.get())

app2 = MyApp()
app2.start()
app2.join()
print("App 2 returned: " + app1.queue.get())

答案 1 :(得分:1)

虽然您的应用程序可以有多个顶级窗口,但您一次只能运行一个应用程序。 QCoreApplication docs说:

  

......应该只有一个QCoreApplication对象。

这也适用于QApplication,因为它源自QCoreApplication。您可以通过QCoreApplication.instance()方法或C ++中的qApp宏来访问该应用程序。

您希望在运行两个不同的应用程序时获得什么?相反,您可以让每个模块提供一个顶级窗口,然后由应用程序启动器显示。

答案 2 :(得分:-1)

您导入第二个。因此,在您首先达到类的定义之前,它会被解释。由于second.pyw的最后一行是sys.exit,因此无法执行任何操作。

相关问题