2016-04-16 3 views
1
from tkinter import * 
class Mybuttons(): 
    def __init__(self, master): 
     self.frm= Frame(master) 
     self.frm.grid() 
     self.count= 0 
     self.mybuttons() 
     self.base=0 
     self.exponent=0 
     self.result=0 
    def doonebase(self): 
     self.base+=1 
     self.btn1['text']= 'the base is ' + str(self.base) 
    def dooneexponent(self): 
     self.exponent+=1 
     self.btn2['text']= 'the base is ' + str(self.exponent) 
    def getresult(self): 
     self.result= self.base * self.exponent 
     self.btn3['text']= 'the answer is ' + str(self.result) 
    def mybuttons(self): 
     self.btn1=Button(self.frm) 
     self.btn1['text']='base' 
     self.btn1['command']=doonebase 
     self.btn2=Button(self.frm) 
     self.btn2['text']='exponent' 
     self.btn2['command']=dooneexponent 
     self.btn3=Button(self.frm) 
     self.btn3['text']='result' 
     self.btn3['command']=getresult 
     self.btn1.grid(row=0, column=0) 
     self.btn2.grid(row=0, column=2) 
     self.btn3.grid(row=1, column=1) 

def try1(): 
     root= Tk() 
     root.title('Compute an exponent!') 
     root.geometry("200x300") 
     threebuttons= Mybuttons(root) 
     root.mainloop() 
try1()  

definiert Wenn ich dies laufe ich den Fehler:Tkinter Taste nicht

File "/home/goofy/Documents/lab10-1.py", line 23, in mybuttons 
    self.btn1['command']=doonebase 
NameError: name 'doonebase' is not defined 

ein Fenster produziert, aber die Tasten sind nicht da.

Wenn ich jede der Zeilen auskommentieren, die den Funktionen den 'Befehl' zuweisen, wird der Code ausgeführt, und die Schaltflächen werden angezeigt, aber sie bewirken nichts. Ich hatte versucht, jede der Funktionen vor dem Konstruktor zu definieren und versuchte auch nach der def mybuttons(self). Ich kann nicht herausfinden, warum der Code die definierten Funktionen nicht sieht.

+1

Sie tun müssen, um 'self.doonebase', nicht' doonebase'. Sie müssen das Gleiche für 'dooneexponent' und' getresult' tun. – zondo

+0

@zondo Vielen Dank! Das hat es total repariert. Ich bin mir nicht sicher, wie ich dir diese Antwort geben soll, weil es mein erster Beitrag ist, aber danke !!! –

+0

@zondo - können Sie dies als Antwort schreiben - es könnte jemand anderem helfen. –

Antwort

1

Wenn Sie Funktionen innerhalb einer Klasse definieren, werden sie als "Methoden" bezeichnet und sind nicht mehr im globalen Gültigkeitsbereich. Das bedeutet, dass Sie oder doonexponent nicht verwenden können. Sie sind jetzt Klassenattribute und sollten als solche aufgerufen werden. Da Instanzmethoden die Instanz als ihr erstes Argument erhalten (self), können Sie diese verwenden, um die Attribute zu erhalten. Daher ändern doonebase-self.doonebase, dooneexponent zu self.dooneexponent und getresult zu self.getresult