Tkinter嵌套帧与网格管理器问题

时间:2012-07-23 15:52:56

标签: python layout nested tkinter frames

我正在使用python 2.6和其中包含的标准Tkinter重新设计接口的布局。麻烦的是,我注意到一些奇怪的行为,我是Tkinter的新手,所以这可能只是因为缺乏经验而忽略的事情。

以下是我如何在主框架内嵌套框架以获得所需布局的示例代码:

import Tkinter as tk

root = tk.Tk()

master = tk.Frame(root)

frame = tk.Frame(master).grid(sticky = tk.W)

item1 = "Label One"
L1 = tk.Label(frame, text = item1).grid(sticky = tk.W)

b1 = tk.Button(frame, text = "Button 1").grid(sticky = tk.W)

find = tk.Label(frame, text = "Find").grid(sticky = tk.W)

item = tk.Entry(frame, width = 50).grid(sticky = tk.W)
##item.insert(0,"Enter Item to Search For")

L2 = tk.Label(frame, text = "Label Two").grid(sticky = tk.W)

search = tk.Button(frame, text = "Search").grid(row = 3, column = 0)

frame2 = tk.Frame(master).grid(sticky = tk.W)

list1 = tk.Listbox(frame2, width = 100).grid(sticky = tk.W)

##yscroll = tk.Scrollbar(frame2,orient = tk.VERTICAL,command = list1.yview).grid(row = 5, column = 1, sticky = tk.N + tk.S + tk.W)
yscroll = tk.Scrollbar(frame2, orient = tk.VERTICAL).grid(row = 5, column = 1, sticky = tk.N + tk.S + tk.W)
##list1.configure(yscrollcommand = yscroll.set)

##xscroll = tk.Scrollbar(frame2, orient = tk.HORIZONTAL, command = list1.xview).grid(sticky = tk.W + tk.E)
xscroll = tk.Scrollbar(frame2, orient = tk.HORIZONTAL).grid(sticky = tk.W + tk.E)
##list1.configure(xscrollcommand = xscroll.set)

root.mainloop()

当我尝试在条目窗口小部件中插入默认值时,会发生以下错误,并且在我开始嵌套框架之前它仍然有效:

Traceback (most recent call last):
   File "H:\Tkinter\Grid.py", line 17, in <module>
    item.insert(0,"Enter Item to Search For")
AttributeError: 'NoneType' object has no attribute 'insert'

示例代码中所有注释掉的行都会发生类似的错误。这些是我需要执行的操作,因为当前滚动条不起作用,因为我无法告诉他们在滚动时更改列表。

1.当你嵌套这样的帧时,我是否必须以不同的方式访问小部件的变量?

2.当我使用嵌套框架并且子框架和父框架都使用网格时,为什么我的窗口小部件放置只对应于主控的行数和列数?如果您查看Y轴滚动条的行,我必须执行row = 5,col = 1。我认为它应该是第0行第1行第1行,因为窗口小部件的父设置为frame2,我希望frame2也使用网格,但它似乎使用主帧网格。

3.是否可以在不同的帧中显示网格线?

1 个答案:

答案 0 :(得分:2)

使用Tkinter时,您不应同时创建对象和grid

bad = tk.Button(frame).grid()  #"bad" is None since .grid returns None

good = tk.Button(frame)
good.grid()

要获取特定网格窗口小部件的信息(例如单元格),您可能希望使用grid_info方法。