添加多个条目并从中动态检索数据

Add multiple Entries and retrieve data from them dynamically

有没有办法动态添加多个条目并从中获取值?

如以下示例所示,如果我单击“显示数据”按钮,所有数据将显示在不同的条目中。现在,如果我更改任何条目中的数据,我如何才能获取更新后的数据并将它们保存到值数组中?

from tkinter import *
from tkinter import ttk

class Root(Tk):

    def __init__(self):
        super(Root, self).__init__()
        self.createMultipleEntries()

    def createMultipleEntries(self):
        self.values = [
            ["Full Name", "Email", "Phone", "Street Address", "Job Title"],
            ["Alex Blackater", "ablackater0@wordpress.org", "507-340-8136", "81604 Moose Park", "Senior Financial Analyst"],
            ["Alvy Chartres", "achartres1@linkedin.com", "926-801-1685", "4 Sundown Place", "Executive Secretary"],
            ["Juieta Train", "jtrain2@ucoz.com", "861-881-9312", "953 Hintze Circle", "Professor"],
            ["Basil Effemy", "beffemy3@liveinternet.ru", "156-293-8817", "115 Brentwood Trail", "Research Associate"],
            ["Asher MacAllister", "amacallister4@t-online.de", "263-605-8166", "8672 Stoughton Road", "Software Engineer II"]
        ]

        self.label_frame = ttk.LabelFrame(self)
        self.label_frame.pack()

        self.button_show = ttk.Button(self.label_frame, text="Show Data", command=self.onShowButtonClick)
        self.button_show.grid(row=0, column=0)
        self.button_update = ttk.Button(self.label_frame, text="Update Data", command=self.onUpdateButtonClick)
        self.button_update.grid(row=0, column=1)

    def onShowButtonClick(self):
        self.values_length = len(self.values)
        for i in range(1, self.values_length):
            entry_full_name = ttk.Entry(self.label_frame)
            entry_full_name.grid(row=i, column=0)
            entry_full_name.insert(0, self.values[i][0])

            entry_email = ttk.Entry(self.label_frame)
            entry_email.grid(row=i, column=1)
            entry_email.insert(0, self.values[i][1])

            entry_phone = ttk.Entry(self.label_frame)
            entry_phone.grid(row=i, column=2)
            entry_phone.insert(0, self.values[i][2])

            entry_street_address = ttk.Entry(self.label_frame)
            entry_street_address.grid(row=i, column=3)
            entry_street_address.insert(0, self.values[i][3])

            entry_job_title = ttk.Entry(self.label_frame)
            entry_job_title.grid(row=i, column=4)
            entry_job_title.insert(0, self.values[i][4])

    def onUpdateButtonClick(self):
        pass

def main():
    root = Root()
    root.mainloop()

if __name__ == '__main__':
    main()

有没有办法动态设置如下所示的内容?

entery_variable = StringVar()

entry_ = ttk.Entry(self.label_frame, textvariable=entery_variable)
entry_.grid(row=i, column=0)

print(entry_variable.get())

提前致谢。 :)

我不清楚您希望它如何运行,但我有一个想法:将每个条目绑定到一个函数,该函数响应 Return 并在回调函数中进行处理。

def onShowButtonClick(self):
    self.values_length = len(self.values)
    for i in range(1, self.values_length):

        # creating the entrys...

        entry_full_name.bind('<Return>', self.change)
        entry_email.bind('<Return>', self.change)
        entry_phone.bind('<Return>', self.change)
        entry_street_address.bind('<Return>', self.change)
        entry_job_title.bind('<Return>', self.change)

def change(self, event):
    print(event.widget.get())

如果您希望条目应该捕获每个条目的实际更改,您应该在创建时将它们关联到 StringVar(),然后使用 trace 挂钩对条目文本的任何更改。

关于更新您的值数组,这是我的想法。

我将所有条目存储在一个列表中,这样我就可以通过它的二维索引 (i,j) 来引用它。当您单击更新按钮时,它会从所有条目中获取值并更新值数组。这是代码。

from tkinter import *
from tkinter import ttk

class Root(Tk):

    def __init__(self):
        super(Root, self).__init__()
        self.createMultipleEntries()

    def createMultipleEntries(self):
        self.values = [
            ["Full Name", "Email", "Phone", "Street Address", "Job Title"],
            ["Alex Blackater", "ablackater0@wordpress.org", "507-340-8136", "81604 Moose Park", "Senior Financial Analyst"],
            ["Alvy Chartres", "achartres1@linkedin.com", "926-801-1685", "4 Sundown Place", "Executive Secretary"],
            ["Juieta Train", "jtrain2@ucoz.com", "861-881-9312", "953 Hintze Circle", "Professor"],
            ["Basil Effemy", "beffemy3@liveinternet.ru", "156-293-8817", "115 Brentwood Trail", "Research Associate"],
            ["Asher MacAllister", "amacallister4@t-online.de", "263-605-8166", "8672 Stoughton Road", "Software Engineer II"]
        ]

        self.label_frame = ttk.LabelFrame(self)
        self.label_frame.pack()

        self.button_show = ttk.Button(self.label_frame, text="Show Data", command=self.onShowButtonClick)
        self.button_show.grid(row=0, column=0)
        self.button_update = ttk.Button(self.label_frame, text="Update Data", command=self.onUpdateButtonClick)
        self.button_update.grid(row=0, column=1)

        self.entryList = []

    def onShowButtonClick(self):
        self.values_length = len(self.values)
        for i in range(1, self.values_length):
            entry_full_name = ttk.Entry(self.label_frame)
            entry_full_name.grid(row=i, column=0)
            entry_full_name.insert(0, self.values[i][0])

            entry_email = ttk.Entry(self.label_frame)
            entry_email.grid(row=i, column=1)
            entry_email.insert(0, self.values[i][1])

            entry_phone = ttk.Entry(self.label_frame)
            entry_phone.grid(row=i, column=2)
            entry_phone.insert(0, self.values[i][2])

            entry_street_address = ttk.Entry(self.label_frame)
            entry_street_address.grid(row=i, column=3)
            entry_street_address.insert(0, self.values[i][3])

            entry_job_title = ttk.Entry(self.label_frame)
            entry_job_title.grid(row=i, column=4)
            entry_job_title.insert(0, self.values[i][4])

            self.entryList.append([entry_full_name, entry_email, entry_phone, entry_street_address, entry_job_title])

    def onUpdateButtonClick(self):
        for i in range(1, len(self.values)):
            for j in range(len(self.values[0])):
                self.values[i][j] = self.entryList[i-1][j].get()
        # print(self.values)

def main():
    root = Root()
    root.mainloop()

if __name__ == '__main__':
    main()

P.S。不过,我真的很想知道,如果我的所作所为有点矫枉过正!