2015-04-28 3 views
0

Это мой main.py У меня есть функция называется loadShot, что я хочу, чтобы позвонить с другогоКак вызвать функцию в PySide MainWindow из другого питона сценария

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 

Это мой другой питон файл, который является key listener, и я хочу загрузить функциюShot. Проблема в том, что я продолжаю загружать 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() 
+0

Это не на 100% понятно, что вы просите, но похоже, что вы хотите вызвать связанный метод (метод, который имеет 'self' в качестве первого параметра, в вашем случае' loadShot') без создания экземпляра вашего класса. Вы не можете этого сделать. Вы можете сделать этот метод методом класса, но затем вы потеряете ссылку на переменные экземпляра, такие как 'self.shotName_Line.text()' и т. Д. Можете ли вы расширить то, что вы на самом деле пытаетесь достичь? – 101

+0

Спасибо, что ответили. У меня есть моя main.py, у которой есть mypyside gui MainWindow. У меня есть несколько методов, которые взаимодействуют с gui. loadShot() получает информацию из редактирования строки и записывает ее в файл. В моем файле other.py. У меня есть слушатель клавиатуры, у которого есть метод handle_CTRL_L() Я хочу иметь возможность вызвать метод loadShot(). Это не может быть примером, потому что он перезапускает мой gui. Убивает всю информацию и ничего не записывает в файл. Я надеялся использовать пользовательский сигнал в методе handle_ctrl_L(), который испускается при вызове метода. Благодарю. –

ответ

0

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

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 

Второй модуль (consoleprocess):

# 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) 
0

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

+0

PS: Почему, черт возьми, вы используете диалоговое окно с файлом 'Tkinter'? Что случилось с ['QFileDialog'] (http://doc.qt.io/qt-4.8/qfiledialog.html)? – ekhumoro

+0

Да, я знаю, что это был старый код из теста. Я переключил его на QFILEDIALOG. благодаря –

Смежные вопросы