水平滚动条不适用于Python TKinter Frame

时间:2013-07-17 02:15:52

标签: python canvas tkinter scrollbar

我有一个画布(对于ttk.Frame没有xviewyview方法)在其中保留框架,我想要水平浏览,因为它们在同一行。找到了一些教程,当他们处理不同的小部件组合时,我跟着他们,并尝试将它们应用到我的问题中,但没有成功。我确实看到了滚动条,但它没有做任何事情或做出任何反应。

class App:
    def __init__(self,db):
        self.db = db
        self.root = tkinter.Tk()                             
        self.masterframe = ttk.Frame(self.root)
        self.masterframe.grid()

        self.mastercanvas = tkinter.Canvas(self.masterframe)
        self.mastercanvas.grid()

        self.scrollbar = ttk.Scrollbar(self.masterframe,orient="horizontal",
            command = self.mastercanvas.xview)

        self.scrollbar.grid()
        self.mastercanvas.configure(xscrollcommand=self.scrollbar.set)

        for i,e in enumerate(self.db.elements):
            xf = XFrame(self,e)
            xf.grid(row=0,column=i,sticky="n")

编辑:

class XFrame:
    def __init__(self,app,x):
        self.app = app
        self.x = x
        self.frame = ttk.Frame(self.app.mastercanvas)
        self.set_up() # this sets frame's padding and populates it with widgets   

现在,在第一个 init 定义的末尾,或者在第二个 init 定义的末尾,我在这里粘贴了两行代码* - 什么都不会发生。我看到我的框架出现在我打算出现的地方 - 其中3个。第四部分。还有一个不起作用的滚动条。

*

self.update_idletasks() # using self.root in first, self.app.root in second variant
self.mastercanvas.configure(scrollregion=self.mastercanvas.bbox("all")) 
# in second variant reffered to as self.app.mastercanvas ...

1 个答案:

答案 0 :(得分:0)

您必须配置画布的scrollregion属性,以便它知道您要滚动多少虚拟画布。这应该这样做:

# create everything that will be inside the canvas
...

# next, cause the window to be drawn, so the frame will auto-size
self.update_idletasks() 

# now, tell the canvas to scroll everything that is inside it
self.mastercanvas.configure(scrollregion=self.mastercanvas.bbox("all"))

话虽如此,你的画布中没有任何东西可以滚动,我也不完全确定你在画布上的期望。如果您想要滚动XFrame的实例,它们需要是其他框架的子项,而其他框架需要是画布上的对象。