簡體   English   中英

Tkinter標簽更新問題

[英]Tkinter Label Updating Issue

[Python 2.7]你好。 我正在研究一個簡單的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()

我相信對StringVar的工作方式存在誤解。 這條線

EnteredSetup.set(Entered)

不會在EnteredSetup和Entered之間創建某種形式的鏈接,修改Entered不會在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()

我希望這能指導您進一步調整計算器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM