Tkinter 有一个选项菜单影响下一个
Tkinter have one option menu affect the next
我想制作一个小程序,它将获取目录中的文件夹列表并将它们列在选择菜单中为此我使用了 optionmenu 但我看到人们也使用 combomenu 所以如果它会很乐意改变是更好的选择。
在项目菜单中做出选择后,我希望第二个菜单使用所选项目菜单内的文件夹进行更新。最后一步是一样的,但我想这将是一个非常相似的过程。
还有打印选项菜单选择的好方法吗?
谢谢!
import os, sys
from tkinter import *
from tkinter import ttk
def findshots(*args):
print("change")
return 1
# -------- project selection ---------
currentprojects = './dummy/projects'
currentprojectslist = os.listdir(currentprojects)
# --------- shots list -------------------
projectselection = findshots()
currentshots = "./dummy/projects/{}/shots".format(currentprojectslist[projectselection])
currentshotslist = os.listdir(currentshots)
# ---------- script list -------------------
shotselection = 0
currentnk = "./dummy/projects/{}/shots/{}/nk".format(currentprojectslist[projectselection], currentshotslist[
shotselection])
currentnklist = os.listdir(currentnk)
# ----------------------------------------------
# --------MAIN--------------
root = Tk()
root.geometry("1000x1000+800+100")
root.resizable(width=False, height=False)
# ------- project -----------
projectmenuvar = StringVar(root)
projectmenuvar.set(currentprojectslist[0])
projectmenuvar.trace("w", findshots)
projectmenuvar = OptionMenu(root, projectmenuvar, *currentprojectslist)
projectmenuvar.pack()
# ----------- shot -------------
shotsmenuvar = StringVar(root)
shotsmenuvar.set(currentshotslist[0])
shotsmenuvar = OptionMenu(root, shotsmenuvar, *currentshotslist)
shotsmenuvar.pack()
root.mainloop()
由于 OptionMenu
类似于弹出式菜单,只要 projectmenu
发生变化,您就可以更新 shotsmenu
菜单项列表。以下是根据您的修改后的代码:
from tkinter import *
import os
root = Tk()
# get project list
currentprojects = './dummy/projects'
currentprojectslist = os.listdir(currentprojects)
def findshots(*args):
project = projectmenuvar.get()
print('project changed:', project)
# get shot list
currentshots = '{}/{}/shots'.format(currentprojects, project)
currentshotslist = os.listdir(currentshots)
print(currentshotslist)
# update the shotsmenu
menu = shotsmenu['menu']
menu.delete(0, 'end') # remove existing list
for shot in currentshotslist:
menu.add_command(label=shot, command=lambda val=shot: shotsmenuvar.set(val))
# select the first shot
shotsmenuvar.set(currentshotslist[0])
def on_shot_changed(*args):
print('shot changed:', shotsmenuvar.get())
projectmenuvar = StringVar()
projectmenuvar.trace('w', findshots)
projectmenu = OptionMenu(root, projectmenuvar, *currentprojectslist)
projectmenu.config(width=15)
projectmenu.pack()
shotsmenuvar = StringVar()
shotsmenuvar.trace('w', on_shot_changed)
shotsmenu = OptionMenu(root, shotsmenuvar, ())
shotsmenu.config(width=15)
shotsmenu.pack()
# select the first project
projectmenuvar.set(currentprojectslist[0])
root.mainloop()
我想制作一个小程序,它将获取目录中的文件夹列表并将它们列在选择菜单中为此我使用了 optionmenu 但我看到人们也使用 combomenu 所以如果它会很乐意改变是更好的选择。 在项目菜单中做出选择后,我希望第二个菜单使用所选项目菜单内的文件夹进行更新。最后一步是一样的,但我想这将是一个非常相似的过程。 还有打印选项菜单选择的好方法吗?
谢谢!
import os, sys
from tkinter import *
from tkinter import ttk
def findshots(*args):
print("change")
return 1
# -------- project selection ---------
currentprojects = './dummy/projects'
currentprojectslist = os.listdir(currentprojects)
# --------- shots list -------------------
projectselection = findshots()
currentshots = "./dummy/projects/{}/shots".format(currentprojectslist[projectselection])
currentshotslist = os.listdir(currentshots)
# ---------- script list -------------------
shotselection = 0
currentnk = "./dummy/projects/{}/shots/{}/nk".format(currentprojectslist[projectselection], currentshotslist[
shotselection])
currentnklist = os.listdir(currentnk)
# ----------------------------------------------
# --------MAIN--------------
root = Tk()
root.geometry("1000x1000+800+100")
root.resizable(width=False, height=False)
# ------- project -----------
projectmenuvar = StringVar(root)
projectmenuvar.set(currentprojectslist[0])
projectmenuvar.trace("w", findshots)
projectmenuvar = OptionMenu(root, projectmenuvar, *currentprojectslist)
projectmenuvar.pack()
# ----------- shot -------------
shotsmenuvar = StringVar(root)
shotsmenuvar.set(currentshotslist[0])
shotsmenuvar = OptionMenu(root, shotsmenuvar, *currentshotslist)
shotsmenuvar.pack()
root.mainloop()
由于 OptionMenu
类似于弹出式菜单,只要 projectmenu
发生变化,您就可以更新 shotsmenu
菜单项列表。以下是根据您的修改后的代码:
from tkinter import *
import os
root = Tk()
# get project list
currentprojects = './dummy/projects'
currentprojectslist = os.listdir(currentprojects)
def findshots(*args):
project = projectmenuvar.get()
print('project changed:', project)
# get shot list
currentshots = '{}/{}/shots'.format(currentprojects, project)
currentshotslist = os.listdir(currentshots)
print(currentshotslist)
# update the shotsmenu
menu = shotsmenu['menu']
menu.delete(0, 'end') # remove existing list
for shot in currentshotslist:
menu.add_command(label=shot, command=lambda val=shot: shotsmenuvar.set(val))
# select the first shot
shotsmenuvar.set(currentshotslist[0])
def on_shot_changed(*args):
print('shot changed:', shotsmenuvar.get())
projectmenuvar = StringVar()
projectmenuvar.trace('w', findshots)
projectmenu = OptionMenu(root, projectmenuvar, *currentprojectslist)
projectmenu.config(width=15)
projectmenu.pack()
shotsmenuvar = StringVar()
shotsmenuvar.trace('w', on_shot_changed)
shotsmenu = OptionMenu(root, shotsmenuvar, ())
shotsmenu.config(width=15)
shotsmenu.pack()
# select the first project
projectmenuvar.set(currentprojectslist[0])
root.mainloop()