Checkbox 使用python tkinter将多个checkbutton字符串存储到不同的变量中
我正在使用tkinter制作一个python程序,该程序将根据字符串创建文件夹名称,并根据选中的复选框创建子文件夹 i、 e.如果选中“香蕉”复选框,它将在名为folder的字符串中创建一个香蕉文件夹。这就是我需要做的:Checkbox 使用python tkinter将多个checkbutton字符串存储到不同的变量中,checkbox,tkinter,python-3.3,subdirectory,storing-information,Checkbox,Tkinter,Python 3.3,Subdirectory,Storing Information,我正在使用tkinter制作一个python程序,该程序将根据字符串创建文件夹名称,并根据选中的复选框创建子文件夹 i、 e.如果选中“香蕉”复选框,它将在名为folder的字符串中创建一个香蕉文件夹。这就是我需要做的: 用户将勾选的复选框列表(这些复选框将创建子文件夹)这是我遇到问题的部分 浏览目录(这是创建父文件夹的路径) 命名文件夹(输入字符串并创建一个文件夹,其中所有子文件夹都将位于该文件夹下) 这是到目前为止我的代码。我知道可能有更好的方法来存储所有复选框,但我还不知道如何做到这一点:
import tkinter as tk
from tkinter import *
from tkinter.filedialog import askdirectory
import os, sys
def browse():
dir = askdirectory()
if dir:
path.set(dir)
def genAsset():
assetPath=path.get()
assetName=asset.get()
expFold=export.get()
bakFold=bake.get()
sceFold=scene.get()
texFold=texture.get()
scuFold=sculpt.get()
refFold=reference.get()
renFold=render.get()
engFold=engine.get()
os.makedirs(assetPath+"/"+assetName+"/")
os.makedirs(assetPath+"/"+assetName+"/"+expFold+"/")
os.makedirs(assetPath+"/"+assetName+"/"+bakFold+"/")
os.makedirs(assetPath+"/"+assetName+"/"+sceFold+"/")
os.makedirs(assetPath+"/"+assetName+"/"+texFold+"/")
os.makedirs(assetPath+"/"+assetName+"/"+scuFold+"/")
os.makedirs(assetPath+"/"+assetName+"/"+refFold+"/")
os.makedirs(assetPath+"/"+assetName+"/"+renFold+"/")
os.makedirs(assetPath+"/"+assetName+"/"+engFold+"/")
#create the window and title
window=Tk()
window.title("v1.0")
#define variables and images
path=StringVar()
asset=StringVar()
VMR=PhotoImage(file="VMR.gif")
selectFolders=StringVar()
export=StringVar()
bake=StringVar()
scene=StringVar()
texture=StringVar()
sculpt=StringVar()
reference=StringVar()
render=StringVar()
engine=StringVar()
#define checkbuttons of folders to generate and store textvaiable
expButt=Checkbutton(window, text="export", textvariable=export).pack()
bakButt=Checkbutton(window, text="bake").pack()
sceButt=Checkbutton(window, text="scene").pack()
texButt=Checkbutton(window, text="texture").pack()
scuButt=Checkbutton(window, text="sculpt").pack()
refButt=Checkbutton(window, text="reference").pack()
renButt=Checkbutton(window, text="renders").pack()
engButt=Checkbutton(window, text="engine").pack()
#display the image file
hdrImg=Label(window, image=VMR)
hdrImg.photo=VMR
#select path and define asset name, store strings
lDirec=Label(window, text="Folder Directory:").pack()
ePath=Entry(window, textvariable=path, width=50).pack()
bBrowse=Button(window, text="Browse Path", command=browse).pack()
lAsset=Label(window, text="Asset Name:").pack()
eAsset=Entry(window, textvariable=asset, width=50).pack()
bCreate=Button(window, text="Create Asset", command=genAsset).pack()
window.mainloop()
您可以创建两个列表:一个用于子目录的名称,另一个用于存储
IntVar
s以跟踪是否选中了每个Checkbutton
。因此,您可以在genAsset
函数中压缩这两个列表,然后在相应的IntVar
的值不为零时创建子目录
通过这种方式,您还可以减少回调函数中的大量代码重复,并简化小部件的创建
import tkinter as tk
from tkinter.filedialog import askdirectory
import os, sys
window = tk.Tk()
def browse():
directory = askdirectory()
if directory:
path.set(directory)
def genAsset():
asset_path = path.get()
asset_name = asset.get()
for var, folder in zip(variables, folders):
folder_path = os.path.join(asset_path, asset_name, folder)
if var.get() and not os.path.exists(folder_path):
os.makedirs(folder_path)
path = tk.StringVar()
asset = tk.StringVar()
folders = ["export", "bake", "scene", "texture", "sculpt", "reference", "renders", "engine"]
variables = []
for folder in folders:
var = tk.IntVar()
tk.Checkbutton(window, text=folder, variable=var).pack()
variables.append(var)
dir_label = tk.Label(window, text="Folder Directory:")
path_entry = tk.Entry(window, textvariable=path, width=50)
browse_button = tk.Button(window, text="Browse Path", command=browse)
asset_label = tk.Label(window, text="Asset Name:")
asset_entry = tk.Entry(window, textvariable=asset, width=50)
create_button = tk.Button(window, text="Create Asset", command=genAsset)
dir_label.pack()
path_entry.pack()
browse_button.pack()
asset_label.pack()
asset_entry.pack()
create_button.pack()
window.mainloop()
请记住,pack()
返回None
,因此您不应该存储调用此函数的结果,而是先创建小部件,然后调用pack()