【问题标题】:Storing multiple checkbutton strings into different variables with python tkinter使用 python tkinter 将多个检查按钮字符串存储到不同的变量中
【发布时间】:2013-10-22 00:01:03
【问题描述】:

我正在使用 tkinter 制作一个 python 程序,它将根据字符串创建文件夹名称,并根据选中的复选框创建子文件夹。

即如果选中“香蕉”复选框,它将在该字符串命名文件夹中创建一个香蕉文件夹。这就是我需要做的:

  1. 用户将选中的复选框列表(这些将创建子文件夹)这是我遇到问题的部分
  2. 浏览目录(这是创建父文件夹的路径)
  3. 为文件夹命名(输入字符串并创建一个文件夹,所有子文件夹都将位于该文件夹下)

到目前为止,这是我的代码。我知道可能有更好的方法来存储所有选中的框,但我还不知道该怎么做:

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()

【问题讨论】:

    标签: checkbox tkinter python-3.3 subdirectory storing-information


    【解决方案1】:

    您可以创建两个列表:一个用于子目录的名称,另一个用于存储IntVars 以跟踪每个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()
    

    PS:记住pack()返回None,所以你不应该存储调用这个函数的结果,而是先创建小部件然后调用pack() p>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-09-30
      • 2013-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-17
      相关资源
      最近更新 更多