Python Tkinter更改标签文本

时间:2016-08-07 03:50:38

标签: python tkinter

我知道有很多关于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()

当我启动程序时,窗口打开。当我单击按钮时,标签中的文本不会更改。我尝试使用StringVar作为textvariable,然后调用set()函数,但这也不起作用。我认为这与功能的范围有关。我必须将appendNumber()函数放在__init__()中,因为出于某种原因,self.lbl = tkinter.Label()根本没有弹出任何内容。

1 个答案:

答案 0 :(得分: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的最后一个值({{ 1}}在这种情况下) - 见例如here。作为补救措施,请使用9

    lambda n=i+1: appendNumber(n)
  4. 不是真正的问题,但由于您不需要对这些按钮的引用,您可以使代码更紧凑(对其他代码也一样):

    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)