Форум сайта python.su
Здравствуйте.
Рассекая просторы python.su нашел интересную статью http://python.su/forum/topic/24015/ .
Вопрос такой как к каждому из выпадающего списка добавить свои списки. Так понимаю нужно использовать словарь.
Как добавлять в список (словарь) непосредственно в программе дополнительные пункты. Запутался, не пойму.
from tkinter import * master = Tk() var = StringVar(master) var.set("one") # initial value option = OptionMenu(master, var, "one", "two", "three", "four") option.pack() edit2 = Entry(master, width = 30) edit2.pack() def lbox_added_q_item(): text = str(edit2.get()) # Читаем поле ввода if not (text==''): # Проверяем что текст не пустой, перед вставкой var.insert(END,text) # Вставляет в конец списка edit2.delete(0, END) # очищает поле ввода button_dobavlenie_1 = Button(master, text = '+', command = lbox_added_q_item) button_dobavlenie_1.pack() # test stuff def ok(): print ("value is", var.get()) master.quit() button = Button(master, text="OK", command=ok) button.pack() mainloop()
Отредактировано Yura_Lemeshko (Дек. 10, 2014 15:59:13)
Офлайн
Не понял вопроса. Т.е. вы хотите, чтобы при нажатии на элемент option menu он раздвигался и показывал внутренние элементы? По-типу.
А
Б
В
А
а1
а2
Б
В
Или Вы хотите просто через поле ввода добавлять варианты в optionmenu. Или динамически как-нибудь. Короче. Напишите конкретнее - что Вас интересует
Отредактировано 4kpt_II (Дек. 10, 2014 21:08:12)
Офлайн
4kpt_IIЕсть А, В, С в них есть свои внутренние элементы.
Не понял вопроса. Т.е. вы хотите, чтобы при нажатии на элемент option menu он раздвигался и показывал внутренние элементы? По-типу.АБВА а1 а2БВИли Вы хотите просто через поле ввода добавлять варианты в optionmenu. Или динамически как-нибудь. Короче. Напишите конкретнее - что Вас интересует
Отредактировано Yura_Lemeshko (Дек. 11, 2014 11:06:37)
Офлайн
Тогда не знаю. С таким не сталкивался. Как редактировать optionmenu в процессе работы знаю (добавить поле, удалить поле, изменить поле, изменить вызов и т.п.), но внутренние вкладки - это не совсем нормально с точки зрения дизайна пользовательского интерфейса. Поэтом я этот вопрос никогда не поднимал и сам не делал.
Офлайн
4kpt_IIКак тогда реализовать в нормальном виде А со своими подлежащими? Combobox? Читал один из постов Вы советовали использовать optiomenu так-как не привинчивается Combobox к Tkinter. Использовать Listbox, так захаращивает пространство.
Тогда не знаю. С таким не сталкивался. Как редактировать optionmenu в процессе работы знаю (добавить поле, удалить поле, изменить поле, изменить вызов и т.п.), но внутренние вкладки - это не совсем нормально с точки зрения дизайна пользовательского интерфейса. Поэтом я этот вопрос никогда не поднимал и сам не делал.
Отредактировано Yura_Lemeshko (Дек. 11, 2014 23:28:04)
Офлайн
Я не до конца могу понять, что Вы хотите, если честно. Если нужно просто меню с пунктами и при нажатии на пункты, чтобы высвечивались подпункты (или при подводе на пункт), то лучше использовать меню. Если же нужно реализовать option меню с неактивными разделами у которых будут подразделы, то это сложно. Достаточно сложно. Можете пример скинуть изображения результата. Можно даже из другой программы. Просто реально не пойму, что в результате нужно получить.
Офлайн
4kpt_II
Я не до конца могу понять, что Вы хотите, если честно. Если нужно просто меню с пунктами и при нажатии на пункты, чтобы высвечивались подпункты (или при подводе на пункт), то лучше использовать меню. Если же нужно реализовать option меню с неактивными разделами у которых будут подразделы, то это сложно. Достаточно сложно. Можете пример скинуть изображения результата. Можно даже из другой программы. Просто реально не пойму, что в результате нужно получить.
# -*- coding: UTF-8 -*- import tkinter as tk class App(tk.Frame): def __init__(self, master): tk.Frame.__init__(self, master) self.dict = {'1': ['1.1', '1.2', '1.3'], '2': ['2.1', '2.2', '2.3'], '3': ['3.1', '3.2', '3.3'], '4': ['4.1', '4.2', '4.3', '4.4']} self.variable_a = tk.StringVar(self) self.variable_b = tk.StringVar(self) self.variable_a.trace('w', self.updateoptions) self.optionmenu_a = tk.OptionMenu(self, self.variable_a, *self.dict.keys()) self.optionmenu_b = tk.OptionMenu(self, self.variable_b, '') self.variable_a.set('1') self.optionmenu_a.pack() self.optionmenu_b.pack() self.pack() def updateoptions(self, *args): countries = self.dict[self.variable_a.get()] self.variable_b.set(countries[0]) menu = self.optionmenu_b['menu'] menu.delete(0, 'end') for country in countries: menu.add_command(label=country, command=lambda country=country: self.variable_b.set(country)) root = tk.Tk() app = App(root) app.mainloop()
Отредактировано Yura_Lemeshko (Дек. 12, 2014 08:33:05)
Офлайн
Это два разных optionmenu. Почему нельзя было это написать?
По вопросу. Теперь вы хотите добавить поле ввода, в которое бы вводили какое-то значение, нажимали на кнопку и оно добавлялось во второй выбранный список (если в первом списке выбрано 1, то в группу 1.1, 1.2, 1.3 или если в 1 списке выбрано 2, тогда 2.1, 2.2, 2.3). Я все правильно понял?
Офлайн
4kpt_II
Это два разных optionmenu. Почему нельзя было это написать?По вопросу. Теперь вы хотите добавить поле ввода, в которое бы вводили какое-то значение, нажимали на кнопку и оно добавлялось во второй выбранный список (если в первом списке выбрано 1, то в группу 1.1, 1.2, 1.3 или если в 1 списке выбрано 2, тогда 2.1, 2.2, 2.3). Я все правильно понял?
Офлайн
У Вас же был практически рабочий код. Просто нужно было допилить…
import Tkinter as tk # # class App(tk.Frame): # def __init__(self, master): tk.Frame.__init__(self, master) self.dict = {'1': ['1.1', '1.2', '1.3'], '2': ['2.1', '2.2', '2.3'], '3': ['3.1', '3.2', '3.3'], '4': ['4.1', '4.2', '4.3', '4.4']} self.variable_a = tk.StringVar(self) self.variable_b = tk.StringVar(self) self.variable_a.trace('w', self.update_options) self.optionmenu_a = tk.OptionMenu(self, self.variable_a, *self.dict.keys()) self.optionmenu_b = tk.OptionMenu(self, self.variable_b, '') self.variable_a.set('1') self.optionmenu_a.pack() self.optionmenu_b.pack() self.pack() self.entry = tk.Entry(self) self.entry.pack() tk.Button(text="Добавить", command=self.add_element_).pack() # def add_element_(self): country = self.entry.get() menu = self.optionmenu_b["menu"] self.dict[self.variable_a.get()].append(country) menu.add_command( label=country, command=lambda country=country: self.variable_b.set(country) ) self.entry.delete(0, "end") # def update_options(self, *args): countries = self.dict[self.variable_a.get()] self.variable_b.set(countries[0]) menu = self.optionmenu_b['menu'] menu.delete(0, 'end') for country in countries: menu.add_command( label=country, command=lambda country=country: self.variable_b.set(country) ) # root = tk.Tk() app = App(root) app.mainloop()
Офлайн