2017-06-15 66 views
2

我试图设计与5条目窗口小部件(双方)范围的小tkinter窗口使用for循环就像下面的图像。将值设置为tkinter条目窗口小部件内for循环时发出

enter image description here

现在我要求是请在左侧窗口小部件的一些价值,同时也让标签键就会自动在右侧显示。我尝试了使用lambda的绑定方法并获得了值。但我想知道如何设置每个小部件的值。

我的代码

import tkinter as tk 
root = tk.Tk() 
num = 5 

def my_funct(var): 
    e.set(var) 

r=0 
for y in range(num): 
    e = tk.StringVar() 

    y = tk.Entry(root) 
    y.bind("<Tab>", lambda event, y=y:my_funct(y.get())) 
    y.grid(row=r, column=1) 

    z = tk.Entry(root, textvariable=e) 
    z.grid(row=r, column=2) 
    r +=1 

root.mainloop() 

我得到的结果是像下面的图片。有人可以用我的代码来帮助我实现我期望的目标吗?

enter image description here

正如你可以找出该值在每一个Tab键,最后只控件显示。有人可以帮我解决这个问题,请解释我如何实现我所需的输出。

在此先感谢!

回答

1

您的问题源于事实上您每次都重新指定您的StringVar,因此e始终是最后创建的一个。你需要一个结构来保存这些东西,例如 - dict{entry:variable}对。

这里有一个片段:

import tkinter as tk 
root = tk.Tk() 
num = 5 

pairs = {} 

def my_funct(entry): 
    var = pairs.get(entry) 
    if var is not None: 
     var.set(entry.get()) 

# r = 0 
for _ in range(num): 
    e = tk.StringVar() 

    y = tk.Entry(root) 
    y.bind("<Tab>", lambda event, y=y:my_funct(y)) 
    y.grid(row=_, column=1) 

    z = tk.Entry(root, textvariable=e) 
    z.grid(row=_, column=2) 
    # r +=1 

    pairs.update({y:e}) 

root.mainloop() 
+0

雅它的工作好,我希望感谢很多答案。我会选择这一个。顺便说一声,如果你告诉我如何使用'delete(0,END)'方法一次性清除小部件,我将不胜感激。因为它的for循环让我感到困惑不已 – Sundararajan

+1

@Sundararajan,[看看](http://effbot.org/tkinterbook/entry.htm#Tkinter.Entry.delete-method)通过effbot.org网站。但在你的情况下,你可以用var.set('')'将'textvariable'设置为'''',只需创建一个与'my_funct'相同的新函数。它也被描述[在这里](http://effbot.org/tkinterbook/variable.htm)。无论如何,这并不完全清楚你问什么 - 如果你卡住了,随时更新你的问题。 – CommonSense

+0

感谢您的帮助伙计:)将解决。 – Sundararajan