Проверьте выбор OptionMenu и обновите графический интерфейс.

Я работаю над классным проектом и пытаюсь немного выйти за рамки требований (я делаю свою домашнюю работу, мне просто нужна помощь в ее улучшении!), поэтому я хочу обновить графический интерфейс на основе определенных выборов. делает пользователь вместо того, чтобы постоянно иметь все нерелевантные параметры (требования заключаются в том, чтобы просто представить параметры).

Я все еще новичок в Python и еще больше новичок в Tkinter, поэтому моя единственная попытка заключалась в следующем:

#Step Type
ttk.Label(mainframe, text = "Step Type").grid(column = 1, row = 16)
type_entry = OptionMenu(mainframe, StepType, "Kill", "Explore" , "Conversation")
type_entry.grid(column = 2, row = 16, sticky = (E))

#Step Goal
if StepType.get() == "Kill":
   ttk.Label(mainframe, text = "Required Kills").grid(column = 1, row = 17)
   goal_entry = ttk.Entry(mainframe, width = 20, textvariable = StepGoal)
   goal_entry.grid(column = 2, row = 17, sticky = (E))
elif StepType.get() == "Explore":
   ttk.Label(mainframe, text = "Location ID").grid(column = 1, row = 17)
   goal_entry = ttk.Entry(mainframe, width = 20, textvariable = StepGoal)
   goal_entry.grid(column = 2, row = 17, sticky = (E))
elif StepType.get() == "Conversation":
   ttk.Label(mainframe, text = "NPC ID").grid(column = 1, row = 17)
   goal_entry = ttk.Entry(mainframe, width = 20, textvariable = StepGoal)
   goal_entry.grid(column = 2, row = 17, sticky = (E))

Очевидно, что я хочу сделать здесь, когда пользователь выбирает один из вариантов в меню, чтобы отобразить соответствующее поле ввода и метку вместо того, чтобы иметь все 3 все время.

Также ищу такую ​​же ситуацию для CheckButton


person Prototype958    schedule 27.06.2014    source источник
comment
Вы можете использовать одну метку и изменить только текст на ней.   -  person furas    schedule 28.06.2014


Ответы (1)


Полный рабочий пример: протестировано од 2.7.5 и 3.3.2

Он использует command= в OptionMenu для вызова функции, когда пользователь изменил параметр.

import tkinter as ttk

#----------------------------------------------------------------------

def on_option_change(event):
    selected = step_type.get()

    if selected == "Kill":
        goal_label['text'] = "Required Kills"
    elif selected == "Explore":
       goal_label['text'] = "Location ID"
    elif selected == "Conversation":
       goal_label['text'] = "NPC ID"

    # show label and entry
    #goal_label.grid(column=1, row=17)
    #goal_entry.grid(column=2, row=17, sticky='E')

#----------------------------------------------------------------------

mainframe = ttk.Tk()

# Step Type

step_type = ttk.StringVar() # there is the rule: variable name lowercase with _
ttk.Label(mainframe, text="Step Type").grid(column=1, row=16)
type_entry = ttk.OptionMenu(mainframe, step_type, "Kill", "Explore" , "Conversation", command=on_option_change)
type_entry.grid(column=2, row=16, sticky='E')
step_type.set("Kill")

# Step Goal

step_goal = ttk.StringVar()
goal_label = ttk.Label(mainframe, text="Required Kills")
goal_label.grid(column=1, row=17)
goal_entry = ttk.Entry(mainframe, width=20, textvariable=step_goal)
goal_entry.grid(column=2, row=17, sticky='E')

# hide label and entry
#goal_label.grid_forget()
#goal_entry.grid_forget()

# --- star the engine ---

mainframe.mainloop()

Кстати: вы можете использовать grid() и grid_forget() для отображения и скрытия элементов.


EDIT: пример с Radiobutton с использованием trace на StringVar

import tkinter as ttk

#----------------------------------------------------------------------

def on_variable_change(a,b,c): # `trace` send 3 argument to `on_variable_change`

    #print(a, b, c)

    selected = step_type.get()

    if selected == "Kill":
        goal_label['text'] = "Required Kills"
    elif selected == "Explore":
       goal_label['text'] = "Location ID"
    elif selected == "Conversation":
       goal_label['text'] = "NPC ID"

#----------------------------------------------------------------------

mainframe = ttk.Tk()

# Step Type

step_type = ttk.StringVar() # there is the rule: variable name lowercase with _

ttk.Label(mainframe, text="Step Type").grid(column=1, row=16)

ttk.Radiobutton(mainframe, text="Kill", value="Kill", variable=step_type).grid(column=2, row=16, sticky='E')
ttk.Radiobutton(mainframe, text="Explore", value="Explore", variable=step_type).grid(column=3, row=16, sticky='E')
ttk.Radiobutton(mainframe, text="Conversation", value="Conversation", variable=step_type).grid(column=4, row=16, sticky='E')

step_type.set("Kill")
# use `trace` after `set` because `on_variable_change` use `goal_label` which is not created yet.
step_type.trace("w", on_variable_change)

# Step Goal

step_goal = ttk.StringVar()
goal_label = ttk.Label(mainframe, text="Required Kills")
goal_label.grid(column=1, row=17)
goal_entry = ttk.Entry(mainframe, width=20, textvariable=step_goal)
goal_entry.grid(column=2, row=17, sticky='E')

# --- star the engine ---

mainframe.mainloop()
person furas    schedule 28.06.2014
comment
Спасибо, это именно то, что мне было нужно. По какой-то причине действительно борюсь с Python, а добавление Tkinter и lxml просто не помогает. - person Prototype958; 28.06.2014
comment
Я добавляю пример с Radiobutton, используя trace на StringVar. Источник моих знаний: effbot.org/tkinterbook - person furas; 28.06.2014