2016-04-16 59 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()  

當我運行此我得到的錯誤:Tkinter的按鈕沒有定義

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

它產生一個窗口,但按鈕是不存在的。

當我註釋掉每個給函數賦予'command'的行時,代碼就會運行,按鈕出現,但它們什麼也不做。我曾嘗試在構造函數之前定義每個函數,並在def mybuttons(self)之後嘗試。我似乎無法弄清楚爲什麼代碼沒有看到定義的功能。

+1

你需要做的'self.doonebase',不'doonebase'。你需要爲'dooneexponent'和'getresult'做同樣的事情。 – zondo

+0

@zondo非常感謝你!這完全解決了它。我不知道如何給你這個答案,因爲這是我的第一篇文章,但謝謝你! –

+0

@zondo - 你可以寫這個答案 - 它可以幫助別人。 –

回答

1

在類中定義函數時,它們被稱爲「方法」,它們不再位於全局範圍內。這意味着您不能使用doonebasedoonexponent。他們現在是班級屬性,應該像這樣訪問。由於實例方法被賦予實例作爲它們的第一個參數(self),因此可以使用它來獲取屬性。因此,改變doonebaseself.doonebasedooneexponentself.dooneexponent,並getresultself.getresult