PyQt - возможно ли запустить два приложения? - PullRequest
3 голосов
/ 26 мая 2011

Два файла.Каждый запускает новое окно и работает сам по себе.Мне нужно запустить их обоих.
Когда я запускаю 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 ]

3 голосов
/ 26 мая 2011

Одновременно можно запускать только одно приложение, хотя в вашем приложении может быть несколько окон верхнего уровня. Документы QCoreApplication говорят, что:

... должен быть ровно один объект QCoreApplication.

Это также относится и к QApplication, поскольку он наследуется от QCoreApplication. Вы можете получить доступ к этому приложению с помощью метода QCoreApplication.instance () или макроса qApp в C ++.

Что вы ожидаете получить от запуска двух разных приложений? Вместо этого вы можете сделать так, чтобы каждый модуль предоставлял окно верхнего уровня, которое затем отображается в панели запуска приложения.

3 голосов
/ 31 марта 2014

Принятый ответ по существу правильный, но есть случаи, когда вы хотите запускать несколько QApplications один за другим, например:

  • Юнит-тесты
  • Инструмент командной строкиэто не должно требовать работающего 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())
0 голосов
/ 26 мая 2011

Вы импортируете второе.Следовательно, оно интерпретируется еще до того, как вы впервые дойдете до определения класса.Поскольку последняя строка second.pyw - это sys.exit, ничего за ней выполнить нельзя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...