如何对标签或按钮进行永久性条目更改

时间:2015-12-14 04:43:17

标签: python-3.x tkinter tkinter-entry

我做了一个关于它看起来如何的示例程序...我的目标是让数据输入永久地写入按钮,所以如果我再次运行程序,它会更新当前价格。

from tkinter import*
import tkinter as tk
import tkinter.simpledialog

def changeP1(event):
    btnT4=tk.Button(root,text='Updating...',width=10,bg='green')
    btnT4.grid(in_=root,row=1,column=2)
    btnT4.bind('<1>',changeP1)
    askC1=tk.simpledialog.askfloat('Updating...','What is the current price?')
    btnT4=tk.Button(root,text=('RM {:,.2f}'.format(askC1)),width=10)
    btnT4.grid(in_=root,row=1,column=2)
    btnT4.bind('<1>',changeP1)
def changeP2(event):
    btnT4=tk.Button(root,text='Updating...',width=10,bg='green')
    btnT4.grid(in_=root,row=2,column=2)
    btnT4.bind('<1>',changeP2)
    askC2=tk.simpledialog.askfloat('Updating...','What is the current price?')
    btnT4=tk.Button(root,text=('RM {:,.2f}'.format(askC2)),width=10)
    btnT4.grid(in_=root,row=2,column=2)
    btnT4.bind('<1>',changeP2)
def changeP3(event):
    btnT4=tk.Button(root,text='Updating...',width=10,bg='green')
    btnT4.grid(in_=root,row=3,column=2)
    btnT4.bind('<1>',changeP3)
    askC3=tk.simpledialog.askfloat('Updating...','What is the current price?')
    btnT4=tk.Button(root,text=('RM {:,.2f}'.format(askC3)),width=10)
    btnT4.grid(in_=root,row=3,column=2)
    btnT4.bind('<1>',changeP3)

root=Tk()
Title=['Item','Unit','Price']
Item=['Kopi O','Teh O','Teh Tarik']
Unit= '1 cup'
Price=[1,0.9,1.2]
cl=[0,1,2]
rw=[1,2,3]

for i in range(3):
    btnT1=tk.Button(root,text=Title[i],width=10,bg='yellow')
    btnT1.grid(in_=root,row=0,column=cl[i])

for x in range(3):
    btnT2=tk.Button(root,text=Item[x],width=10)
    btnT2.grid(in_=root,row=rw[x],column=0)

for y in range(3):
    btnT3=tk.Button(root,text=Unit,width=10)
    btnT3.grid(in_=root,row=rw[y],column=1)             

for z in range(3):
    btnT4=tk.Button(root,text=('RM {:,.2f}'.format(Price[z])),width=10)
    btnT4.grid(in_=root,row=rw[z],column=2)
    if z in range(0,1):
        btnT4.bind('<1>',changeP1)
    if z in range(1,2):
        btnT4.bind('<1>',changeP2)
    if z in range(2,3):
        btnT4.bind('<1>',changeP3)

root.mainloop()

如果还是为了使这更简单..

1 个答案:

答案 0 :(得分:2)

您有2个选项(我知道),因为您正在动态创建按钮。这两个选项只需要一个功能。

如果您希望使用bind,则可以使用event.widget

获取所选小部件
def onChange(event):
    ans = tk.simpledialog.askfloat('Updating...','What is the current price?')
    if ans: # checks if None is returned when clicking cancel
        event.widget.config(text='RM {:,.2f}'.format(ans))

所以在你的循环中,你只有一个绑定btnT4.bind('<1>', onChange)

或者使用按钮的command属性来指定按下按钮时要调用的函数。使用按钮的命令通常比绑定更加pythonic。

这要求您还创建一个列表来存储按钮,以允许该函数知道要更改的小部件。

btn_list = [] # create an empty list for the buttons

# Your for loop will look like this the command parameter instead 
# and append the button to the list
for z in range(3):
    btnT4=tk.Button(root,text=('RM {:,.2f}'.format(Price[z])),width=10,\
                    command=lambda i=z: onChange(i))
    btnT4.grid(in_=root,row=rw[z],column=2)
    btn_list.append(btnT4)

lambda会将z的值传递给onChange函数,以便为该按钮创建唯一的调用。 &#39; z&#39;的价值是相对于列表中按钮的索引位置。

调用onChange函数时会询问新输入,如果有效则会使用索引更新列表中存储的按钮对象。

# Your change function will look like this
def onChange(i):
    ans = tk.simpledialog.askfloat('Updating...','What is the current price?')
    if ans:
        btn_list[i].config(text='RM {:,.2f}'.format(ans))