Можем ли мы вложить два виджета OptionMenu в tkinter? - PullRequest
2 голосов
/ 04 апреля 2020

Точно так же, как в известном примере с именами континентов в одном раскрывающемся списке и отображаются названия стран, связанные с выбранным континентом. Как этого добиться с помощью Tkinter? У меня есть список Континент в первом выпадающем списке и список всех стран, связанных с континентами в списке. Я хотел бы отобразить country_11, country_12 при выборе continent_1, аналогично для других континентов.

Вот фрагмент кода, над которым я работаю -

import tkinter as tk
from tkinter import ttk
from tkinter import *

root = tk.Tk()
root.geometry('500x500')
#Label to Continent 
label_1 = tk.Label(root, text="Select the Continent", font = (8), bg = '#ffe1c4')
label_1.place(x = 120, y = 220)

# Continent selection - drop down
optionList1 = ["Continent1", "Continent2","Continent3"]
dropVar1 = StringVar()
dropMenu1 = ttk.OptionMenu(root, dropVar1 , *optionList1)
dropMenu1.place(x = 300, y = 220)

#Label to Select Country 
label_2 = tk.Label(root, text="Select the Country ", font = (8), bg = '#ffe1c4')
label_2.place(x = 120, y = 250)

# Country  name selection - drop down
optionList2 = ["Country_11", "Country_12", "Country_21","Country_22","Country_31","Country_32"]
dropVar2 = StringVar()
dropMenu2 = ttk.OptionMenu(root, dropVar2, *optionList2)
dropMenu2.place(x = 300, y = 250)

root.mainloop()

Было бы здорово иметь решение к этому, поскольку я не знаю всех атрибутов, которые OptionMenu может иметь в Tkinter. Заранее спасибо !!

Ответы [ 2 ]

3 голосов
/ 04 апреля 2020

Если вы хотите создать два OptionMenu, и оно будет показывать другое значение при выборе другого значения в первом раскрывающемся меню. Вы можете попробовать это:

import tkinter as tk
from tkinter import ttk
from tkinter import *

def func(selected_value): # the selected_value is the value you selected in the first drop down menu.
    dropMenu2.set_menu(*optionList2.get(selected_value))

root = tk.Tk()
root.geometry('500x500')
#Label to Continent
label_1 = tk.Label(root, text="Select the Continent", font = (8), bg = '#ffe1c4')
label_1.place(x = 120, y = 220)

# Continent selection - drop down
optionList1 = ["-","Continent1", "Continent2","Continent3"]
dropVar1 = StringVar()
dropMenu1 = ttk.OptionMenu(root, dropVar1 , *optionList1,command=func) # bind a command for the first dropmenu
dropMenu1.place(x = 300, y = 220)

#Label to Select Country
label_2 = tk.Label(root, text="Select the Country ", font = (8), bg = '#ffe1c4')
label_2.place(x = 120, y = 250)

# Country  name selection - drop down
optionList2 = { # when select different value,show the list.
    "Continent1": ["Country_11", "Country_12"],
    "Continent2": ["Country_21", "Country_22"],
    "Continent3": ["Country_31", "Country_32"]
}
dropVar2 = StringVar()
dropMenu2 = ttk.OptionMenu(root, dropVar2, "-")
dropMenu2.place(x = 300, y = 250)

root.mainloop()

Теперь это: enter image description here

При выборе другого значения: enter image description here

(Предложение: ttk.Combobox красивее OptionMenu, и использование from tkinter import * не является хорошей практикой.)

2 голосов
/ 04 апреля 2020

Если вы имеете в виду меню внутри меню, то это можно и очень просто сделать, потому что меню, используемое в OptionMenu(), является tkinter Menu(), см. Документацию для tkinter Menu .

Мы можем получить доступ к Menu следующим образом

Op = OptionMenu(root, var, 'Hello', 'HI', 'YOO')

# Op_Menu is the Menu() class used for OptionMenu
Op_Menu = Op['menu']

Вот небольшой пример вложенных меню в меню параметров. Когда вы выбираете любую из стран внутри какого-либо континента, текст optionmenu не изменится, поэтому исправьте, что я использовал аргумент command, и в каждом аргументе команды страны я меняю значение StringVar, назначенное для the optionmenu.

import tkinter as tk

root = tk.Tk()
svar = tk.StringVar()
svar.set('Antarctica')

Op = tk.OptionMenu(root, svar, svar.get())
OpMenu = Op['menu']
Op.pack()

Menu1 = tk.Menu(OpMenu)
OpMenu.add_cascade(label='Africa', menu= Menu1)
Menu1.add_command(label='Algeria', command=lambda: svar.set('Africa - Algeria'))
Menu1.add_command(label='Benin', command=lambda: svar.set('Africa - Benin'))

Menu2 = tk.Menu(Op['menu'])
OpMenu.add_cascade(label='Asia', menu= Menu2)
Menu2.add_command(label='China', command=lambda: svar.set('Asia - China'))
Menu2.add_command(label='India', command=lambda: svar.set('Asia - India'))

root.mainloop() 

Надеюсь, вы найдете это полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...