Tkinter - 从字典中更新先前生成的小部件中变量的更改

时间:2018-04-23 10:37:49

标签: python dictionary tkinter widget

我需要在“ventana2”中表示在“ventana”中输入的对,以便在键是新的时出现新的帧。当密钥已经存在于字典中时,我需要更改先前为该密钥创建的框架中的旧值(新值是添加旧的和新的)。 我无法通过密钥获得与我的词典伙伴永久相关的帧。 非常感谢你,对不起我的英语。 以下是代码摘要:

import tkinter as tk

ventana = tk.Tk()
ventana2 = tk.Tk()

name = tk.StringVar()
tk.Entry(ventana, textvariable=name, width=30).grid(row=0, column=1)
tk.Label(ventana, text = 'Nombre').grid(row=0, column=0)

value = tk.StringVar()
tk.Entry(ventana, textvariable=value, width=30).grid(row=1, column=1)
tk.Label(ventana, text = 'Celular').grid(row=1, column=0)

contactos={}

def intro():
    nom = name.get()
    if nom in contactos:
        cel = contactos[nom] + float(value.get())
        contactos[nom] = cel
    else:
        cel = float(value.get())
        contactos[nom] = cel
        create_widget()

def create_widget():
    frame = tk.Frame(ventana2)
    frame.pack()
    nomb = tk.Label(frame, text=name.get()).pack(side=tk.LEFT)
    telf = tk.Label(frame, text=contactos[name.get()]).pack(side=tk.RIGHT) 


intro_btn = tk.Button(ventana, text='Intro', command = intro)
intro_btn.grid(row=2, column=0, columnspan=2, sticky = 'ew')

ventana.mainloop()

1 个答案:

答案 0 :(得分:0)

create_widget()函数内创建的标签位于函数范围内。函数结束后,对标签的所有引用都将丢失。因此,您需要考虑一种方法来保存对标签的引用(建议使用return语句)并将它们与contactos字典相关联。

更新 - 将一个框架与值

相关联

保存对您要记住的对象的引用以及要用于在列表(或dict或tuple等)中调用它的名称。然后将所有这些附加到您的全局小部件列表中。例如:

nomb = tk.Label( ... )
widget_parameters = ['Nomb Label', nomb]
global_widget_list.append(widget_parameters)

然后,您可以在global_widget_list中搜索您已命名的任何窗口小部件,并获取该窗口小部件的参考资料。

我已经包含了一些示例代码来说明您可以实现的一种方法。玩弄它直到你理解它,你将能够在你自己的应用程序中实现它。

from tkinter import *
import time

root = Tk()
root.geometry('300x200')

global_widget_list = []    # List for holding all widgets

def make_label():   # Create label
    text_label = Label(root,text='Text input')
    text_label.pack()
    global_widget_list.append(['Text Label',text_label]) # Add widget to list

def make_input():   # Create entry
    inputvar = StringVar()
    text_input = Entry(root,width=20,textvariable=inputvar)
    text_input.pack()
    global_widget_list.append(['Text Input',text_input,inputvar]) # Add widget to list

make_label()    # Run functions to cretae GUI
make_input()
root.update()   # Take care of updating GUI
time.sleep(3)   # Wait so you have time to see the original, then change it

# Now, loop through all widgets and do what you want
for widget in global_widget_list:
    widget_name = widget[0]
    widget_id = widget[1]
    print(widget_name, 'has identity', widget_id)

    if widget_name == 'Text Label':
        print('Changing test label text to: ALL CAPS')
        widget_id.configure(text='ALL CAPS')

    if widget_name == 'Text Input':
        print('Changing text in entry to: SAMPLE')
        var = widget[2]
        var.set('SAMPLE')

root.update()   # Take care of updating GUI
time.sleep(3)   # Wait so you have time to see the changes, then change it

print('Removing Entry from application GUI')
global_widget_list[1][1].pack_forget() # Remove entry form GUI