Python Tkinter Tix:如何在Tix NoteBook中使用带滚动条的窗口和网格布局
我正在往一个位于 tix.NoteBook
中的框架(Frame)里添加几个小部件(widgets)。当小部件太多,放不下的时候,我想用一个滚动条,所以我在这个框架里放了一个 tix.ScrolledWindow
,然后把我的小部件放到这个滚动窗口里。
问题是,当我使用 grid() 这个布局管理器时,滚动条是出现了,但却不能用(拖动条占满了整个滚动条)。
from Tkinter import *
import Tix
class Window:
def __init__(self, root):
self.labelList = []
self.notebook = Tix.NoteBook(root, ipadx=3, ipady=3)
self.notebook.add('sheet_1', label="Sheet 1", underline=0)
self.notebook.add('sheet_2', label="Sheet 2", underline=0)
self.notebook.add('sheet_3', label="Sheet 3", underline=0)
self.notebook.pack()
#self.notebook.grid(row=0, column=0)
tab1=self.notebook.sheet_1
tab2=self.notebook.sheet_2
tab3=self.notebook.sheet_3
self.myMainContainer = Frame(tab1)
self.myMainContainer.pack()
#self.myMainContainer.grid(row=0, column=0)
scrwin = Tix.ScrolledWindow(self.myMainContainer, scrollbar='y')
scrwin.pack()
#scrwin.grid(row=0, column=0)
self.win = scrwin.window
for i in range (100):
self.labelList.append((Label(self.win)))
self.labelList[-1].config(text= "Bla", relief = SUNKEN)
self.labelList[-1].grid(row=i, column=0, sticky=W+E)
root = Tix.Tk()
myWindow = Window(root)
root.mainloop()
每当我把至少一个布局管理器从 pack()
改成 grid()
时,就会出现这个问题。(其实,我更喜欢在所有容器中使用 grid()
。)
而且,当我不使用 NoteBook 小部件时,这个问题也不会出现。这里的其他例子似乎都依赖于 pack()
。有什么想法吗?
非常感谢,
Sano
1 个回答
2
我解决这个问题的时候没有用到 ´tix.scrolledWindow´。相反,我选择了Fred Lundh推荐的自动滚动条,具体可以参考这里。主要的问题是如何适应NoteBook这个组件。最开始,我尝试把滚动条放到根窗口,这样就能包围整个窗口。但我想在切换标签的时候改变滚动条的挂钩,但NoteBook的 ´raisecmd´ 并没有起作用。接着,我想到了在每个标签上使用配置事件——每当一个新标签被激活时,它的大小会变化,这时就会调用配置事件。
不过,经过很多次尝试,我始终不满意,于是我改变了思路,把滚动条放在了标签的内部。所有的标签和子容器都必须设置 ´grid_columnconfigure(0, weight=1)´ 和 ´grid_rowconfigure(0, weight=1)´,否则它们就不会随着标签的变化而增长。