簡體   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