2015-12-14 4 views
3

Ive разработал пример программы, как обычно это выглядит. Моя цель состоит в том, чтобы запись ввода навсегда записывалась на кнопку, поэтому, если я снова запустите программу, ее обновление текущая цена.Как сделать постоянную запись Изменения на ярлыке или кнопке

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() 

и если Тереза ​​в любом случае, чтобы сделать это проще ..

+0

Вы пробовали StringVar? –

+0

Мне очень жаль, но я должен сказать, что этот код очень плохой ... Знаете ли вы, что у кнопок есть атрибут 'command'? например. 'Button (root, text =" h ", command = changeP3)' это означает, что вам не нужно связывать команду с ним. Кроме того, вы можете просто выполнить одну команду для изменения всех кнопок, передав эту команду команде. Для получения дополнительной помощи перейдите на мой сайт [здесь] (https://pythonqanda.weebly.com). –

ответ

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).

В качестве альтернативы используйте атрибут команды для кнопки, чтобы назначить функцию, вызываемую при нажатии кнопки. Использование команды для кнопки обычно больше 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, чтобы создать уникальный вызов для этой кнопки. Значение «z» относится к позиции индекса кнопки в списке.

Функция onChange при вызове запрашивает новый ввод, и если значение valid обновит объект кнопки, сохраненный в списке, используя индекс.

# 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)) 
+0

thx так много попробует :) –

+0

Я так многому учусь от ур сообщений thx, чтобы заставить меня идти thx снова .. это помогает много :) –