2015-04-28 51 views
0

這是我main.py我有一個函數調用loadShot,我想從另一個如何調用pyside主窗口的功能從另一個python腳本

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() 
+0

這不是100%清楚你要問什麼,但它聽起來像你想調用一個綁定的方法(一個方法,有'self'作爲第一個參數,在你的情況下'loadShot'),沒有實例化你的類。你不能那樣做。你可以使該方法成爲一個類方法,但是你會失去對像'self.shotName_Line.text()'等實例變量的引用。你能擴展你實際上想要實現的一點嗎? – 101

+0

感謝您的回覆。我有我的main.py,其中有我的pior gui MainWindow。我有幾個與gui交互的方法。 loadShot()從一行編輯信息並將其寫入文件。在我的other.py文件中。我有一個鍵盤監聽器,它具有handle_CTRL_L()方法,我希望能夠調用loadShot()方法。這不可能是一個實例,因爲它重新啓動了我的GUI。殺死所有信息並且不向文件寫任何東西。我希望能夠在調用方法時發出的handle_ctrl_L()方法下使用自定義信號。謝謝。 –

回答

0

在一個項目中,我必須啓用一個模塊對我的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

如果你的應用程序只需要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。謝謝 –

相關問題