【问题标题】:Generating CSV file with tkinter window使用 tkinter 窗口生成 CSV 文件
【发布时间】:2021-10-19 12:27:14
【问题描述】:

我正在尝试创建 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 中。我希望它只接受 A-Z 和 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()

Window

2021 年 10 月 20 日编辑: 按照建议将我的代码从 csv 更改为 pandas,但仍然不知道如何继续。

【问题讨论】:

标签: python pandas csv tkinter


【解决方案1】:

我建议使用 for 循环创建检查按钮,并将这些 StringVars 存储在一个列表中,以后可以轻松使用该列表来确定选择了哪些角色。

注意使用csv模块而不是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()

【讨论】:

  • 非常感谢!它现在可以工作了!
  • 只是好奇你为什么用enumerate(..., 2)而不是row+2
  • @TheLizzard 没有特殊原因。如果两者的结果相同,你为什么要问这个?
  • @acw1668 我通常使用row+2,我还没有看到有人真正使用enumerate 中的start 参数。所以我很好奇你是否有特殊原因。我总是像在写代码一样查看代码,并检查它是否与我写的内容相符。
  • @TheLizzard 如果我可以指定起始索引,那为什么每次迭代都执行row+2
【解决方案2】:

可以使用 pandas 生成 csv

import pandas as pd

data = {'Product': ['Desktop Computer','Tablet','Printer','Laptop'],
        'Price': [850,200,150,1300]
        }

df = pd.DataFrame(data, columns= ['Product', 'Price'])

df.to_csv (r'C:\Users\Ron\Desktop\export_dataframe.csv', index = False, header=True)

print (df)

编辑:您也有 csv 包来创建 CSV,但我更喜欢 pandas,因为创建 dict 并将其转换为 DataFrame -> csv 非常简单。

【讨论】:

  • 我认为问题不在于写入 csv 文件,而是将数据从tkinter 窗口中取出。此外,在编写答案时,请尝试解释 OP 做错了什么。现在我看到的只是一个建议,使用pandas 而不是csv
  • 谢谢@TheLizzard,这正是我想知道的,相反,我得到了使用其他东西的答案,甚至没有解释如何使用它。
  • @Brzydal 问题是你有Function = OptionMenu(...).grid(...)。这不会做你期望它做的事情。而是将其分成两行:Function = OptionMenu(...)Function.grid(...)。下次如果您遇到错误,也可以在问题中发布。
  • 对不起,如果我误解了这个问题,但是当我看到“get()”函数被调用时,我认为这部分是成功的,因为你没有在任何地方提到任何错误或问题
  • @TheLizzard 我已经从 csv 切换到 pandas 并且还采纳了您关于 (...).grid(...) 的建议,但仍然不知道如何继续,但还是谢谢。
猜你喜欢
  • 2013-10-21
  • 1970-01-01
  • 2019-10-13
  • 1970-01-01
  • 1970-01-01
  • 2021-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多