首页 > 解决方案 > Tkinter 框架使用 create_window 选项等效于展开

问题描述

我正在做这个小项目。我有一个框架(最初扩展以占用其他框架未占用的空间),我添加了一个滚动条,因为该框架包含一组小部件,一旦按下按钮就会复制。

我现在的问题是,一旦我已经添加了滚动条并使其工作,我就不能再调整由 create_window 选项制作的框架的大小。它里面的小部件已经使用了填充和扩展选项,但仍然不会扩展。我什至在包含的小部件中指定了宽度和高度,但仍然无法正常工作。

以下是相关代码:

from tkinter import *
from tkinter import ttk

class Database(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)
        parent.state('zoomed')
        self.parent = parent     
        
        #Main Frame
        MainFrame=Frame(self, bg="white")
        MainFrame.pack(expand = True, side = TOP, fill="both")
        
        #Level 2 Frame
        SubmainFrame=Frame(MainFrame)
        SubmainFrame.pack(side=LEFT, fill = BOTH, expand = True)
        
        #Level 3 Frame
        DataFrame=Frame(SubmainFrame)
        DataFrame.pack(side=RIGHT, expand = True, fill = BOTH)
        
                        
        frames = []

        def New():
            global widgetNames
            global frameNames
            
            DataFrameAF_=LabelFrame(frame,bg = "sky blue", text="Sub Info")
            DataFrameAF_.pack(side = TOP, padx = 10, pady = 10, fill = BOTH, expand = True)

            DataFrameAc = Frame(DataFrameAF_)
            DataFrameAc.pack(side = LEFT, padx = 5)

            DataFrameAc1 = Frame(DataFrameAc)
            DataFrameAc1.pack(side = LEFT)

            DataFrameAc2 = Frame(DataFrameAc)
            DataFrameAc2.pack(side = LEFT)


            #first column
            self.lbl_ac2=Label(DataFrameAc1, text = "A1                                    ")
            self.lbl_ac2.grid(row=1,column=0,sticky=W)

            self.txt_ac2=ttk.Entry(DataFrameAc1, width=20)
            self.txt_ac2.grid(row=1,column=1)

            self.lbl_ac3=Label(DataFrameAc1, text = "A2                                    ")
            self.lbl_ac3.grid(row=2,column=0,sticky=W)

            self.txt_ac3=ttk.Entry(DataFrameAc1, width=20)
            self.txt_ac3.grid(row=2,column=1)


            #second column
            self.lbl_ac2_=Label(DataFrameAc2, text = "B1                                    ")
            self.lbl_ac2_.grid(row=1,column=0,sticky=W)

            self.txt_ac2_=ttk.Entry(DataFrameAc2, width=20)
            self.txt_ac2_.grid(row=1,column=1)

            self.lbl_ac3_=Label(DataFrameAc2, text = "B2                                    ")
            self.lbl_ac3_.grid(row=2,column=0,sticky=W)

            self.txt_ac3_=ttk.Entry(DataFrameAc2, width=20)
            self.txt_ac3_.grid(row=2,column=1)



        DataFrameAF=LabelFrame(DataFrame, text="Information")
        DataFrameAF.pack(side = TOP, pady = 10)
        
        canvas = Canvas(DataFrameAF, borderwidth=0, background="#ffffff")
        frame = Frame(canvas, background="#ffffff")
        vsb = Scrollbar(DataFrameAF, orient="vertical", command=canvas.yview)
        canvas.configure(yscrollcommand=vsb.set)

        vsb.pack(side="right", fill="y")
        canvas.pack(side="left", fill=BOTH, expand=True)
        canvas.create_window((20,20), window=frame, anchor="nw")
        
        def reset_scrollregion(event):
            canvas.configure(scrollregion=canvas.bbox("all"))

        frame.bind("<Configure>", reset_scrollregion)


        First_Info = New()
        
        createWidgetButton = Button(frame, text="New Entry", command=New)
        createWidgetButton.pack(side=BOTTOM, fill="x")
        

root = Tk()
database_window = Database(root)
database_window.pack(side="top", fill="both", expand=True)
database_window.update()
root.mainloop()

标签: pythontkintertkinter-canvas

解决方案


推荐阅读