1

我正在使用 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 的主人。我相信它应该是 frame2 的第 0 行,第 1 列,因为小部件的父级设置为 frame2,我希望 frame2 也使用网格,但它似乎使用主框架网格。

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

4

1 回答 1

2

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

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

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

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

于 2012-07-23T16:00:11.313 回答