繁体   English   中英

如何使用tkinter for python中的迭代创建输入字段和按钮以从输入字段获取内容?

[英]how do I create entry fields and buttons to get the content from the entry field using iteration in tkinter for python?

我正在尝试使用用户指定的一定数量的按钮和输入字段制作tkinter GUI,因此在下面的这段代码中,例如,如果用户将变量号指定为3,我希望有3个输入框和,我想进行设置,以便在第一个字段中键入一个值并单击它旁边的按钮时,我希望该按钮从它旁边的输入字段中读取该值。 我还需要将每个输入字段分配给将通过相同的迭代循环创建的变量。 但是,特别是在将按钮映射到输入字段方面,我遇到了困难,因为我似乎总是遇到文本“ AttributeError:'NoneType'对象没有属性'get'”的错误。 任何人都可以修复我的代码或帮助我找到该问题的替代解决方案吗? 抱歉,说明有些混乱。 这与仅获取条目小部件的内容的问题不同,因为我需要它使用迭代来创建一定数量的条目小部件和按钮,而我的问题被标记为重复的问题并不能解释如何迭代地将每个输入字段映射到每个按钮。 例如,如果我输入3作为变量,则我需要程序创建输入字段1,输入字段2和输入字段3以及按钮1,按钮2和按钮3,然后使用迭代将每个按钮映射到其各自的输入字段。 我尝试使用字典,但这似乎并没有太大帮助。

import tkinter as tk
root = tk.Tk()
number = 3
d={}
def callBack():
    print(d["E{0}".format(i)].get())
    return
for i in range(0,number):
    d["E{0}".format(i)] = tk.Entry(root)
    d["E{0}".format(i)].grid(row=i, column=0)
    d["B{0}".format(i)] = tk.Button(root, text="test", command=callBack)
    d["B{0}".format(i)].grid(row=i, column=1)

在此站点上,可能已经询问了“无类型对象没有属性'获取'”的解决方案一百次,答案始终是相同的。

在python中,当您执行x = y().z()x将被赋予z()的值。 x=tk.Entry(...).grid(...)x将为None因为grid(...)始终返回None 解决方案是始终与创建窗口小部件时分开调用gridpackplace

您还声称自己在使用字典时遇到了问题,但是除了使问题变得不必要的困难之外,我在您的代码中看不到任何问题。 您可以直接将i用作索引,而不必为索引建立字符串。 如果需要同时跟踪按钮和条目,我建议使用两个变量而不是一个。

问题的一部分可能与您试图在command做一些非常奇怪的事情有关。 您正在尝试调用条目的get方法,但这没有意义,因为它只是返回一个被丢弃的值。 在几乎所有情况下,正确的解决方案是编写适当的函数,而不是尝试将功能压缩到lambda中。

例:

def handle_click(i):
    entry = entries[i]
    print("the value is {}".format(entry.get()))

buttons = {}
entries = {}
for i in range(0,number):
    entry = tk.Entry(root)
    button = tk.Button(root, text="test", command=lambda i=i: handle_click(i))

    buttons[i] = button
    entries[i] = entry

    entry.grid(row=i, column=0)
    button.grid(row=i, column=1)

您需要在调用grid之前保存EntryButton

import tkinter as tk

number = 3
root = tk.Tk()

def get_on_click(widget_dict, entry_name):
    def on_click():
        result = widget_dict[entry_name].get()
        print("%s = %s" % (entry_name, result))
        return result
    return on_click

d = dict()
for i in range(0, number):
    entry_name = "E{0}".format(i)
    button_name = "B{0}".format(i)
    print(entry_name, button_name)
    d[entry_name] = tk.Entry(root)
    d[entry_name].grid(row=i, column=0)
    d[button_name] = tk.Button(root, text="test", command=get_on_click(d, entry_name))
    d[button_name].grid(row=i, column=1)

root.mainloop()

这应该可以帮助您入门。

在您的评论中,您询问如何将值保存在Entry 我将创建一个类来处理所有事情:

import tkinter as tk

number = 3
root = tk.Tk()

class EntryButton(object):
    def __init__(self, root, number):
        self.number = number
        self.entry = tk.Entry(root)
        self.button = tk.Button(root, text="test", command=self.on_click)
        self.entry.grid(row=number, column=0)
        self.button.grid(row=number, column=1)
        self.value = None

    def on_click(self):
        self.value = self.entry.get()

storage = dict()
for i in range(0, number):
    storage[i] = EntryButton(root, i)

root.mainloop()

for i in range(0, number):
    value = storage[i].value
    print(f"storage[{i}] = {value}")

如您所见,这消除了很多额外的工作。

从输入获取文本

Entry.get("1.0", "end-1c")
# 1.0 for get first line.
# end-1c for if last letter space, this deletes it.

更多信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM