如何从另一个python脚本调用pyside MainWindow中的函数

2024-07-04 08:41:27 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我的主.py我有一个叫做loadShot的函数,我想从另一个调用它

class MainWindow(QMainWindow):
    # Main Window UI
    def __init__(self, parent=None):
        QMainWindow.__init__(self, parent)
        loadUi(os.path.join(SCRIPT_DIRECTORY, 'mainwindow.ui'), self)

        self.connectInterface()

    # Connect signals
    def connectInterface(self):
        self.scene_Line.textChanged.connect(self.shotName)
        self.activeProjcet_Line.textChanged.connect(self.shotName)
        self.character_Line.textChanged.connect(self.shotName)
        self.take_Line.valueChanged.connect(self.shotName)
        self.load_Button.setShortcut(QKeySequence("Alt+B"))

    ####################################################
    #   Shot Loader Functions
    ####################################################


    def browse(self, dir):
        root = Tkinter.Tk()
        root.withdraw() #use to hide tkinter window

        tempdir = tkFileDialog.askdirectory(parent=root, initialdir=dir, title='Please select a directory')

        if tempdir.startswith('D:/Capture data/'):
            self.activeProjcet_Line.setText(tempdir)
        elif tempdir.startswith('R:/Project Files/'):
            self.uploadProjcet_Line.setText(tempdir)
            self.uploadFolder()
        else:
            pass

    def uploadFolder(self):
        project = self.activeProjcet_Line.text()
        uploadDir = self.uploadProjcet_Line.text()
        f = open('C:/_Mocap/output/folderName.txt', 'w')
        f.write(' \n' + project.replace('D:/Capture data/', '') + '\n' + uploadDir.replace('R:/Project Files/', ''))
        f.close()

    def loadShot(self):
        shot = self.shotName_Line.text()
        f = open('C:/_Mocap/output/ShotLoader.txt', 'w')
        f.write('\n' + '[name]\n' + '\n' + 'take Name=' + shot)
        f.close()
        self.uploadFolder()
        if self.incrementTake.isChecked():
            self.takeIncrement()
        else:
            pass

这是我的另一个python文件,它是一个键侦听器,我想要loadShot函数。问题是我一直把主窗口作为一个实例加载。我做不到。我只需要能够调用MainWindow类中的函数,而不需要加载另一个实例。在

^{pr2}$

Tags: 函数textselfdefconnectlinerootparent
2条回答

如果您的应用程序只需要MainWindow的一个实例,那么您可以通过使它成为一个单例类来实现您想要的:

class MainWindow(QMainWindow):
    _instance = None
    _initialized = False

    def __new__(cls):
        if cls._instance is None:
            cls._instance = super(MainWindow, cls).__new__(cls)
        return cls._instance

    def __init__(self, parent=None):
        if not self._initialized:
            super(MainWindow, self).__init__(parent)
            loadUi(os.path.join(SCRIPT_DIRECTORY, 'mainwindow.ui'), self)
            self.connectInterface()     
            self._initialized = True        

现在只要调用MainWindow(),它总是返回相同的实例。在

在一个项目中,我不得不启用一个模块来回调我的主窗口模块。主窗口视图的控制器启动一个新的子进程,并在程序终止后立即检索stdout out和回调。我是通过以下方式来解决这个问题的:(也许这对你的问题有帮助,但我并不完全理解)

主窗口模块:

def run_program():
    # consoleprocess is the second module that 
    # has to be able to do a callback. 
    # A new Instance of the ProcessRunner class is created.

    self.progrunner = consoleprocess.ConsoleProcessRunner()
    self.progrunner.cout.connect(self.cb_update_prog_output)
    self.progrunner.quit.connect(self.cb_prog_terminated)

@QtCore.Slot(int)
@QtCore.Slot(str)
def cb_update_tv(self, data):
    # your code goes here
    pass

第二个模块(控制台进程):

^{pr2}$

相关问题 更多 >

    热门问题