3

[Python 2.7] こんにちは。私は単純な Tkinter 電卓プログラムに取り組んでいますが、ボタンの 1 つを押した後、ラベルにテキストを表示できないようです。これが私が使用しているコードです。ラベル自体が機能するようになるまで、ボタン機能の一部は未完成です。

    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()
4

1 に答える 1

2

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()

これが、電卓をさらに調整するための正しい方向にあなたを導くことを願っています.

于 2012-11-29T00:02:27.980 に答える