0

文字列に基づいてフォルダー名を作成し、チェックボックスが選択されていることに基づいてサブフォルダーを作成するtkinterを使用してpythonプログラムを作成しています。

つまり、「banana」チェックボックスが選択されている場合、フォルダという名前の文字列内にバナナ フォルダが作成されます。これが私がこれを行うために必要なことです:

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

1 に答える 1

1

2 つのリストを作成できます。1 つはサブディレクトリの名前用で、もう 1 つは s を格納してそれぞれがチェックされているかIntVarどうかを追跡するためのものです。したがって、関数でCheckbutton両方のリストを圧縮し、対応する値がゼロでない場合はサブディレクトリを作成できます。genAssetIntVar

このようにして、コールバック関数での多くのコードの重複を減らし、ウィジェットの作成を簡素化することもできます。

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

于 2013-10-22T00:41:40.720 に答える