Tkinter pack Entry Widgets基于OptionMenu值,否则为pack_forget

时间:2016-08-23 05:01:49

标签: python tkinter trace optionmenu tkinter-entry

tk.OptionMenu等同于CUSTOM时,下面的代码会显示两个tk.Entry字段。如果选择的tk.Entry不是tk.OptionMenu,会如何隐藏CUSTOM字段?

例如,如果用户从下拉列表中选择CUSTOM,则下面的代码会显示两个字段,但如果用户选择其他选项,我想删除从视图中添加的两个字段并再次显示它们如果再次从下拉列表中选择CUSTOM。从某种意义上说,切换它们。

我的研究已经发现 pack_forget 销毁跟踪。我似乎无法弄明白。

tkinter

import tkinter as tk

root = tk.Tk()

frame = tk.Frame(root)
frame.pack()

def func(*args):
  if date_var.get() == 'CUSTOM':
    new_frame = tk.Frame(frame)
    new_frame.pack(side=tk.LEFT)
    field1 = tk.Entry(new_frame)
    field2 = tk.Entry(new_frame)
    field1.pack()
    field2.pack()
  else:
    try:
      new_frame.destroy()
    except:
      pass

date_var = tk.StringVar()
date_var.trace('w', func)
date_var.set('LAST_10_DAYS')
date_options = ['CUSTOM', 'LAST_10_DAYS', 'LAST_50_DAYS', 'LAST_10_MILLION_YEARS']
date = tk.OptionMenu(frame, date_var, *date_options)
date.pack(pady=10)

root.mainloop()

1 个答案:

答案 0 :(得分:1)

我通过将field1field2放在函数之外的new_frametk.Frame中来实现它。然后我让if语句根据pack的值确定是pack_forget还是new_frame OptionMenu。不能说这是不是最好的方法,但它现在有效。

import tkinter as tk

root = tk.Tk()

frame = tk.Frame(root)
frame.pack()

new_frame = tk.Frame(frame)
field1 = tk.Entry(new_frame)
field2 = tk.Entry(new_frame)
field1.pack()
field2.pack()

def func(*args):
  if date_var.get() == 'CUSTOM':
    new_frame.pack(side=tk.LEFT)
  else:
    new_frame.pack_forget()

date_var = tk.StringVar()
date_var.trace('w', func)
date_var.set('LAST_10_DAYS')
date_options = ['CUSTOM', 'LAST_10_DAYS', 'LAST_50_DAYS', 'LAST_10_MILLION_YEARS']
date = tk.OptionMenu(frame, date_var, *date_options)
date.pack(pady=10)

root.mainloop()