2012-08-08 44 views
3

毫無疑問,這是一個新手問題。我在Python 2.7中使用Tkinter的網格佈局管理器。我想要一個按鈕在點擊時隱藏列表框。這裏是我到目前爲止的代碼:Tkinter電梯和更低的網格佈局方法

from Tkinter import * 
root = Tk() 
frame = Frame(root) 
pyList = ["Eric", "Terry", "Graham", "Terry", "John", "Carol?", "Michael"] 
arbList = ['ham', 'spam', 'eggs', 'potatos', 'tots', 'home fries'] 
pythons = Listbox(frame, width=10, height=5, selectmode=EXTENDED, exportselection=0) 
food = Listbox(frame, width=10, height=5, selectmode=EXTENDED, exportselection=0) 
def hider(): 
    if pythons.selection_includes(4): 
     food.lower() 
    elif pythons.selection_includes(0): 
     food.lift() 
b2 = Button(frame, text="Hide!", command=hider) 
b2.grid(row=2, column=1) 
food.grid(row=0, column=1) 
pythons.grid(row=1, column=1, pady=10) 
frame.grid() 

for python in pyList: 
     pythons.insert('end', python) 

for thing in arbList: 
     food.insert('end', thing) 


root.mainloop() 

不幸的是,這種胡鬧周圍似乎拋出一個錯誤,說我不能升/降我的框架高於或低​​於我的列表框。我已經得到這個與pack()管理器一起工作,但不是grid()。

我錯過了什麼?

回答

1

您無法在其父母下方放置小部件。根據official tk docs

如果aboveThis參數被忽略,則命令提高窗口,以便 ,它首先是其在堆疊順序的兄弟姐妹(它將 不受任何兄弟姐妹被遮蔽,並且將掩蓋任何兄弟姐妹 重疊它)。如果指定aboveThis,則它必須是窗口的兄弟或窗口的兄弟的後裔的窗口的路徑名稱 。在這種情況下,raise命令會將窗口 插入上面這個上面的堆棧順序中(或者上面的這個是窗口的兄弟的 的祖先);這可能會導致 升高或降低窗口。

(NB。在TK raise命令是什麼lift()在最低水平實際上是調用)

爲了得到你想要的效果,使框架和列表框的兄弟姐妹,然後使用in_參數收拾該框架內的列表框:

food.grid(row=0, column=1, in_=frame) 
pythons.grid(row=1, column=1, pady=10, in_=frame) 
+0

哇,那很好用!我知道這很簡單。我想我只是沒有在這裏給兄弟姐妹和父母足夠的想法。謝謝您的幫助! – JMarotta 2012-08-08 03:53:04

0

我很抱歉,但沒有版本的代碼做任何事情對我來說。但是,以下修改不起作用。訣竅是讓列表框的父項爲root而不是frame,並且liftlowerframe相關。我想知道這是否是由於不同版本的Tkinter?

from Tkinter import * 
root = Tk() 
frame = Frame(root) 
pyList = ["Eric", "Terry", "Graham", "Terry", "John", "Carol?", "Michael"] 
arbList = ['ham', 'spam', 'eggs', 'potatos', 'tots', 'home fries'] 
pythons = Listbox(root, width=10, height=5, selectmode=EXTENDED, exportselection=0) 
food = Listbox(root, width=10, height=5, selectmode=EXTENDED, exportselection=0) 
def hider(): 
    if pythons.selection_includes(4): 
     food.lower(frame) 
    elif pythons.selection_includes(0): 
     food.lift(frame) 
b2 = Button(frame, text="Hide!", command=hider) 
b2.grid(row=2, column=1) 

food.grid(row=0, column=1, in_=frame) 
pythons.grid(row=1, column=1, pady=10, in_=frame) 
frame.grid() 

for python in pyList: 
     pythons.insert('end', python) 

for thing in arbList: 
     food.insert('end', thing) 


root.mainloop() 
+0

這幾乎肯定是您的代碼中的一個錯誤。大概20年來,提升和降低小部件的能力並沒有改變。然而,你是正確的,即列表框和框架都需要兄弟姐妹才能工作。列表框不能是「lift」命令按照需要工作的框架的子項。 – 2013-07-08 23:21:10