是否可以动态添加多个条目并从中获取值?
就像下面的示例,如果我单击“显示数据”按钮,则所有数据都显示在不同的条目中。现在,如果我更改任何条目中的数据,如何获取更新的数据并将其保存到Values数组中?
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())
先谢谢了。 :)
答案 0 :(得分:3)
关于更新值数组,这是我想出的。
我将所有条目存储在一个列表中,以便可以通过其2D索引(i,j)对其进行引用。当您单击更新按钮时,它将从所有条目中获取值并更新values数组。这是代码。
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。我真的很想知道,如果我做的太过分了!
答案 1 :(得分:1)
我不清楚您到底希望它如何运行,但这是一个主意:将每个条目绑定到对 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
来对条目文本进行任何更改。