Tkinter动态“iframe”不会滚动

时间:2014-01-28 21:07:23

标签: python tkinter

我写了一些代码,我不能,因为我的生活中弄清楚它为什么不起作用。我正在尝试使用带有动态内容的滚动条创建一个框架,但由于某种原因,滚动条不会滚动。

import scrolledframe
from Tkinter import *

class app(Tk):
    def __init__(self, parent):
        Tk.__init__(self, parent)
        self.parent=parent
        self.initialize()
        populateinterior(self.sframe.interior)
    def initialize(self):
        self.grid()
        self.grid_columnconfigure(0, weight=1)
        self.grid_rowconfigure(0,weight=1)
        self.resizable(True,True)
        self.sframe = scrolledframe.VerticalScrolledFrame(self)
        self.sframe.grid()

def OnButtonClick():
        appinstance.sframe.interior.buttons.append(Button(appinstance.sframe.interior, text=u'Click meh!',command=OnButtonClick))
        appinstance.sframe.interior.buttons[-1].grid(row=len(appinstance.sframe.interior.buttons)+1,column=0)
def populateinterior(self):
        self.grid()
        self.buttons=[]

        self.buttons.append(Button(self, text=u'Click meh!',command=OnButtonClick))
        self.buttons[-1].grid(row=len(self.buttons)+1,column=0)

if __name__=="__main__":
    appinstance=app(None)
    appinstance.title("All dem appz belong to meh")
    appinstance.mainloop()

scrolledframe不是我自己写的东西,但不管怎么说:

from Tkinter import *
class VerticalScrolledFrame(Frame):
    """A pure Tkinter scrollable frame that actually works!

    * Use the 'interior' attribute to place widgets inside the scrollable frame
    * Construct and pack/place/grid normally
    * This frame only allows vertical scrolling

    Assuming this is Public domain, but it's from here: http://tkinter.unpythonic.net/wiki/VerticalScrolledFrame

    """
    def __init__(self, parent, *args, **kw):
        Frame.__init__(self, parent, *args, **kw)            

        # create a canvas object and a vertical scrollbar for scrolling it
        vscrollbar = Scrollbar(self, orient=VERTICAL)
        vscrollbar.pack(fill=Y, side=RIGHT, expand=FALSE)
        canvas = Canvas(self, bd=0, highlightthickness=0,
                        yscrollcommand=vscrollbar.set)
        canvas.pack(side=LEFT, fill=BOTH, expand=TRUE)
        vscrollbar.config(command=canvas.yview)

        # reset the view
        canvas.xview_moveto(0)
        canvas.yview_moveto(0)

        # create a frame inside the canvas which will be scrolled with it
        self.interior = interior = Frame(canvas)
        interior_id = canvas.create_window(0, 0, window=interior,
                                           anchor=NW)

        # track changes to the canvas and frame width and sync them,
        # also updating the scrollbar
        def _configure_interior(event):
            # update the scrollbars to match the size of the inner frame
            size = (interior.winfo_reqwidth(), interior.winfo_reqheight())
            canvas.config(scrollregion="0 0 %s %s" % size)
            if interior.winfo_reqwidth() != canvas.winfo_width():
                # update the canvas's width to fit the inner frame
                canvas.config(width=interior.winfo_reqwidth())
        interior.bind('<Configure>', _configure_interior)

        def _configure_canvas(event):
            if interior.winfo_reqwidth() != canvas.winfo_width():
                # update the inner frame's width to fill the canvas
                canvas.itemconfigure(interior_id, width=canvas.winfo_width())
        canvas.bind('<Configure>', _configure_canvas)

        return

任何线索? (我知道这是丑陋的代码,但它只是一个概念证明)

1 个答案:

答案 0 :(得分:2)

问题是populateinterior的第一行:

def populateinterior(self):
    self.grid()
    ...
在此上下文中,

self是滚动框架的内部窗口小部件。你在它上面调用grid,你不应该这样做。内部框架不得在画布内包装,放置或网格化。相反,它必须是使用canvas方法create_window(由VerticalScrolledFrame类处理)创建的canvas对象。当您在内部框架上调用grid时,您正在打破画布和框架之间的联系。