2016-08-23 59 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() 
相關問題