Python继承自tk.Frame,内部布局和滚动条

时间:2013-01-17 15:57:48

标签: python oop tkinter scrollbar frame

我使用过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是否是我最终会使用的。

0 个答案:

没有答案