我使用过AutoScrollbar(http://effbot.org/zone/tkinter-autoscrollbar.htm),并添加了一个横向的。
from Tkconstants import VERTICAL, N, S, HORIZONTAL, W, E, END
import Tkinter as Tk
class AutoScrollbar(Tk.Scrollbar):
""" a scrollbar that hides itself if it's not needed. only
works if you use the grid geometry manager."""
def set(self, lo, hi):
if float(lo) <= 0.0 and float(hi) >= 1.0:
# grid_remove is currently missing from Tkinter!
self.tk.call("grid", "remove", self)
else:
self.grid()
Tk.Scrollbar.set(self, lo, hi)
def pack(self, **kw):
raise Tk.TclError, "cannot use pack with this widget"
def place(self, **kw):
raise Tk.TclError, "cannot use place with this widget"
if __name__ == '__main__':
root = Tk.Tk()
scrollbarY = AutoScrollbar(root,orient=VERTICAL)
scrollbarY.grid(column=1, row=0,sticky=N+S)
scrollbarX = AutoScrollbar(root,orient=HORIZONTAL)
scrollbarX.grid(column=0, row=1,sticky=W+E)
mylist = Tk.Listbox(root, xscrollcommand = scrollbarX.set, yscrollcommand = scrollbarY.set )
for line in range(50):
mylist.insert(END, "This is line number " + str(line) + ", and then just for whatever reason this text goes on and on")
mylist.grid(column=0, row=0,sticky=N+S+E+W)
scrollbarX.config( command = mylist.xview )
scrollbarY.config( command = mylist.yview )
root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)
Tk.mainloop()
现在我想:如果没有混乱的话,拥有这个功能是不是很好? 所以我开始使用自动隐藏滚动条对tk.Frame进行编码。 想法是:您向AutoscrollFrame添加一个Widget,Atuoscrollframe内部将该小部件放在(0,0)2x2网格上,其中(0,1)和(1,0)是x和y-自动隐藏滚动条和(1,1)留空。 滚动条当然只有在需要时才可见。
现在这个想法似乎很容易在我的脑海中实现。可悲的是,我很快就看到它不是。 我必须覆盖什么方法来实现'添加子窗口小部件到框架'功能(将窗口小部件添加到一般框架但不添加到(0,0)网格位置,并将滚动条与窗口小部件一起注册)?< / p>
到目前为止我的代码看起来像这样:
import Tkinter as tk
from Tkconstants import VERTICAL, N, S, HORIZONTAL, W, E, END
class AutoscrollFrame(tk.Frame):
"""A Frame extension that automatically adds scrollbars
if the content of the frame exceeds it's dimensions.
"""
def __init__(self,master,*args,**kwargs):
self.master = master
super(AutoscrollFrame,self).__init__(master=master,*args,**kwargs)
self.scrollbarY = _AutoScrollbar(self,orient=VERTICAL)
self.scrollbarY.grid(column=1, row=0,sticky=N+S)
self.scrollbarX = _AutoScrollbar(self,orient=HORIZONTAL)
self.scrollbarX.grid(column=0, row=1,sticky=W+E)
self.columnconfigure(0, weight=1)
self.rowconfigure(0, weight=1)
def add_child_placeholder(self,child):
self.child = child
self.child.config(xscrollcommand=scrollbarX.set, yscrollcommand=scrollbarY.set )
self.child.grid(column=0, row=0,sticky=N+S+E+W)
self.scrollbarX.config( command = self.child.xview )
self.scrollbarY.config( command = self.child.yview )
add_child_placeholder
是我想在这样的事情发生时调用的方法的原型:
frame = AutoscrollFrame(root)
myList = tk.Listbox(frame)
意思是如果我将帧设置为另一个Widget的主,我想调用帧add_child_placeholder
方法。
这是一种明智的方式吗?我不完全确定这不是一个脑力,所以一点帮助将不胜感激。
PS:我想将这个功能添加到tk.Frame(而不是tk.ListBox),因为我还不确定Listbox是否是我最终会使用的。