2012-11-28 57 views
3

[Python 2.7]你好。我正在研究一個簡單的Tkinter計算器程序,但似乎無法在按下其中一個按鈕後讓標籤顯示任何文本。下面是我使用的代碼,一些按鈕的功能是未完成的,直到我能得到標籤本身的工作:Tkinter標籤更新問題

from Tkinter import * 
    import ttk 
    """Calculator""" 
    #Variables 
    Entered = "" 

    #Button Functions 
    def Natural_Log(): 
     pass 
    def Exp(): 
     Entered = "^" 
    def Sin(): 
     pass 
    def Cos(): 
     pass 
    def Tan(): 
     pass 
    def LeftParentheses(): 
     Entered = Entered + "(" 
    def RightParentheses(): 
     Entered = Entered + ")" 
    def Log(): 
     pass 
    def XSquared(): 
     Entered = Entered + "**2" 
    def InvX(): 
     Entered = Entered + "**-1" 
    def Seven(): 
     Entered = Entered + "7" 
    def Eight(): 
     Entered = Entered + "8" 
    def Nine(): 
     Entered = Entered + "9" 
    def DEL(): 
     Entered = Entered[:1] 
    def AC(): 
     Entered = "" 
    def Four(): 
     Entered = Entered + "4" 
    def Five(): 
     Entered = Entered + "5" 
    def Six(): 
     Entered = Entered + "6" 
    def Mult(): 
     Entered = Entered + "*" 
    def Div(): 
     Entered = Entered + "/" 
    def One(): 
     Entered = Entered + "1" 
    def Two(): 
     Entered = Entered + "2" 
    def Three(): 
     Entered = Entered + "3" 
    def Plus(): 
     Entered = Entered + "+" 
    def Minus(): 
     Entered = Entered + "-" 
    def Zero(): 
     Entered = Entered + "0" 
    def Decimal(): 
     Entered = Entered + "." 
    def Ex(): 
     pass 
    def neg(): 
     pass 
    def EXE(): 
     pass 


    #Main Window Setup: 
    #Root setup 
    root = Tk() 
    root.title("Generic Calculator") 

    #Parent frame setup 
    mainframe = ttk.Frame(root,padding="8") 
    mainframe.grid(column=0,row=0,sticky=(N,S,E,W)) 
    mainframe.columnconfigure(0,weight=1) 
    mainframe.rowconfigure(0,weight=1) 

    #Button setup 
    ttk.Button(mainframe,text="ln",command=Natural_Log).grid(column=1,row=2,sticky=W) 
    ttk.Button(mainframe,text="^",command=Exp).grid(column=2,row=2,sticky=W) 
    ttk.Button(mainframe,text="sin",command=Sin).grid(column=3,row=2,sticky=W) 
    ttk.Button(mainframe,text="cos",command=Cos).grid(column=4,row=2,sticky=W) 
    ttk.Button(mainframe,text="tan",command=Tan).grid(column=5,row=2,sticky=W) 
    ttk.Button(mainframe,text="(",command=LeftParentheses).grid(column=1,row=3,sticky=W) 
    ttk.Button(mainframe,text=")",command=RightParentheses).grid(column=2,row=3,sticky=W) 
    ttk.Button(mainframe,text="log",command=Log).grid(column=3,row=3,sticky=W) 
    ttk.Button(mainframe,text="x^2",command=XSquared).grid(column=4,row=3,sticky=W) 
    ttk.Button(mainframe,text="x^-1",command=InvX).grid(column=5,row=3,sticky=W) 
    ttk.Button(mainframe,text="7",command=Seven).grid(column=1,row=4,sticky=W) 
    ttk.Button(mainframe,text="8",command=Eight).grid(column=2,row=4,sticky=W) 
    ttk.Button(mainframe,text="9",command=Nine).grid(column=3,row=4,sticky=W) 
    ttk.Button(mainframe,text="DEL",command=DEL).grid(column=4,row=4,sticky=W) 
    ttk.Button(mainframe,text="AC",command=AC).grid(column=5,row=4,sticky=W) 
    ttk.Button(mainframe,text="4",command=Four).grid(column=1,row=5,sticky=W) 
    ttk.Button(mainframe,text="5",command=Five).grid(column=2,row=5,sticky=W) 
    ttk.Button(mainframe,text="6",command=Six).grid(column=3,row=5,sticky=W) 
    ttk.Button(mainframe,text="*",command=Mult).grid(column=4,row=5,sticky=W) 
    ttk.Button(mainframe,text="/",command=Div).grid(column=5,row=5,sticky=W) 
    ttk.Button(mainframe,text="1",command=One).grid(column=1,row=6,sticky=W) 
    ttk.Button(mainframe,text="2",command=Two).grid(column=2,row=6,sticky=W) 
    ttk.Button(mainframe,text="3",command=Three).grid(column=3,row=6,sticky=W) 
    ttk.Button(mainframe,text="+",command=Plus).grid(column=4,row=6,sticky=W) 
    ttk.Button(mainframe,text="-",command=Minus).grid(column=5,row=6,sticky=W) 
    ttk.Button(mainframe,text="0",command=Zero).grid(column=1,row=7,sticky=W) 
    ttk.Button(mainframe,text=".",command=Decimal).grid(column=2,row=7,sticky=W) 
    ttk.Button(mainframe,text="EXP",command=Ex).grid(column=3,row=7,sticky=W) 
    ttk.Button(mainframe,text="(-)",command=neg).grid(column=4,row=7,sticky=W) 
    ttk.Button(mainframe,text="EXE",command=EXE).grid(column=5,row=7,sticky=W) 

    #Label Setup: 
    EnteredSetup = StringVar() 
    ttk.Label(mainframe,textvariable=EnteredSetup).grid(column=1,row=1,columnspan=5) 
    EnteredSetup.set(Entered) 


    root.mainloop() 

回答

2

我相信這是對如何STRINGVAR工作的誤解。該生產線

EnteredSetup.set(Entered) 

不會產生某種形式的EnteredSetup並輸入之間的聯繫,修改進入08 EnteredSetup不發出更新。你的代碼也可以改進很多,並且你應該發佈一些只能描述問題的東西。說,考慮已經修正了這個簡化版本(注意,這可能是更小):

from Tkinter import Tk, StringVar 
import ttk 

class Calculator: 
    def __init__(self, state): 
     self.state = state 

    def ac(self): 
     self.state.set('') 

    def state_num(self, num): 
     self.state.set('%s%d' % (self.state.get(), num)) 

#Main Window Setup: 
#Root setup 
root = Tk() 
root.title("Generic Calculator") 

EnteredSetup = StringVar('') 
calc = Calculator(EnteredSetup) 

#Parent frame setup 
mainframe = ttk.Frame(root, padding="8") 
mainframe.grid(column=0, row=0) 
mainframe.columnconfigure(0, weight=1) 
mainframe.rowconfigure(0, weight=1) 

#Button setup 
ttk.Button(mainframe, text="AC", command=calc.ac).grid(
     column=5, row=4) 
ttk.Button(mainframe, text="1", command=lambda: calc.state_num(1)).grid(
     column=1, row=6) 
ttk.Button(mainframe, text="0", command=lambda: calc.state_num(0)).grid(
     column=1, row=7) 

#Label Setup: 
ttk.Label(mainframe, textvariable=EnteredSetup).grid(
     column=1,row=1,columnspan=5) 

root.mainloop() 

我希望這將引導您在進一步調整計算器正確的方向。