Python Tkinter Scrollbar 在使用 Scrollbar 时向上而不是向下平移也有对齐问题

Python Tkinter Scrollbar panning upwards instead of downwards also alignment issue while using Scrollbar

我正在使用 TKinter 为我的 python 应用程序构建 GUI。

我想在主屏幕上添加一个滚动条,因为我有很多数据要显示但很少space。 目前我使用这些行:

root=Tk()
root.state("zoomed")
#...rest of the code... (Relevant parts mentioned below:)
root.mainloop()

最大限度地利用可用的屏幕space,但即使这样对我来说也不行。

这是我用来添加滚动条的 John Elder(Codemy.com 的首席执行官)的 code

# Create A Main Frame
    main_frame = Frame(root)
    main_frame.pack(fill=BOTH, expand=1)

    # Create A Canvas
    my_canvas = Canvas(main_frame)
    my_canvas.pack(side=LEFT, fill=BOTH, expand=1)

    # Add A Scrollbar To The Canvas
    my_scrollbar = ttk.Scrollbar(main_frame, orient=VERTICAL, command=my_canvas.yview)
    my_scrollbar.pack(side=RIGHT, fill=Y)

    # Configure The Canvas
    my_canvas.configure(yscrollcommand=my_scrollbar.set)
    my_canvas.bind('<Configure>', lambda e: my_canvas.configure(scrollregion = my_canvas.bbox("all")))
    def _on_mouse_wheel(event):
        my_canvas.yview_scroll(-1 * int((event.delta / 100)), "units")

    my_canvas.bind_all("<MouseWheel>", _on_mouse_wheel)

    # Create ANOTHER Frame INSIDE the Canvas
    encompasser = Frame(my_canvas, bg=mainbg)

    # Add that New frame To a Window In The Canvas
    my_canvas.create_window((0,0), window=encompasser, anchor="n")

    #Adding the scroll bar part ends here...

    encompasser=Frame(my_canvas,bg=mainbg, borderwidth=0)
    encompasser.pack(fill=BOTH, expand=1)

    #second_frame = LabelFrame(my_canvas, borderwidth=0, bg=mainbg).pack()
    header=LabelFrame(encompasser,bg=mainbg, borderwidth=0)
    header.pack()
    greet=Label(header,font="Arial 20",text="Prescription Generator V4.0.0", bg=mainbg, fg="black").pack(pady=10)

    utilitiesF=LabelFrame(header,bg=mainbg, borderwidth=0)
    utilitiesF.pack()

    settingLF=LabelFrame(utilitiesF,bg=mainbg, borderwidth=0)

    megaF=LabelFrame(encompasser,bg=mainbg, borderwidth=0)
    megaF.pack()

    dateF=LabelFrame(utilitiesF, padx=10, pady=10, bg=mainbg, borderwidth=0)
    dateF.grid(row=0, column=1)

    date=Label(dateF,font="Arial 14",text="Date:", bg=mainbg).grid(row=0,column=0, sticky=E)
    edate=Entry(dateF, width=9,borderwidth=0, font="Arial 14")
    edate.insert(0,today)
    edate.grid(row=0, column=1, padx=5)

    my_tree_frame=LabelFrame(header, padx=10, pady=10, bg=subbg, borderwidth=0)
    my_tree_frame.pack()

Dormant scrollbar added

将滚动条添加到 canvas 并在框架中打开 canvas 后,我将东西添加到名为“encompasser”的框架中。

问题:当我单击按钮时:显示数据库,打开以下树视图: Treeview opens up, moving the rest of my project down

当我的项目的其余部分向下移动时,滚动条只是不向下滚动。 Scroll Bar stuck and not working on moving it up or down 我在这里做错了什么? 我知道一种解决方案是将树视图小部件作为 Toplevel() 打开,但我希望它在同一页面内打开。请回答我的问题,谢谢!

还有一件事:当我尝试将包含我所有小部件的框架打包到 encompasser 中时,整个对齐方式变得一团糟。整个项目向左移动,从美学上看并不好看。

Showing what happened when I removed the frame called "encompasser"

首先,您使用相同的变量名称创建了另一个框架 encompasser:

encompasser=Frame(my_canvas,bg=mainbg, borderwidth=0)
encompasser.pack(fill=BOTH, expand=1)

应删除以上两行。

其次,您应该在调整内部框架 encompasser 大小时更新 scrollregion,而不是 my_canvas

删除行:

my_canvas.bind('<Configure>', lambda e: my_canvas.configure(scrollregion = my_canvas.bbox("all")))

并在创建 encompasser 后添加以下行:

encompasser.bind('<Configure>', lambda e: my_canvas.configure(scrollregion=my_canvas.bbox("all")))