【问题标题】:Issue while setting value to tkinter Entry widget within for loop在 for 循环中为 tkinter Entry 小部件设置值时出现问题
【发布时间】:2017-06-15 05:27:03
【问题描述】:

我正在尝试使用 for 循环设计具有 5 个条目小部件(两侧)范围的小型 tkinter 窗口,如下图所示。

现在我的要求是在左侧小部件中键入一些值,它应该自动显示在右侧,同时给出 Tab 键。我尝试了使用 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()

我得到的结果如下图所示。有人可以帮助我完成我的代码以实现我的期望吗?

如您所见,该值仅显示在每个 Tab 键的最后一个小部件中。有人可以帮我解决这个问题,请解释一下如何实现我所需的输出。

提前致谢!

【问题讨论】:

    标签: python python-3.x tkinter


    【解决方案1】:

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

    这是一个sn-p:

    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()
    

    【讨论】:

    • 是的,它按我的预期工作得很好,非常感谢您的回答。我会选择这个。顺便说一句,如果您告诉我如何使用delete(0,END) 方法立即清除小部件,我将不胜感激。因为它在 for 循环中让我很困惑
    • @Sundararajan, Take a look 在 effbot.org 网站上。但在您的情况下,您可以使用var.set('')textvariable 设置为'',只需创建一个与my_funct 相同方式的新函数。它也被描述为here。无论如何,您所问的问题并不完全清楚 - 如果您遇到问题,请随时更新您的问题。
    猜你喜欢
    • 2012-06-27
    • 2014-04-05
    • 2012-02-16
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-26
    • 1970-01-01
    相关资源
    最近更新 更多