2017-07-06 9 views
0

作成された他のすべてのツールを起動するためのハブとして機能するUIを作成しようとしています。問題は、UIをツールハブのUIから起動しようとすると、イベントループが既に実行されているため、私を解放できないということです。新しいウィンドウを起動するときに、APPH = QtGui.QApplication(sys.argv)とAPP.exec_()を実行できないことは知っています。これは、ツールループのUIに対してイベントループが既に実行されているためです。しかし、私はそれを別の方法で行う方法を理解することはできません。Pyside/Pyqtウィンドウから新しいウィンドウを開く(イベントループはすでに実行中)

これは、1つのツールのコード例です。単独で起動します。

global APP 
APP = None 

class toolwindow(QtGui.QDialog): 

    def __init__(self, parent=None): 
     init_app() 
     super(toolwindow, self).__init__(parent) 
     self.setWindowTitle('tool') 
     self.setMinimumSize(QtCore.QSize(500, 600)) 
     self.setMaximumSize(QtCore.QSize(500, 600)) 
     self.create_ui() 

    def create_ui(self): 
     code goes here 

    def closeEvent(self, event): 
     QtGui.QDialog.closeEvent(self, event) 
     return 

def init_app(): 
    global APP 
    APP = QtGui.QApplication.instance() 
    if not APP: 
     APP = QtGui.QApplication(sys.argv) 
    return 

def start_ui(): 
    win= toolwindow() 
    win.show() 
    APP.exec_() 

if __name__ == '__main__': 
    start_ui() 
global APP 
APP = None 

次に、toolshub UIのコードを示します。これらはどちらも別々のスクリプトです。 toolshubでは上記のツールをインポートしています。

import tool 
LOGGER = logging.getLogger(__name__) 
global APP 
APP = None 

class toolsHub(QtGui.QDialog): 

    def __init__(self, parent=None): 
     init_app() 
     super(toolsHub, self).__init__(parent) 
     self.setWindowTitle('Tools Launcher') 
     self.setSizeGripEnabled(False) 
     self.setMinimumSize(QtCore.QSize(300, 200)) 
     self.setMaximumSize(QtCore.QSize(300, 200)) 
     self.create_layouts() 

    def create_layouts(self): 
     master_layout = QtGui.QVBoxLayout() 
     self.setLayout(master_layout) 
     self.input_widgets() 
     grid_layout = QtGui.QGridLayout() 
     grid_layout.addWidget(self.env_creator, 0, 0) 
     grid_layout.addWidget(self.p4dl, 1, 0) 
     master_layout.addLayout(grid_layout) 

    def input_widgets(self): 
     self.tool_button= QtGui.QPushButton('launch tool') 
     self.tool_button.clicked.connect(self.launch_tool) 

    def launch_tool(self): 
     tool.start_ui() 

    def closeEvent(self, event): 
     QtGui.QDialog.closeEvent(self, event) 
     return 


def init_app(): 
    global APP 
    APP = QtGui.QApplication.instance() 
    if not APP: 
     APP = QtGui.QApplication(sys.argv) 
    return 

def start_ui(): 
    toolui = toolsHub() 
    toolui.show() 
    APP.exec_() 

if __name__ == '__main__': 
    start_ui() 

私はツールUIをツールUIから開くことができるように、これらを記述して構造化するにはどうすればよいですか?私はツールのUIを変更する必要がありますコードを推測している、私はAPP = QtGui.QApplication(sys.argv)とAPP.exec_()を取り出して、それを起動するために何をすべきかわからないことを知っています。

おかげ

答えて

0

ありだけはQApplicationの1つのインスタンスである必要があり、これは任意のウィジェットを作成する前に作成する必要がありますので、各モジュールで、それをインスタンス化する必要があります。ために

QDialogが正しくあなたがそのexec_()

tool.py実行する必要があり、表示するために:

[...] 
def start_ui(): 
    win= toolwindow() 
    win.exec_() 

完全なコード:

tool.py

from PySide import QtGui, QtCore 

APP = None 

class toolwindow(QtGui.QDialog): 

    def __init__(self, parent=None): 
     init_app() 
     super(toolwindow, self).__init__(parent) 
     self.setWindowTitle('tool') 
     self.setMinimumSize(QtCore.QSize(500, 600)) 
     self.setMaximumSize(QtCore.QSize(500, 600)) 
     self.create_ui() 

    def create_ui(self): 
     pass 
    def closeEvent(self, event): 
     QtGui.QDialog.closeEvent(self, event) 
     return 

def init_app(): 
    global APP 
    APP = QtGui.QApplication.instance() 
    if not APP: 
     APP = QtGui.QApplication(sys.argv) 
    return 

def start_ui(): 
    win= toolwindow() 
    win.exec_() 

if __name__ == '__main__': 
    start_ui() 

それをやったmain.py

from PySide import QtGui, QtCore 
import tool 
import logging 
import sys 

LOGGER = logging.getLogger(__name__) 
APP = None 

class toolsHub(QtGui.QDialog): 

    def __init__(self, parent=None): 
     init_app() 
     super(toolsHub, self).__init__(parent) 
     self.setWindowTitle('Tools Launcher') 
     self.setSizeGripEnabled(False) 
     self.setMinimumSize(QtCore.QSize(300, 200)) 
     self.setMaximumSize(QtCore.QSize(300, 200)) 
     self.create_layouts() 

    def create_layouts(self): 
     master_layout = QtGui.QVBoxLayout() 
     self.setLayout(master_layout) 
     self.input_widgets() 
     grid_layout = QtGui.QGridLayout() 
     grid_layout.addWidget(QtGui.QPushButton(), 0, 0) 
     grid_layout.addWidget(QtGui.QPushButton(), 1, 0) 
     master_layout.addLayout(grid_layout) 

    def input_widgets(self): 
     self.tool_button= QtGui.QPushButton('launch tool') 
     self.tool_button.clicked.connect(self.launch_tool) 
     self.layout().addWidget(self.tool_button) 

    def launch_tool(self): 
     tool.start_ui() 

    def closeEvent(self, event): 
     QtGui.QDialog.closeEvent(self, event) 


def init_app(): 
    global APP 
    APP = QtGui.QApplication.instance() 
    if not APP: 
     APP = QtGui.QApplication(sys.argv) 
    return 

def start_ui(): 
    toolui = toolsHub() 
    toolui.show() 
    APP.exec_() 

if __name__ == '__main__': 
    start_ui() 
+0

すごいです! init_appモジュールをtool.pyに残して、APP = QtGui.QApplication(sys.argv)を設定する必要がありますか? もし私がそれを取り出してもそれはまだ機能しているので、私はそれが必要ではないようです。 main.pyの場合のみ? – ghost654

関連する問題