水平滚动条在Python TKinter框架中不工作

水平滚动条在Python TKinter框架中不工作,python,canvas,tkinter,scrollbar,Python,Canvas,Tkinter,Scrollbar,我有一个画布(用于ttk.Frame,没有xview,yview方法)在其中保存帧,我想水平浏览这些帧,因为它们在同一行中。找到了一些教程,当它们处理不同的小部件组合时,我遵循它们,并尝试将它们应用到我的问题中,但没有成功。我确实看到一个滚动条,但它不做任何事情,也不响应任何事情 class App: def __init__(self,db): self.db = db self.root = tkinter.Tk()

我有一个画布(用于
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")
编辑:

现在,我建议在这里粘贴两行代码*——在第一个init定义的末尾,或者在第二个init定义的末尾——没有新的事情发生。我看到我的相框像我希望的那样出现——其中3个。第四部分。和一个不起作用的滚动条

*


您必须配置画布的
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
的实例,则它们必须是其他某个帧的子帧,并且该其他帧必须是画布上的对象

哪个对象应该调用
update\u idletasks
?同时-接着是
scrollregion
配置-我尝试从根、主框架、主画布(一次一个会话)调用它,然后尝试从
XFrame
类(可以访问
App
)调用它们,但没有效果。哪个对象应该调用update\u idletasks?没关系。不管你怎么称呼它,它都会做同样的事情。我更新了我的答案,提供了更多的信息。可能您没有看到任何效果,因为画布中没有可滚动的内容。@hgf:hgf我仍然看不到您在向画布添加帧的任何地方(提示:您必须使用
create\u window
函数才能通过画布滚动),谢谢您的提示;关于canvas的工作原理,这是非常有帮助和令人大开眼界的。我制作了
self.framesholder
对象(将其放在画布上),将我的框架放在其中,然后添加了一行:
self.mastercanvas.create_window(0,0,window=self.framesholder)
。我想滚动条现在应该按像素方向在framesholder上移动。(画布覆盖了整个屏幕,我现在看不到滚动条,但我应该弄清楚。)
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 ...
# 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"))