我写了一些代码,我不能,因为我的生活中弄清楚它为什么不起作用。我正在尝试使用带有动态内容的滚动条创建一个框架,但由于某种原因,滚动条不会滚动。
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
任何线索? (我知道这是丑陋的代码,但它只是一个概念证明)
答案 0 :(得分:2)
问题是populateinterior的第一行:
def populateinterior(self):
self.grid()
...
在此上下文中, self
是滚动框架的内部窗口小部件。你在它上面调用grid
,你不应该这样做。内部框架不得在画布内包装,放置或网格化。相反,它必须是使用canvas方法create_window
(由VerticalScrolledFrame类处理)创建的canvas对象。当您在内部框架上调用grid
时,您正在打破画布和框架之间的联系。