2016-08-23 66 views
1

tk.OptionMenu等于CUSTOM时,下面的代码显示两个tk.Entry字段。如果选择而非CUSTOM,如何在视图中隐藏tk.Entry字段?基于OptionMenu值的Tkinter pack条目小部件,pack_forget否

例如,下面的代码显示两个字段,如果用户从下拉菜单中选择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() 
+0

当您尝试'pack_forget'或'destroy'时会发生什么?我猜你会得到一个错误。它说什么?你能从中学到什么? –

+0

我没有收到错误消息。每次选择“CUSTOM”时,上面的代码将打包“field1”和“field2”。这在逻辑上是合理的。我对理解(对tkinter而言是新手)的主要差距在于理解操作的位置。我有一个解决方案工作。我现在将它发布。顺便说一句,你在这里的代码示例是非常有用的。你的回答几乎出现在我做的每一个tkinter搜索中! – Jarad

+0

其实在你的代码中有一个异常,如果你用'this except'除了Exception',除了Exception,e:print e',它会打印异常消息。 'new_frame'对函数是本地的。 – Ejaz

回答

1

我把它通过把field1field2new_frametk.Frame功能以外的工作。然后我让if语句根据OptionMenu的值确定是pack还是pack_forgetnew_frame。不能说这是否是最好的方法,但现在可行。

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()