python - 使用 tkinter 窗口生成 CSV 文件
问题描述
我正在尝试创建 CSV 生成器,它将为我将提供给他的用户列表生成 csv 文件。生成的行应如下所示:
add;Username@something.com;Rolename1
add;Username@something.com;Rolename2
add;Username2@something.com;Rolename1
add;Username2@something.com;Rolename2
这是如果我选择角色 1 和 2 的复选框,它将为用户添加具有这两个角色的行。到目前为止,我必须生成文件,但我现在的主要问题是我不知道如何让它从 tkinter Text 读取用户,然后将其保存到 csv 中。我希望它只接受 AZ 和 0-9 作为用户名。到目前为止,这是我的代码:
from tkinter import *
from tkinter import ttk
import datetime
import pandas as pd
root = Tk()
root.geometry('500x500')
root.title("Csv generator")
#Creator name
creator = Entry(root, width=23)
creator.grid(column=1,row=0)
creator.insert(0, "Enter here your username")
#Functions entry
functionLabel = Label(root, text="FUNCTION", width=10).grid(column=0, row=1, padx=10)
clickFunction = StringVar()
clickFunction.set("Select your function")
Function = OptionMenu(root, clickFunction, "add", "chg", "cho", "del")
Function.grid(column=0, row=2, padx=10)
#Username list
usernameLabel = Label(root, text="USERNAME",width=10)
usernameLabel.grid(column=1, row=1, padx=10)
usernameList = Text(root, width=10, height=4)
usernameList.grid(column=1, row=1, padx=10, rowspan=4)
#Role List
rolesLabel = Label(root, text="ROLES", width=10)
rolesLabel.grid(column=2, row=1, padx=10)
rolesCheck1 = StringVar()
role1 = Checkbutton(root, text="Role01", variable=rolesCheck1, onvalue="Role01", offvalue="")
role1.grid(column=2, row=2, padx=10)
rolesCheck2 = StringVar()
role2 = Checkbutton(root, text="Role02", variable=rolesCheck2)
role2.grid(column=2, row=3, padx=10)
rolesCheck3 = StringVar()
role3 = Checkbutton(root, text="Role1", variable=rolesCheck3)
role3.grid(column=2, row=4, padx=10)
rolesCheck4 = StringVar()
role4 = Checkbutton(root, text="Role2", variable=rolesCheck4)
role4.grid(column=2, row=5, padx=10)
#Read Textbox
def usersout():
inputvalue = usernameList.get("1.0","end-1c")
print(inputvalue)
#CSV Creator part
def csvGenerate():
basename= creator.get()
suffix = datetime.datetime.now().strftime("%Y%m%d%H%M.csv")
filename = "_".join([basename, suffix]) # e.g. 'Creator_120508171442'
df = pd.read_csv('Template.csv')
df2 = df.append(usernameList, ignore_index=True)
df.to_csv(filename, index=False, header=False)
#Generate button
GENERATE = Button(root, text="GENERATE", command=csvGenerate).grid(column=0, row=6, columnspan=3)
root.mainloop()
编辑 20.10.2021:按照建议将我的代码从 csv 更改为 pandas,但仍然不知道如何继续。
解决方案
我建议使用 for 循环创建检查按钮,并将这些StringVar
s 存储在一个列表中,以后可以很容易地使用它来确定选择了哪些角色。
请注意,csv
使用 module 而不是pandas
:
from tkinter import *
from tkinter import ttk
import datetime
import csv
root = Tk()
root.geometry('500x500')
root.title("Csv generator")
#Creator name
creator = Entry(root, width=23)
creator.grid(column=1, row=0)
creator.insert(0, "Enter here your username")
#Functions entry
Label(root, text="FUNCTION", width=10).grid(column=0, row=1, padx=10)
clickFunction = StringVar(value="Select your function")
OptionMenu(root, clickFunction, "add", "chg", "cho", "del").grid(column=0, row=2, padx=10)
#Username list
Label(root, text="USERNAME", width=10).grid(column=1, row=1, padx=10)
usernameList = Text(root, width=10, height=4)
usernameList.grid(column=1, row=1, padx=10, rowspan=4)
#Role List
Label(root, text="ROLES", width=10).grid(column=2, row=1, padx=10)
role_vars = [] # for storing those StringVars
# create the checkbuttons
for row, role in enumerate(("Role01", "Role02", "Role1", "Role2"), 2):
var1 = StringVar()
Checkbutton(root, text=role, variable=var1, onvalue=role, offvalue='').grid(row=row, column=2, padx=10, sticky='w')
role_vars.append(var1)
#CSV Creator part
def csvGenerate():
basename = creator.get()
suffix = datetime.datetime.now().strftime("%Y%m%d%H%M.csv")
filename = "_".join([basename, suffix]) # e.g. 'Creator_202110211234.csv'
with open(filename, "w", newline="") as file:
writer = csv.writer(file)
func = clickFunction.get() # use the StringVar instead
# get user list
users = usernameList.get('1.0', 'end-1c').splitlines()
# get selected roles
roles = [role.get() for role in role_vars if role.get()]
for user in users:
for role in roles:
writer.writerow([func, user, role])
#Generate button
Button(root, text="GENERATE", command=csvGenerate).grid(column=0, row=6, columnspan=3)
root.mainloop()
推荐阅读
- javascript - Reactjs - 错误:对象作为 React 子项无效(找到:带有键 {type,data} 的对象)
- javascript - 如何将数组的浅拷贝传递给函数
- php - 如何获取当前网页名称并通过一些修改回显
- c - 在 C 中使用正则表达式组
- arrays - 我的 strncmp 不适用于两个二维数组
- java - 使用 intellij 为 EclipseLink 延迟加载启用编织
- java - 由于 SQLit,该应用程序无法在 Android 9 上运行
- python - 过滤当前页面上的项目
- javascript - javascript:如何在循环中进行多个异步调用
- swift - Firestore 禁用缓存 - Swift Singleton