2012-07-23 33 views
1

我正在重新设计接口的布局,使用Python 2.6和标准Tkinter附带它。麻烦的是,我注意到一些奇怪的行为,而我对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() 

,当我尝试插入在录入组件的默认值,则会出现此下面的错误,和它的工作之前,我开始筑巢帧:上例code.These全部注释掉线发生

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' 

Similiar错误行为,我需要借此在目前,因为滚动条是不会因为我可以工作不告诉他们改变名单母鸡滚动。

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

2.当我使用嵌套的框架,并且孩子和父母都在使用网格时,为什么我的小工具位置只对应于主人的行数和列数?如果您查看Y轴滚动条的行,我必须做master = 5,col = 1。我相信它应该是frame2的第0行,第1列,因为这个小部件的父设置为frame2,我希望frame2也使用网格,但它似乎使用了主框架网格。

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

回答

2

当使用Tkinter时,不应该同时创建一个对象和grid它。

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

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

并获得在特定网格插件的信息(例如,小区),你可能想使用grid_info方法。

+0

我改变了代码以遵循这一点,取消注释了导致错误的行,现在它不会引发错误,但会显示一个灰色的图形用户界面。我会错过一些电话来显示或显示它吗? – Brandon 2012-07-23 16:06:12

+0

@ user1546099 - 你永远不会网格'主'。注意,你应该将'row ='和'column ='传递给'grid'的各种调用,以便这些小部件知道它们适合的网格上的什么位置。但要小心,每个“Frame”本质上都定义了它自己的网格。 – mgilson 2012-07-23 16:16:06

+0

所以我不应该用“master”这个词来表示一个名字是否正确?如果有人愿意,可以在根上使用网格管理器布局(技术上是主站),对吗? – Brandon 2012-07-23 16:22:13