2016-08-07 8 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() 

나는 창이 열립니다 프로그램을 실행합니다. 단추를 클릭하면 레이블의 텍스트가 변경되지 않습니다. 나는 StringVartextvariable으로 사용하고 그 다음에 set() 함수를 호출하려고 시도했지만 그 중 하나는 작동하지 않았습니다. 나는 그것이 함수의 범위와 관련이 있다고 생각한다. 어떤 이유로 든 self.lbl = tkinter.Label()이 팝업을 전혀 내지 않기 때문에 안에 appendNumber() 기능을 배치해야했습니다.

+0

사용하지 않은'textvariable'과 label.try를 제거했다는 것을 알 수 있습니다. – Zety

답변

1

코드에 몇 가지 문제가 있습니다.

  1. labelText은 물론,

    labelText = tkinter.StringVar() 
    lbl = tkinter.Label(window, bg="blue", textvariable=labelText) 
    lbl.grid(row=0, column=0, columnspan=3) 
    
  2. 이제 텍스트를 업데이트 할 labelText.set을 사용할 수 있습니다 ... StringVar 아닌 문자열이어야합니다. 또한, 더 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

관련 문제