Как вызвать функцию в pyside MainWindow из другого скрипта Python

Это мой main.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 как экземпляр. Чего я не могу сделать. Мне нужно просто вызвать функцию в моем классе MainWindow без загрузки другого экземпляра.

def handle_Ctrl_L ():
    m = MainWindow()
    m.loadShot()
    hk = HotKeys()
    w = WindowMgr()
    pid = w.GetProcessID('Blade')
    w.focusWindow(pid)
    time.sleep(.2)
    hk.F8()

person Peter Collazo    schedule 28.04.2015    source источник
comment
Не совсем понятно, о чем вы спрашиваете, но похоже, что вы хотите вызвать связанный метод (метод, который имеет self в качестве первого параметра, в вашем случае loadShot) без создания экземпляра вашего класса. Вы не можете этого сделать. Вы можете сделать этот метод методом класса, но тогда вы потеряете ссылку на переменные экземпляра, такие как self.shotName_Line.text() и т. д. Можете ли вы немного расширить то, чего вы на самом деле пытаетесь достичь?   -  person all or None    schedule 29.04.2015
comment
Спасибо за ответ. У меня есть мой main.py, в котором есть мой графический интерфейс pyside MainWindow. У меня есть несколько методов, которые взаимодействуют с графическим интерфейсом. loadShot() получает информацию о редактировании строки и записывает ее в файл. В моем файле other.py. У меня есть прослушиватель клавиатуры, у которого есть метод handle_CTRL_L(). Я хочу иметь возможность вызывать метод loadShot(). Это не может быть экземпляр, потому что он перезапускает мой графический интерфейс. Убивает всю информацию и ничего не записывает в файл. Я надеялся, что смогу использовать собственный сигнал в методе handle_ctrl_L(), который испускается при вызове метода. Спасибо.   -  person Peter Collazo    schedule 29.04.2015


Ответы (2)


В одном проекте мне пришлось включить один модуль для обратного вызова моего модуля Mainwindow. Контроллер представления Mainwindow запускает новый подпроцесс и извлекает стандартный вывод, а также обратный вызов, как только программа завершается. Мне удалось это сделать следующим образом: (Может быть, это поможет с вашей проблемой, которую я не совсем понимаю)

Модуль главного окна:

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

Второй модуль (консольный процесс):

# The Class has to inherit QtCore.Object

class ConsoleProcessRunner(QtCore.QObject):
    # The Signals that allow the callback are declared

    cout = QtCore.Signal(str)
    quit = QtCore.Signal(int)

    # Constructor
    def __init__(self, parent = None):
        super(ConsoleProcessRunner, self).__init__(parent)


    def your_function_here():
        # now you can use our previously defined signals to do the callback
        # your code goes here
        self.cout.emit(stdoutdata)
        self.quit.emit(ret) 
person Ben    schedule 30.04.2015

Если вашему приложению нужен только один экземпляр 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(), он всегда будет возвращать один и тот же экземпляр.

person ekhumoro    schedule 30.04.2015
comment
PS: Какого черта вы используете Tkinter файл-диалог? Что не так с QFileDialog? - person ekhumoro; 30.04.2015
comment
Да, я знаю, что это был старый код из теста. Я переключил его на QFILEDIALOG. Спасибо - person Peter Collazo; 05.05.2015