表单重新调整大小会形成滚动

时间:2014-05-20 08:13:02

标签: python tkinter

我有一个基类,它定义了我的常用表单函数,包括滚动。

我为其中一个后代添加了表单重新调整大小的功能,并且它已经杀死了滚动。

在以下摘录中,表单正在滚动。如果你取消注释一行,它可以根据需要重新调整表单和字段的大小,但它滚动已经死了。

有人可以帮忙吗?

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()

1 个答案:

答案 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"))

注意我如何通过获取画布的宽度来计算宽度应该是什么,然后我使用该值来设置框架的宽度。高度保留为框架的自然高度,因此垂直滚动条应始终反映框架的完整内容。