2013-04-04 80 views
3

以下是我的腳本。基本上,它會要求用戶在輸入框中輸入一個數字。一旦用戶輸入一個數字並點擊確定,它會給你組合標籤+按鈕取決於用戶輸入到輸入框中的數字。Python Tkinter:尋址由for循環創建的標籤小部件

from Tkinter import * 

root=Tk() 

sizex = 600 
sizey = 400 
posx = 0 
posy = 0 
root.wm_geometry("%dx%d+%d+%d" % (sizex, sizey, posx, posy)) 

def myClick(): 
    myframe=Frame(root,width=400,height=300,bd=2,relief=GROOVE) 
    myframe.place(x=10,y=10) 
    x=myvalue.get() 
    value=int(x) 
    for i in range(value): 
     Mylabel=Label(myframe,text=" mytext "+str(i)).place(x=10,y=10+(30*i)) 
     Button(myframe,text="Accept").place(x=70,y=10+(30*i)) 

mybutton=Button(root,text="OK",command=myClick) 
mybutton.place(x=420,y=10) 

myvalue=Entry(root) 
myvalue.place(x=450,y=10) 

root.mainloop() 

通常情況下,當我創建一個標籤控件,我會做這樣的事情

mylabel=Label(root,text='mylabel') 
mylabel.pack() 

所以,當我想以後改變我的標籤的文本,我可以只是簡單地做這

mylabel.config(text='new text') 

但是現在,因爲我使用for循環來一次創建所有標籤,無論如何要在創建標籤後解決各個標籤? 例如,用戶在輸入框中鍵入'5',程序將給我5個標籤+5個按鈕。無論如何,我可以改變各個標籤的屬性(即label.config(..))嗎?

回答

2

當然!只需製作一個標籤列表,每個標籤都要撥打place,然後您可以稍後參考它們並更改它們的值。像這樣:

from Tkinter import * 

root=Tk() 

sizex = 600 
sizey = 400 
posx = 0 
posy = 0 
root.wm_geometry("%dx%d+%d+%d" % (sizex, sizey, posx, posy)) 

labels = [] 

def myClick(): 
    del labels[:] # remove any previous labels from if the callback was called before 
    myframe=Frame(root,width=400,height=300,bd=2,relief=GROOVE) 
    myframe.place(x=10,y=10) 
    x=myvalue.get() 
    value=int(x) 
    for i in range(value): 
     labels.append(Label(myframe,text=" mytext "+str(i))) 
     labels[i].place(x=10,y=10+(30*i)) 
     Button(myframe,text="Accept").place(x=70,y=10+(30*i)) 

def myClick2(): 
    if len(labels) > 0: 
     labels[0].config(text="Click2!") 
    if len(labels) > 1: 
     labels[1].config(text="Click2!!") 

mybutton=Button(root,text="OK",command=myClick) 
mybutton.place(x=420,y=10) 

mybutton2=Button(root,text="Change",command=myClick2) 
mybutton2.place(x=420,y=80) 

myvalue=Entry(root) 
myvalue.place(x=450,y=10) 

root.mainloop() 

另請注意!在原始代碼Mylabel=Label(myframe,text=" mytext "+str(i)).place(x=10,y=10+(30*i))中,該調用將Mylabel設置爲None,因爲place方法返回None。您想要將place調用分隔成一行,就像上面的代碼一樣。

+0

是唯一的方法嗎?因爲如果用戶輸入1000,那麼標籤列表將具有1000的長度,這幾乎不可能像myClick2函數那樣使用'if'函數。並且我不能使用for循環來更改所有標籤,因爲每個單獨標籤都需要有不同的文字。但非常感謝您的幫助。 – 2013-04-04 06:05:38

+0

我剛剛包含'if'作爲如何在代碼中設置標籤配置值的示例。您仍然可以使用for循環更改標籤,您只需將所有需要的標籤保留在列表中並在循環中引用它們即可。另外請注意,您可以進行檢查以確保用戶輸入了合理的值,而不是1000。 – twasbrillig 2013-04-04 06:24:20