2016-08-18 87 views
1

我想從輸入到TKinter中創建的輸入框中的值中更新列表中的值。在我的例子中,用戶在列表中輸入人物的真實姓名。他們的真名將取代example_list中的'x'。從Tkinter輸入框更新列表中的值 - Python

我已經在方法中指定了全局變量,但更改僅適用於列表中迭代的第二個值 - 第一個是初始化值 - 下面代碼中的值爲99。

我也嘗試過指定一個單獨更新我[1]的lambda函數,但是這不起作用 - 錯誤的語法。除了quit()函數似乎是繼續迭代的唯一方法。

有沒有辦法乾淨地做到這一點,並與清單中的第一項更新?

from Tkinter import * 

example_list = [['Jimmy Bob','x','78'],[" Bobby Jim",'x','45'] ,["Sammy Jim Bob",'x','67'] ]  #Nickname/Real Name/Age 

newValue = 99 

def replace(): 
    global newValue 
    newValue = e1.get() 
    print("Their real name is %s" %(e1.get())) 
    #return(newValue) 
    win.quit() 

root = Tk() 

for i in example_list: 

     win = Toplevel(root) 
     #win.lift()            
     e1 = Entry(win) 
     e1.grid(row=1, column=0) 

     var = StringVar() 
     var.set(i[0]) 
     Label(win, textvariable = var).grid(row=0, column=0) 

     Button(win, text='Enter Real Name', command=replace).grid(row=2, column=0, pady=4) 
     #Button(win, text='Enter Real Name', command=lambda: i[1] =replace()).grid(row=2, column=0, pady=4) 

     i[1] = newValue 

     win.mainloop() 

root.mainloop() 

for i in example_list: 
    print(i) 
+3

你想在這裏做什麼?你正在創建一個新的頂層窗口然後退出它?爲什麼?如果你只是想從用戶那裏獲得輸入,爲什麼不直接使用tksimpledialog呢? –

+0

@WayneWerner謝謝。太老實,我不知道這是一個選擇。花了幾個小時尋找tkinter和頂級的孩子窗戶,我只能找到。您的解決方案解決了我遇到的所有問題。 – alkey

回答

0

感謝Wayne Werner指導我走向tksimpledialog,解決問題的方法就在這裏。

from Tkinter import * 
import tkSimpleDialog 

example_list = [['Jimmy Bob','x','78'],[" Bobby Jim",'x','45'] ,["Sammy Jim Bob",'x','67'] ] 

root = Tk() 
root.geometry("400x400") 
Label(root, text = "Enter the names in the dialog").grid(row=0, column=0) 

for i in example_list: 
    root.lower() 
    i[1] = tkSimpleDialog.askstring('Enter their real name', 'What is %s real name' %i[0]) 
    print(i[1]) 


root.mainloop() 
+0

我很確定你不需要根部分 - 你的'for'循環就足夠了,並且可以獨立運行。 –

+0

@WayneWerner謝謝,是的,你是對的,這是不需要的,我打算使用根屏幕添加更多的信息,但對於這個問題,這是不必要的,所以我會做一個編輯。 – alkey