2015-12-14 63 views
3

我已經制作了一個示例程序,它的外觀如何..我的目標是讓數據條目永久寫入按鈕,以便dat再次運行程序目前的價格。如何使永久性條目更改爲標籤或按鈕

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)

或者使用該按鈕的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函數來創建該按鈕的唯一呼叫。 'z'的值相對於列表中按鈕的索引位置。

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

thx這麼多會嘗試:) –

+0

我從你的帖子thx學到了很多,讓我再次thx ..它有助於很多:) –