2016-08-07 15 views
1

私はtkinterを扱う多くの質問があることを知っていますが、私はそれらの束を見ており、どれも私を助けてくれないようです。Python Tkinterはラベルのテキストを変更します

import tkinter 

class Calculator: 

    def __init__(self): 
    window = tkinter.Tk() 
    window.geometry("200x300") 
    window.title("Calculator") 

    lbl = tkinter.Label(window, text="placeholder", bg="blue", textvariable="labelText") 
    lbl.grid(row=0, column=0, columnspan=3) 

    self.firstNumArray = [] 
    self.secondNumArray = [] 
    self.operation = "" 
    self.currentNum = "first" 

    def appendNumber(self, number): 
     print("Appending Number") 
     if self.currentNum == "first": 
     self.firstNumArray.append(number) 
     print("".join(str(x) for x in self.firstNumArray)) 
     lbl.config(text="".join(str(x) for x in self.firstNumArray)) 
     window.update() 
     else: 
     self.secondNumArray.append(number) 

    for i in range(1,4): 
     string = "Creating button at ({0},{1})".format(0,i) 
     print(string) 
     button = tkinter.Button(text=i, command=lambda: appendNumber(self, i)) 
     button.grid(row=1, column=i-1) 

    for i in range(1,4): 
     string = "Creating button at ({0},{1})".format(1,i) 
     print(string) 
     button = tkinter.Button(text=i+3, command=lambda: appendNumber(self, i+3)) 
     button.grid(row=2, column=i-1) 

    for i in range(1,4): 
     string = "Creating button at ({0},{1})".format(2,i) 
     print(string) 
     button = tkinter.Button(text=i+6, command=lambda: appendNumber(self, i+6)) 
     button.grid(row=3, column=i-1) 


    div = tkinter.Button(text="/") 
    mult = tkinter.Button(text="*") 
    add = tkinter.Button(text="+") 
    sub = tkinter.Button(text="-") 

    add.grid(row=1, column=3) 
    sub.grid(row=2, column=3) 
    mult.grid(row=3, column=3) 
    div.grid(row=4, column=3) 

    button = tkinter.Button(text="0") 
    button.grid(row=4, column=1) 

    window.mainloop() 



calc = Calculator() 

プログラムを起動すると、ウィンドウが開きます。ボタンをクリックすると、ラベル内のテキストは変更されません。私はtextvariableとしてStringVarを使ってみてから、set()という関数を呼び出そうとしましたが、それでも機能しませんでした。私はそれが機能の範囲と関係していると思う。何らかの理由でself.lbl = tkinter.Label()が何もポップアップしないので、__init__()の中にappendNumber()機能を配置しなければならなかった。

+0

label.tryを使って未使用の 'textvariable'を削除しています。 – Zety

答えて

1

コードにはいくつか問題があります。

  1. labelText、当然のことながら、StringVarはなく、文字列でなければなりません...

    labelText = tkinter.StringVar() 
    lbl = tkinter.Label(window, bg="blue", textvariable=labelText) 
    lbl.grid(row=0, column=0, columnspan=3) 
    
  2. 今、あなたはテキストを更新するためにlabelText.setを使用することができます。また、あなたが//整数(!)部門)と%(モジュロ)演算を使用して、一つのループですべてのボタンを置くことができselfパラメータまたはwindow.update

    def appendNumber(number): 
        if self.currentNum == "first": 
         self.firstNumArray.append(number) 
         labelText.set("".join(str(x) for x in self.firstNumArray)) 
        else: 
         self.secondNumArray.append(number) 
    
  3. 必要はありません。また、lambdaの変数は、関数が呼び出されたときではなく、宣言されたときに評価されます。つまり、lambdasはすべてi(この場合は9)の最後の値を使用します。 here。対処法として、lambda n=i+1: appendNumber(n)を使用してください。

    for i in range(9): 
        btn = tkinter.Button(text=i+1, command=lambda n=i+1: appendNumber(n)) 
        btn.grid(row=i//3+1, column=i%3) 
    
    本当に
  4. 問題ありませんが、あなたはそれらのボタンへの参照を必要としないので、あなたはもう少しコンパクト(同じ他人のために)あなたのコードを行うことができます。

    tkinter.Button(text="/").grid(row=1, column=3) 
    
+0

ありがとうございました! – Snifferdog

関連する問題