0

我有一个画布(因为ttk.Frame没有xview,yview方法)在其中保存框架,我想水平浏览它们,因为它们在同一行中。找到了一些教程,当他们处理不同的小部件组合时,我遵循了它们,并尝试将它们应用于我的问题,但没有成功。我确实看到了一个滚动条,但它不执行任何操作或响应任何内容。

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 个。第4部分。和一个不起作用的滚动条。

*

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 ...
4

1 回答 1

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,它们必须是其他框架的子级,并且该其他框架需要是画布上的对象。

于 2013-07-17T02:37:11.010 回答