通过每个框的单独按钮从每个输入框获取值

Get values from each entry box through individual button for each box

我通过循环创建了 Entry 和按钮,就像这样

for i in range(len(headers)):
        pos_y = 0;

        e = tk.Entry(top, width = 30);
        e.grid(row = pos_x, column = pos_y);
        entry[i] = e;
        e.insert(0, headers[pos_x].get('name'));
        pos_y += 1;

        b = tk.Button(top, text = 'Copy');
        b.grid(row = pos_x, column = pos_y);
        button[i] = b;
        pos_y += 1;

我有两个 Entry 和 Button 的字典,输出是这样的。 Output

我想为每个按钮做的是,我想将值从文本框复制到剪贴板。 我知道如何复制到剪贴板,只是获取相应的值是问题所在。 编辑: Header 是字典列表; pos_x用于从一行切换到另一行; pos_y 用于切换到下一列。 在这里,我对字典进行迭代,以将名称从字典获取到第一个文本框,将值获取到另一个文本框。 像这样:{"name": "key", "value": "2500"} button 和 entry 是字典,上面声明为 entry{} 和 button{}。

我认为你让事情变得比他们需要的更复杂。您不需要将按钮放在 dict/list 中,因为它们在创建后不会更改。 而是考虑使用一个简单的列表来描述您的条目值,然后在需要时使用它们的索引调用它们的 get 方法。

这是我的例子。如果您有任何问题,请告诉我。

import tkinter as tk


class Example(tk.Tk):
    def __init__(self):
        super().__init__()
        self.entry_list = []

        r = 0
        c = 0
        for i in range(6):
            self.entry_list.append(tk.Entry(self, width=30))
            self.entry_list[-1].grid(row=r, column=c)
            tk.Button(self, text='Copy', command=lambda ndex=i: self.copy_to_clipboard(ndex)).grid(row=r, column=c+1)
            if r == 2:
                c += 2
                r = 0
            else:
                r += 1

    def copy_to_clipboard(self, ndex):
        print(self.entry_list[ndex].get())
        self.clipboard_clear()
        self.clipboard_append(self.entry_list[ndex].get())

Example().mainloop()

结果:

你可以简单地将入口引用传递给相应按钮的命令函数,如下所示:

def do_clipboard_copy(entry):
    text = entry.get() # get the entry content
    print(text)
    # do whatever you know to copy the entry content to clipboard

for i in range(len(headers)):
    row = i // 2
    col = (i % 2) * 2
    entry = Entry(top, width=30)
    entry.grid(row=row, column=col)
    entry.insert(0, headers[i].get('name'))
    Button(top, text='Copy', command=lambda e=entry: do_clipboard_copy(e)).grid(row=row, column=col+1)