我需要用从字典中选择的值填充输入框。字典列表由csv文件编译而成。代码如下:
import os
import csv
from tkinter import *
import tkinter as tk
from tkinter.filedialog import *
def show():
record =[]
details = open('c.record.csv','r')
reader = csv.DictReader(details)
for line in reader:
record.append(line)
return record
def recordDetails():
name = ent_user.get()
password = ent_pw.get()
city = ent_city.get()
code = ent_code.get()
if len(name) != 0 and len(password) != 0 and len(city) != 0 and len(code) != 0:
with open('c.record.csv', 'a') as add:
w = csv.writer(add)
w.writerow([name,password,city,code])
add.close
lbl_result["text"] = "record saved"
else:
lbl_result["text"] = "values cannot be empty"
return True
def SaveToFile():
name = ent_user.get()
data = show()
for elem in data:
if name in elem.values():
lbl_result["text"] = "record exist already"
return False
recordDetails()
return True
def display() :
lbl_result["text"] = show()
record = show()
for n, dicts in enumerate(record):
for v, k in dicts.items():
position = n
user = dicts['name']
lbl_record = tk.Label(master=frm_details, height=1, width=40, bg = 'white', relief=tk.GROOVE, text=user,justify="right")
lbl_record.grid(row=1+position, column=0, padx=5)
def select():
Clear()
ent_user.insert(tk.END,dicts['name'])
ent_pw.insert(tk.END,dicts['password'])
ent_city.insert(tk.END,dicts['city'])
ent_code.insert(tk.END,dicts['code'])
btn_recSelect = tk.Button(master=frm_details ,width=5, bg = 'white', text='select',command=select)
btn_recSelect.grid(row=1+position, column=1, padx=2,sticky=tk.W)
return True
def Connect():
if len(ent_user.get()) != 0:
lbl_result["text"] = "connecting to "+ent_user.get()
def Clear() :
user = ent_user.delete(0,END)
pw = ent_pw.delete(0,END)
city = ent_city.delete(0,END)
code = ent_code.delete(0,END)
#def update(window):
#window.update()
screen = tk.Tk()
screen.title ("tk files interaction")
screen.minsize(width=400, height=300)
screen.maxsize(width=900, height=700)
screen.rowconfigure(0, minsize=50, weight=1)
screen.columnconfigure(0, minsize=60, weight=1)
screen.update()
#FORM to collect connectivity details
frm_connEntryArea = tk.Frame(master=screen,height=10, borderwidth=1, highlightbackground="orange", highlightthickness=1)
frm_connEntryArea.grid(column=0, row=0, sticky=tk.N, padx=10, pady=5)
lbl_user = tk.Label(master=frm_connEntryArea, text="name:")
lbl_user.grid(column=0, row=0, sticky=tk.NW, padx=5, pady=3)
ent_user = tk.Entry(master=frm_connEntryArea,width=30)
ent_user.grid(column=1, row=0, sticky=tk.NW, padx=5, pady=3)
lbl_pw = tk.Label(master=frm_connEntryArea, text="password:")
lbl_pw.grid(column=0, row=1, sticky=tk.NW, padx=5, pady=3)
ent_pw = tk.Entry(master=frm_connEntryArea,width=30)
ent_pw.grid(column=1, row=1, sticky=tk.NW, padx=5, pady=3)
lbl_city = tk.Label(master=frm_connEntryArea, text="city")
lbl_city.grid(column=0, row=2, sticky=tk.NW, padx=5, pady=3)
ent_city = tk.Entry(master=frm_connEntryArea,width=30)
ent_city.grid(column=1, row=2, sticky=tk.NW, padx=5, pady=3)
lbl_code = tk.Label(master=frm_connEntryArea, text="code:")
lbl_code.grid(column=0, row=3, sticky=tk.NW, padx=5, pady=3)
ent_code = tk.Entry(master=frm_connEntryArea,width=30)
ent_code.grid(column=1, row=3, sticky=tk.NW, padx=5, pady=3)
ent_code.insert(tk.END,"20")
ent_code.bind("<Button-1>", lambda event: clear_entry(ent_code))
#connect,save and clear details
btn_save = tk.Button(master=frm_connEntryArea,text="Save",width=10,fg="black",command=SaveToFile)
btn_save.grid(column=0, row=4, sticky=tk.NW, padx=5, pady=3)
btn_clear = tk.Button(master=frm_connEntryArea,text="Clear",width=10,fg="black",command=Clear)
btn_clear.grid(column=1, row=4, sticky=tk.NW, padx=5, pady=3)
btn_conn = tk.Button(master=frm_connEntryArea,text="Connect",width=10,fg="black",command=Connect)
btn_conn.grid(column=2, row=4, sticky=tk.NW, padx=5, pady=3)
#FORM to shows connectivity results and errors
frm_logs = tk.Frame(master=screen,height=10,bg="gray",relief=tk.GROOVE,highlightbackground="orange")
frm_logs.grid(column=0, row=1, sticky=tk.NW, padx=5, pady=3)
lbl_result = tk.Label(master=frm_logs, height=8, width=50,relief=tk.GROOVE, bg = 'white', text="Logs",wraplength=300,justify="left")
lbl_result.grid(row=0, column=0)
#FORM to shows Existing Record
frm_record = tk.Frame(master=screen,height=10,bg="gray")
frm_record.grid(column=1, row=1, sticky=tk.N, padx=5, pady=3)
lbl_record = tk.Label(master=frm_record, height=1, width=40, bg = 'white', relief=tk.GROOVE, text='Record',wraplength=200,justify="left")
lbl_record.grid(row=0, column=0, padx=5)
btn_recDisplay = tk.Button(master=frm_record ,width=5, bg = 'white', text='Display',command =display)
btn_recDisplay.grid(row=0, column=1, padx=2,sticky=tk.W)
frm_details = tk.Frame(master=frm_record,height=10,bg="gray")
frm_details.grid(row=1, column=0, sticky=tk.NW, padx=5, pady=3)
lbl_record = tk.Label(master=frm_details , height=1, width=30, bg = 'white', relief=tk.GROOVE, text='user',justify="right")
lbl_record.grid(row=0, column=0, padx=5)
#FORM to exit
frm_exit = tk.Frame(master=screen,height=50,width= 300, bg="orange")
frm_exit.grid(column=1, row=0, sticky=NE, padx=5, pady=3)
frm_exit.grid_propagate(0)
btn_refresh = tk.Button(master=frm_exit, text="Refresh")
btn_refresh.grid(row=2, column=3,sticky=E, padx=10,pady=10)
btn_exit = tk.Button(master=frm_exit, text="Exit", command=screen.destroy)
btn_exit.grid(row=2, column=4, sticky=E, padx=10,pady=10)
# added at the end
screen.mainloop()
csv结构:
name,password,city,code
apple,1234,rome,20
banana,2345,paris,20
cherry,3456,london,21
我关心的是def display():和def select():函数。这些在显示和选择中起作用。问题是,当按下‘select’时,列表中的最新字典值用于填充条目框,我希望条目填充与用户在行中显示的值相对应的值。
发布于 2021-11-14 23:31:41
我已经找到了解决方案。我已经根据这里的指导调整了代码:https://www.geeksforgeeks.org/looping-through-buttons-in-tkinter/
def select(u,pwd,cy,co):
Clear()
ent_user.insert(tk.END,u)
ent_pw.insert(tk.END,pwd)
ent_city.insert(tk.END,cy)
ent_code.insert(tk.END,co)
def display() :
lbl_result["text"] = show()
record = show()
for n, line in enumerate(record):
position = n
user = line['name']
for k,v in line.items():
def action(x = line['name'], p = line['password'], c = line['city'], d = line['code']):
return select(x,p,c,d)
lbl_record = tk.Label(master=frm_details, height=1, width=40, bg = 'white', relief=tk.GROOVE, text=user,justify="right")
lbl_record.grid(row=1+position, column=0, padx=5)
btn_recSelect = tk.Button(master=frm_details ,width=5, bg = 'white', text='select',command= action)
btn_recSelect.grid(row=1+position, column=1, padx=2,sticky=tk.W)
return True
我必须创建一个附加函数来指向条目更新的操作,并为循环添加一个附加函数,第一个循环遍历列表,第二个循环遍历字典项。
https://stackoverflow.com/questions/69956835
复制相似问题