2014-10-31 76 views
0
class AppetiserClass(): 
    root = Tk() 
    root.title("Appetiser Page") 
    root.geometry("1920x1080") 


    meal1 = 0 

    def plus1(): 
     global meal1 
     meal1 = meal1 + 1 
     DisplayButton["text"]=str(meal1) 
     return 

    def neg1(): 
     global meal1 
     meal1 = meal1 + 1 
     DisplayButton["text"]=str(meal1) 
     return 

    app = Frame(root) 
    app.grid() 

    Label(app, text = "", width = 75, height = 20).grid(row = 1, column = 0, sticky = N) 

    DisplayButton = Button(app, text = meal1) 
    DisplayButton.grid(column = 1, row = 2, sticky = W) 
    DisplayButton.config(height = 10, width = 10) 

    Plus1Button = Button(app, text = "+1", command=plus1, bg="green") 
    Plus1Button.grid(column = 2, row = 2, sticky = W) 
    Plus1Button.config(height = 10, width = 10) 

    Neg1Button = Button(app, text = "-1", command=neg1, bg="green") 
    Neg1Button.grid(column = 3, row = 2, sticky = W) 
    Neg1Button.config(height = 10, width = 10) 

    root.mainloop() 

我遇到的問題是我已經爲我的全局變量(meal1,爲0)設置了一個值,但是當我按下+1或-1按鈕時,值不會顯示在「DislpayButton 「並且我收到此消息: 」NameError:全局名稱'DisplayButton'未定義「Tkinter - Python 3 - 將增量計數器添加到類窗口中?

」DisplayButton「,是我放置的按鈕,用於顯示值。沒有更多,但我收到此錯誤消息。

如果我刪除了類,只需運行該代碼,與單一窗口,該代碼工作正常。

任何幫助將不勝感激!

回答

1

如果你的縮進是正確的,問題不在於DisplayButton和meal1是全球性的,那就是他們是類級別和你沒有訪問它的方式,這意味着你應該使用自己的關鍵字來訪問它。 (它沒有「自我」 - 任何函數的第一個參數的一類總是定義,通過它可以訪問其他成員在同一類的變量 - 但它是Python的風格來使用「自我」。)添加自作爲參數傳遞給所有的功能在類,像這樣:通過自我

def neg1(self): 

,然後訪問meal1和DisplayButton:

self.meal1 += 1 

和:

self.DisplayButton["text"] = str(meal1) 

我已經重新 - 寫你的clas這樣班上所有重要的東西都可以被其他所有使用自己的東西訪問:

from tkinter import * 

class AppetiserClass: 
    meal1 = 0 
    root = Tk() 
    app = Frame(self.root) 

    def __init__(self): 
     self.root.title("Appetiser Page") 
     self.root.geometry("1920x1080") 

     self.app.grid() 

     Label(self.app, text = "", width = 75, height = 20).grid(row = 1, column = 0, sticky = N) 

     self.DisplayButton = Button(self.app, text = self.meal1) 
     self.DisplayButton.grid(column = 1, row = 2, sticky = W) 
     self.DisplayButton.config(height = 10, width = 10) 

     self.Plus1Button = Button(self.app, text = "+1", command=self.plus1, bg="green") 
     self.Plus1Button.grid(column = 2, row = 2, sticky = W) 
     self.Plus1Button.config(height = 10, width = 10) 

     self.Neg1Button = Button(self.app, text = "-1", command=self.neg1, bg="green") 
     self.Neg1Button.grid(column = 3, row = 2, sticky = W) 
     self.Neg1Button.config(height = 10, width = 10) 

     self.root.mainloop() 

    def plus1(self): 
     self.meal1 += 1 
     self.DisplayButton["text"]=str(self.meal1) 

    def neg1(self): 
     self.meal1 -= 1 
     self.DisplayButton["text"]=str(self.meal1) 

if __name__ == "__main__": 
    AppetiserClass() 

我改變了一個體面的金額。首先,你有很多的任何特殊方法之外編寫的代碼,這是我喜歡保留除了類變量定義(meal1 = 0等)的類方法中。它是相當隨意的 - 任何在方法中定義爲self.whatever的東西都與在類作用域中定義的東西具有相同的可訪問性。我也做到這一點,以便您可以繼續使用self.ButtonName引用您的按鈕。最後,我已經這樣做了,只有當你運行該文件並且不將你的代碼導入到不同的文件時,窗口才被實例化。

+0

@ Pat6089一秒 – furkle 2014-10-31 22:37:42

+1

@ Pat6089我上面更新了 - 一切正常,因爲它應該,因此,它是爲你的類的作品相互溝通更容易了很多,我做到了。請讓我知道,如果你有任何問題。 – furkle 2014-10-31 22:56:29

+0

@ pat6089如果這是有幫助的,請不要忘記使用複選標記選擇這個答案。 – furkle 2014-11-01 03:48:44

相關問題