首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >tkinter条目使用从字典中选择的值填充

tkinter条目使用从字典中选择的值填充
EN

Stack Overflow用户
提问于 2021-11-13 17:52:25
回答 1查看 35关注 0票数 0

我需要用从字典中选择的值填充输入框。字典列表由csv文件编译而成。代码如下:

代码语言:javascript
运行
复制
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结构:

代码语言:javascript
运行
复制
name,password,city,code
apple,1234,rome,20 
banana,2345,paris,20 
cherry,3456,london,21

我关心的是def display():和def select():函数。这些在显示和选择中起作用。问题是,当按下‘select’时,列表中的最新字典值用于填充条目框,我希望条目填充与用户在行中显示的值相对应的值。

EN

回答 1

Stack Overflow用户

发布于 2021-11-14 23:31:41

我已经找到了解决方案。我已经根据这里的指导调整了代码:https://www.geeksforgeeks.org/looping-through-buttons-in-tkinter/

代码语言:javascript
运行
复制
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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69956835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档