Cara memanggil fungsi di pyside MainWindow dari skrip python lain

Ini main.py saya. Saya memiliki fungsi bernama loadShot yang ingin saya panggil dari yang lain

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

Ini adalah file python saya yang lain yang merupakan pendengar kunci dan saya ingin fungsi loadShot. Masalahnya adalah saya terus memuat MainWindow sebagai contoh. Yang tidak bisa saya lakukan. Saya hanya perlu memanggil fungsi di kelas MainWindow saya tanpa memuat instance lain.

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 sumber
comment
Tidak 100% jelas apa yang Anda tanyakan, tetapi sepertinya Anda ingin memanggil metode terikat (metode yang memiliki self sebagai parameter pertama, dalam kasus Anda loadShot) tanpa membuat instance kelas Anda. Anda tidak bisa melakukan itu. Anda dapat menjadikan metode itu sebagai metode kelas tetapi kemudian Anda akan kehilangan referensi ke variabel instan seperti self.shotName_Line.text() dll. Bisakah Anda sedikit memperluas apa yang sebenarnya ingin Anda capai?   -  person all or None    schedule 29.04.2015
comment
Terima kasih telah membalas. Saya memiliki main.py yang memiliki pyside gui MainWindow saya. Saya punya beberapa metode yang berinteraksi dengan gui. loadShot() mendapat info dari pengeditan baris dan menulisnya ke file. Di file .py saya yang lain. Saya memiliki pendengar keyboard yang memiliki metode handle_CTRL_L(). Saya ingin dapat memanggil metode loadShot(). Ini tidak bisa menjadi contoh karena ini meluncurkan kembali gui saya. Membunuh semua info dan tidak menulis apa pun ke file. Saya berharap dapat menggunakan sinyal khusus di bawah metode handle_ctrl_L() yang muncul saat metode tersebut dipanggil. Terima kasih.   -  person Peter Collazo    schedule 29.04.2015


Jawaban (2)


Dalam satu proyek saya harus mengaktifkan satu modul untuk melakukan panggilan balik ke modul Mainwindow saya. Pengontrol tampilan Mainwindow memulai subproses baru dan mengambil stdout serta panggilan balik segera setelah program dihentikan. Saya mengaturnya dengan cara berikut: (Mungkin ini membantu masalah Anda, yang saya tidak sepenuhnya mengerti)

Modul Jendela Utama:

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

Modul Kedua (proses konsol):

# 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

Jika aplikasi Anda hanya memerlukan satu instance MainWindow, maka Anda dapat mencapai apa yang Anda inginkan dengan menjadikannya kelas tunggal:

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        

Dan sekarang setiap kali MainWindow() dipanggil, ia akan selalu mengembalikan instance yang sama.

person ekhumoro    schedule 30.04.2015
comment
PS: Kenapa menggunakan dialog file Tkinter? Apa yang salah dengan QFileDialog? - person ekhumoro; 30.04.2015
comment
Ya, saya tahu itu kode lama dari tes. Saya telah menggantinya untuk QFILEDIALOG. Terima kasih - person Peter Collazo; 05.05.2015