我有一个画布(对于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个。第四部分。还有一个不起作用的滚动条。
*
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 ...
答案 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
的实例,它们需要是其他框架的子项,而其他框架需要是画布上的对象。