2017-03-21 2 views
0
def runtest(testname): 
     usrdef_sship = sship_e.get() 
     usrdef_username = username_e.get() 
     usrdef_pass = pass_e.get() 
     testresult = cpdiag.testname(cpdiag.ssh(usrdef_sship, usrdef_username, usrdef_pass)) 
     messagebox.showinfo("Results", testresult) 

    #Button for disk Test 
    disktest = Button(top, text="Disk Test", command = lambda: runtest("diskTest") 
    disktest.grid(row=3,column=0, sticky=W) 
    #Button for cpwd Test 
    cpwdtest = Button(top, text="CPWD Test", command = lambda: runtest("cpwdTest") 
    cpwdtest.grid(row=4,column=0, sticky=W) 

Aufruf versucht, den Code für das Notwendige zu verkleinern. Vollständiger Code unter https://github.com/elta13/cpdiag. Der obige Code, ich habe mir schon seit einiger Zeit den Kopf darüber geschlagen. Ich bin ziemlich neu bei Python und habe während dieses ersten Projekts gelernt.Python: Verwenden Sie lokale String-Variable, um die Remote-Funktion

Ich verwende Tkinter, um 3 Eingabefelder anzuzeigen, die arbeiten, um usrdef-Variablen zu erhalten. Dann benutze ich mehrere Tasten, jeder ruft eine Funktion aus einer anderen lokalen Datei cpdiag.py. Jetzt habe ich Funktion für jede remote-Funktion, die ich rufe mit der einzigen Sache, die die Zeile mit cpdiag ändert. "Testname". (Cpdaig.ssh "etc".)

Aktuelle Probleme: Wenn ich passiere auf der Schaltfläche runtest (diskTest), innerhalb runtuest druckt dies als "Funktion diskTest bei x0xxxxx" Und der Code stürzt damit mit dem Versuch, "cpdiag.testname" aufzurufen, die nicht in der anderen lokalen Datei cpdiag.py existiert.

Also dann habe ich herausgefunden, dass ich runtest ("diskTest") übergeben könnte, und es würde innerhalb von runtest() drucken. Aber runtest versucht immer noch "cpdiag.testname" von der anderen Datei aufzurufen. Ich erkenne an diesem Punkt, ich verstehe nicht, wie man etwas entfernt mit einer lokalen Variablen anruft.

Also habe ich versucht, runtest ("cpdiag.diskTest"), für die ich "'str' kann nicht aufgerufen werden" oder dergleichen.

Wie kann ich "testname" in runtest() übergeben, wobei "testname" eine in der anderen Datei cpdiag.py definierte Funktion ist?!?!?

+0

Ich denke, ich habe die Top-Antwort wie 20 mal gelesen, ich glaube nicht, ich verstehe, was "bar" ist in dem Beispiel. –

+0

bar ist der Name der Funktion von foo. In Ihrem Beispiel wird es "testresult = getattr (cpdiag, testname) (cpdiag.ssh (usrdef_sship, usrdef_username, usrdef_pass))' –

+0

Ok, also erstmal, danke eine Million, es funktioniert! Ich verstehe noch nicht wie, aber bald! Vielen Dank für die Erklärung ein wenig weiter für mein Szenario! –

Antwort

0

Sie können die Instanz der Methode, die Sie aufrufen möchten, mit getattr in das Objekt cpdiag holen und dann die Methode aufrufen. Etwas wie unten:

your_function = getattr(cpdiag, testname) # Get the method first 
# Now invoke 
your_function(cpdiag.ssh(usrdef_sship, usrdef_username, usrdef_pass)) 
Verwandte Themen