【问题标题】:tkinter entry fill with value selected from dictionarytkinter 条目填充从字典中选择的值
【发布时间】:2021-11-15 07:31:40
【问题描述】:

我需要用从字典中选择的值填充输入框。 字典列表是从 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(): 函数。这些在显示和选择中起作用。问题是当按下“选择”时,列表用于填充条目框的最新字典值表单,我希望条目填充与用户在该行中显示的值相对应。

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

    我找到了解决方案。 我已经根据此处的指导调整了代码: 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
    

    我必须创建一个附加函数来指向条目更新并添加一个附加 for 循环,第一个循环遍历列表,第二个循环遍历字典项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-26
      • 2017-03-30
      • 2017-08-12
      • 2011-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-04
      相关资源
      最近更新 更多