TKinter滚动条用于屏幕中间,支持可缩放的屏幕以及顶部和底部

时间:2019-07-18 13:55:38

标签: python tkinter formatting scrollbar organization

我正在尝试创建一个在屏幕中间显示网格的应用程序,该网格由两个栏(顶部栏和底部栏)围绕,其中包含供用户按下的按钮。无论用户在网格上的何处滚动,这些按钮都应能够显示,并且如果调整窗口大小,则这些按钮不应被切断。我正在努力配置滚动条以跟踪正确的区域,并在调整窗口大小时使网格从屏幕上掉下来。到目前为止,这是我的代码:

from tkinter import *


def add_row(event):
    input_row = Entry(grid_frame, bd=1, text="", bg="white", relief="solid")
    input_row.grid(row=grid_frame.rows, sticky=N+S+E+W)
    Grid.rowconfigure(grid_frame, grid_frame.rows, weight=1)
    grid_frame.rows = grid_frame.rows + 1


class GridFrame(Frame):
    rows = 0

    def __init__(self, root):
        Frame.__init__(self, root, bd=1)


root = Tk(className="Main screen")
root.minsize(408, 80)

# size to quarter of screen
w, h = root.winfo_screenwidth() / 2, root.winfo_screenheight() / 2
root.geometry("%dx%d+0+0" % (w, h))

# grid_frame will resize and bars will not
Grid.rowconfigure(root, 1, weight=1)
Grid.columnconfigure(root, 0, weight=1)

myframe = Frame(root, bd=4, relief="groove")
myframe.grid(row=1, sticky=N + W + S + E)

canvas = Canvas(myframe)
grid_frame = GridFrame(canvas)
grid_frame.pack(fill=BOTH, expand=True)
grid_frame.bind("<Button-1>", add_row)
scrollbar = Scrollbar(myframe, orient="vertical", command=canvas.yview)

canvas.configure(yscrollcommand=scrollbar.set)
scrollbar.pack(side=RIGHT, fill=Y)
canvas.pack(side=LEFT, fill=BOTH, expand=True)

topBar = Frame(root, grid_frame)
label = Label(topBar, text="Top Text")
label.pack()
topBar.grid(row=0, sticky=W+N+E+S)

bottomFrame = Frame(root, grid_frame)
label = Label(bottomFrame, text="Bottom Text")
label.pack()
bottomFrame.grid(row=2, sticky=E+S+W)

mainloop()

我要跟踪的滚动区域是我从this post读取的myframe / canvas / grid_frame组合。当前的功能是,滚动条永远不会处于“活动”状态,并且添加到网格的行只会缩小网格以使其适合显示。要添加新行,请在grid_frame区域内单击。任何帮助将不胜感激!以下是当前用户界面的一些图片: UI display with only a few rows UI display with many more rows

1 个答案:

答案 0 :(得分:0)

您的代码有两个主要问题。

首先,为了使画布能够滚动内部框架,内部框架必须是使用create_window创建的画布对象。您正在使用pack将其添加到画布中,这意味着画布无法滚动。

要解决此问题,请使用create_window而不是pack

canvas.create_window(0, 0, anchor="nw", window=grid_frame)

第二,每当画布内的内容更改时,都必须重置scrollregion属性。通常,这是在框架上的<Configure>事件处理程序中完成的,但是您也可以在add_row函数中轻松地调用它。

例如,将以下行添加到add_row的末尾:

canvas.configure(scrollregion=canvas.bbox("all"))

通过这两个更改,只要内部框架比画布高,滚动条就会开始工作。


以上内容解决了添加项时内部窗口能够滚动的问题。在此测试程序的特定示例中,您还会遇到绑定位于框架上的问题。在启动时,框架的大小为1x1,因此单击起来有点困难。将绑定移动到画布将使此特定的演示程序更好地工作。