Найти - Пользователи
Полная версия: OptionMenu
Начало » GUI » OptionMenu
1
Yura_Lemeshko
Здравствуйте.
Рассекая просторы 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()
4kpt_II
Не понял вопроса. Т.е. вы хотите, чтобы при нажатии на элемент option menu он раздвигался и показывал внутренние элементы? По-типу.

А
Б
В

А
а1
а2
Б
В

Или Вы хотите просто через поле ввода добавлять варианты в optionmenu. Или динамически как-нибудь. Короче. Напишите конкретнее - что Вас интересует
Yura_Lemeshko
4kpt_II
Не понял вопроса. Т.е. вы хотите, чтобы при нажатии на элемент option menu он раздвигался и показывал внутренние элементы? По-типу.АБВА а1 а2БВИли Вы хотите просто через поле ввода добавлять варианты в optionmenu. Или динамически как-нибудь. Короче. Напишите конкретнее - что Вас интересует
Есть А, В, С в них есть свои внутренние элементы.
Нужно что бы, к А, В, С можно было добавлять внутренние элементы по типу. А –> а1, а2, а3… аn.
Редактировать если неверно завели запись, сохранять данные.
4kpt_II
Тогда не знаю. С таким не сталкивался. Как редактировать optionmenu в процессе работы знаю (добавить поле, удалить поле, изменить поле, изменить вызов и т.п.), но внутренние вкладки - это не совсем нормально с точки зрения дизайна пользовательского интерфейса. Поэтом я этот вопрос никогда не поднимал и сам не делал.
Yura_Lemeshko
4kpt_II
Тогда не знаю. С таким не сталкивался. Как редактировать optionmenu в процессе работы знаю (добавить поле, удалить поле, изменить поле, изменить вызов и т.п.), но внутренние вкладки - это не совсем нормально с точки зрения дизайна пользовательского интерфейса. Поэтом я этот вопрос никогда не поднимал и сам не делал.
Как тогда реализовать в нормальном виде А со своими подлежащими? Combobox? Читал один из постов Вы советовали использовать optiomenu так-как не привинчивается Combobox к Tkinter. Использовать Listbox, так захаращивает пространство.
4kpt_II
Я не до конца могу понять, что Вы хотите, если честно. Если нужно просто меню с пунктами и при нажатии на пункты, чтобы высвечивались подпункты (или при подводе на пункт), то лучше использовать меню. Если же нужно реализовать option меню с неактивными разделами у которых будут подразделы, то это сложно. Достаточно сложно. Можете пример скинуть изображения результата. Можно даже из другой программы. Просто реально не пойму, что в результате нужно получить.
Yura_Lemeshko
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()



Такое только в структурном виде.
Упоминая предыдущие записи.
1,2,3,4 основные, а 1.1, 1.2… нужно чтобы их было сколько нужно.
Например нажимаем “+” в 1 и добавляем запись, так же можно удалить или править ее.
4kpt_II
Это два разных optionmenu. Почему нельзя было это написать?
По вопросу. Теперь вы хотите добавить поле ввода, в которое бы вводили какое-то значение, нажимали на кнопку и оно добавлялось во второй выбранный список (если в первом списке выбрано 1, то в группу 1.1, 1.2, 1.3 или если в 1 списке выбрано 2, тогда 2.1, 2.2, 2.3). Я все правильно понял?
Yura_Lemeshko
4kpt_II
Это два разных optionmenu. Почему нельзя было это написать?По вопросу. Теперь вы хотите добавить поле ввода, в которое бы вводили какое-то значение, нажимали на кнопку и оно добавлялось во второй выбранный список (если в первом списке выбрано 1, то в группу 1.1, 1.2, 1.3 или если в 1 списке выбрано 2, тогда 2.1, 2.2, 2.3). Я все правильно понял?

Да.
4kpt_II
У Вас же был практически рабочий код. Просто нужно было допилить…
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()

P.S. И добавление и обновление можно реализовать в одном методе. Попробуйте сами
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB