我有一个基类,它定义了我的常用表单函数,包括滚动。
我为其中一个后代添加了表单重新调整大小的功能,并且它已经杀死了滚动。
在以下摘录中,表单正在滚动。如果你取消注释一行,它可以根据需要重新调整表单和字段的大小,但它滚动已经死了。
有人可以帮忙吗?
from Tkinter import *
import ttk
class DisplayListWindow(Canvas):
def __init__(self, parent=None, *args, **kw):
Canvas.__init__(self,parent, borderwidth=0, *args, **kw)
self.frame = Frame(self)
vsb = Scrollbar(parent, orient="vertical", command=self.yview)
self.configure(yscrollcommand=vsb.set)
vsb.pack(side="right", fill="y")
self.create_window((4,4), window=self.frame, anchor="nw",
tags="self.frame")
self.pack(side="left", fill="both", expand=True)
self.frame.bind("<Configure>", self.OnFrameConfigure)
#remaining code in this function is from descendant classes
for i in range(1, 20, 1):
ttk.Entry(master=self.frame, style='C.TEntry').grid(row = i, column = 0, sticky = NSEW)
ttk.Entry(master=self.frame, style='C.TEntry').grid(row = i, column = 1, sticky = NSEW)
self.frame.columnconfigure(1, weight=1)
#the following line enables the re-sizing behaviour, but kills scrolling
#self.frame.pack(side="left", fill="both", expand=True) # <== problem
#----------------------------------------------------------------------
def OnFrameConfigure(self, event):
'''Reset the scroll region to encompass the inner frame'''
self.configure(scrollregion=self.bbox("all"))
DisplayListWindow().mainloop()
答案 0 :(得分:0)
如果您在画布中使用框架进行滚动,则必须使用create_window
将其添加到画布 - 您无法使用pack
添加它或grid
。这两种方法(create_window,对比包或网格)彼此不兼容。
如果您希望在窗口调整大小时调整框架大小,则必须添加代码以手动调整其大小。您可以通过调整<Configure>
回调中的宽度来执行此操作。
例如:
def OnFrameConfigure(self, event):
'''Reset the scroll region to encompass the inner frame'''
width = self.winfo_width() - 8 # allow room for some padding
self.itemconfigure("self.frame", width=width)
self.configure(scrollregion=self.bbox("all"))
注意我如何通过获取画布的宽度来计算宽度应该是什么,然后我使用该值来设置框架的宽度。高度保留为框架的自然高度,因此垂直滚动条应始终反映框架的完整内容。