2016-06-27 4 views
0

Ich arbeite an einem Programm, das eine Konfigurationsdatei für ein eingebettetes Hardwaresystem liest und analysiert, an dem ich gerade arbeite. Ich versuche mit tkinter und python eine einfache GUI zum Lesen und Schreiben dieser Datei zu erstellen. Ich habe die Datei IO und Parsing meistens funktioniert, aber ich habe Probleme, alle Teile mit der GUI integriert zu bekommen. Ich möchte die Informationen aus dem Gerät lesen und dann die Eingabefelder mit den entsprechenden Informationen füllen. Das Problem, das ich habe, ist, halte ich den Fehler bekommenTkinter Button kann den Callback-Befehl nicht finden

"in initUI 
opnBut = Button(butFrm, text="Open", command=openCfg) 
NameError: name 'openCfg' is not defined" 

ich kann es die Funktion zu finden, wenn ich es außerhalb der Anwendungsklasse setzen, aber dann kann ich nicht herausfinden, wie die Felder verweisen innen das Fenster, das ich gemacht habe, um sie zu aktualisieren.

Jede Hilfe würde sehr geschätzt werden. Mein Code-Segment ist unten enthalten.

class Application(Frame): 
    def openCfg(): 
    name = getNameFromFile() 
    nameEntry.insert(0, name) 



    def __init__(self, parent): 
     Frame.__init__(self, parent) 

     self.parent = parent 
     self.initUI() 


    def initUI(self): 
     self.parent.title("Config Reader") 
     self.pack(fill=BOTH, expand=True) 

     nameFrm = Frame(self) 
     nameFrm.pack(fill=X) 

     nameLbl = Label(nameFrm, text="Device Name",width=20) 
     nameLbl.pack(side=LEFT,padx=5, pady=5) 
     nameEntry = Entry(nameFrm) 
     nameEntry.pack(fill=X, padx=5, pady=5) 

     butFrm = Frame(self) 
     butFrm.pack(fill=X) 
     opnBut = Button(butFrm, text="Open Cfg", command=openCfg) 
     opnBut.pack(fill=X, padx=5,pady=5) 

root = Tk() 
root.geometry("600x600") 

app = Application(root) 
app.mainloop() 
+1

einrücken richtig – Li357

+1

Ich glaube, Sie 'self.openCfg' gemeint, sondern (wie Andrew sagte) Ihr Code würde eine IndentationError werfen, wenn dies wirklich ist. – zondo

Antwort

2

Elemente, die im Klassennamespace definiert sind, werden an die Klasse gebunden. In diesem Fall müssen Sie ein paar Optionen haben ...

Eine Möglichkeit ist, dass Sie es sich um eine staticmethod machen könnte:,

opnBut = Button(butFrm, text="Open Cfg", command=self.openCfg) 

jedoch:

class Application(Frame): 
    @staticmethod 
    def openCfg(): 
     name = getNameFromFile() 
     nameEntry.insert(0, name) 

Und dann auf die Schaltfläche als binden Statische Methoden sind selten notwendig. In diesem Fall könnte, bewege ich mir nur die Definition von openCfg aus der Klasse und halte alles andere, wie es ist:

def openCfg(): 
    name = getNameFromFile() 
    nameEntry.insert(0, name) 

class Application(Frame): 
    ... 

Auf dem zweiten Blick wird dies wahrscheinlich bringt noch ein NameError für nameEntry. Sie werden wahrscheinlich eine erstklassige Methode wollen:

class Application(Frame): 
    def openCfg(self): 
     name = getNameFromFile() 
     self.nameEntry.insert(0, name) 

Und natürlich, wenn Sie nameEntry erstellen, werden Sie es ein Mitglied der Application-Klasse vornehmen müssen.

... 
self.nameEntry = Entry(nameFrm) 
self.nameEntry.pack(fill=X, padx=5, pady=5) 
...