首页 > 解决方案 > Python Tkinter 滚动条在使用滚动条时向上而不是向下平移也会出现对齐问题

问题描述

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

我想在主屏幕上添加一个滚动条,因为我有很多数据要显示但空间非常小。目前我使用以下线路:

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

最大限度地利用可用的屏幕空间,但即便如此,对我来说也没有削减它。

这是我用来添加滚动条的 John Elder(Codemy.com 的 CEO)的代码:

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

添加了休眠滚动条

将滚动条添加到画布并在框架中打开画布后,我将内容添加到名为“encompasser”的框架中。

问题:当我单击按钮时:显示数据库,打开以下树视图: 树视图打开,将我的项目的其余部分向下移动

当我的项目的其余部分向下移动时,滚动条不会向下滚动滚动条卡住了,无法向上或向下移动 我在这里做错了什么?我知道一种解决方案是将树视图小部件作为 Toplevel() 打开,但我希望它在同一页面中打开。请回答我的问题,谢谢!

还有一件事:当我尝试打包包含我所有小部件的框架时,整个对齐方式都搞砸了。整个项目向左侧移动,从美学上看并不好看。

显示当我移除名为“encompasser”的框架时发生的情况

标签: pythonuser-interfacetkintertreeviewscrollbar

解决方案


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

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

上面两行应该被删除。

其次,您应该在调整scrollregion内部框架encompasser大小时更新 ,而不是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")))

推荐阅读