如何更新tkinter中的“live”文本框?

时间:2014-03-19 21:58:57

标签: python tkinter

我想问一下如何在python中创建一个“LIVE”文本框?该程序是自动售货机的模拟器(下面的代码)。我希望有一个显示实时信用更新的文本框你如何在tkinter中做到这一点?

例如:假设窗口中间有一个信用卡框,里面有0。按下10p按钮时,信用卡框应从“0”变为“0.10”。 有没有可能在tkinter和python 3.3.2中做? 提前谢谢!

import sys
import tkinter as tk

credit = 0
choice = 0

credit1 = 0
coins = 0
prices = [200,150,160,50,90]
item = 0
i = 0
temp=0
n=0
choice1 = 0
choice2 = 0

credit1 = 0
coins = 0
prices = [200,150,160,50,90]
item = 0
i = 0
temp=0
n=0
choice1 = 0
choice2 = 0

def addTENp():
    global credit
    credit+=0.10

def addTWENTYp():
    global credit
    credit+=0.20

def addFIFTYp():
    global credit
    credit+=0.50

def addPOUND():
    global credit
    credit+=1.00

def insert():
    insert = Tk()

    insert.geometry("480x360")
    iLabel = Label(insert, text="Enter coins.[Press Buttons]").grid(row=1, column=1)

    tenbutton = Button(insert, text="10p", command = addTENp).grid(row=2, column=1)
    twentybutton = Button(insert, text="20p", command = addTWENTYp).grid(row=3, column=1)
    fiftybutton = Button(insert, text="50p", command = addFIFTYp).grid(row=4, column=1)
    poundbutton = Button(insert, text="£1", command = addPOUND).grid(row=5, column=1)


insert()

2 个答案:

答案 0 :(得分:8)

当然可以!只需在框架中添加另一个标签,并在调用其中一个添加函数时更新text属性。此外,您可以使用一个add函数来简化该代码,用于所有不同的金额。

def main():
    frame = Tk()
    frame.geometry("480x360")

    Label(frame, text="Enter coins.[Press Buttons]").grid(row=1, column=1)
    display = Label(frame, text="") # we need this Label as a variable!
    display.grid(row=2, column=1)

    def add(amount):
        global credit
        credit += amount
        display.configure(text="%.2f" % credit)

    Button(frame, text="10p", command=lambda: add(.1)).grid(row=3, column=1)
    Button(frame, text="20p", command=lambda: add(.2)).grid(row=4, column=1)
    Button(frame, text="50p", command=lambda: add(.5)).grid(row=5, column=1)
    Button(frame, text="P1",  command=lambda: add(1.)).grid(row=6, column=1)
    frame.mainloop()

main()

更多要点:

  • 请注意,您定义了两次变量
  • 你不应该给一个与函数同名的变量,因为这会影响函数
  • 可能只是一个复制粘贴错误,但您忘记调用mainloop并且您的tkinter导入与您使用类的方式不一致(没有tk前缀)
  • 您可以在创建GUI元素后立即进行布局,但请注意,在这种情况下,GUI元素不会绑定到变量,而是布局函数的结果,即None

答案 1 :(得分:1)

借用tobias_k优秀答案中的框架,我建议你改用DoubleVar

from tkinter import ttk
import tkinter as tk

def main():
    frame = Tk()
    frame.geometry("480x360")

    credit = tk.DoubleVar(frame, value=0)
    # credit = tk.StringVar(frame, value="0")

    ttk.Label(frame, textvariable = credit).pack()

    def add_credit(amt):
        global credit
        credit.set(credit.get() + amt)
        # new_credit = str(int(credit.get().replace(".",""))+amt)
        # credit.set(new_credit[:-2]+"."+new_credit[-2:])

    ttk.Button(frame, text="10p", command = lambda: add_credit(0.1)).pack()
    # ttk.Button(frame, text="10p", command = lambda: add_credit(10)).pack()

    ttk.Button(frame, text="20p", command = lambda: add_credit(0.2)).pack()
    # ttk.Button(frame, text="20p", command = lambda: add_credit(20)).pack()

    ttk.Button(frame, text="50p", command = lambda: add_credit(0.5)).pack()
    # ttk.Button(frame, text="50p", command = lambda: add_credit(50)).pack()

    ttk.Button(frame, text="P1",  command = lambda: add_credit(1.0)).pack()
    # ttk.Button(frame, text="P1",  command = lambda: add_credit(100)).pack()

    frame.mainloop()

该代码中的注释是一种替代实现,如果只是公正的话,它将更好地工作。这样可以保证代码中不会出现任何奇怪的浮点错误。