Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 更改tkinter中滚动条的大小(使用网格布局)_Python_Tkinter_Python 3.7 - Fatal编程技术网

Python 更改tkinter中滚动条的大小(使用网格布局)

Python 更改tkinter中滚动条的大小(使用网格布局),python,tkinter,python-3.7,Python,Tkinter,Python 3.7,我正在制作一个Tkinter GUI,它允许您查询数据库并以可滚动的框架显示结果。但是,当您生成结果时,滚动条将不会调整以匹配帧的新大小。如何使滚动条能够显示所有结果?我已经编写了一个快速而肮脏的代码版本来演示我遇到的问题 import tkinter as tk def Lookup(): list = frame_buttons.grid_slaves() for l in list: l.destroy() for x in range(1000)

我正在制作一个Tkinter GUI,它允许您查询数据库并以可滚动的框架显示结果。但是,当您生成结果时,滚动条将不会调整以匹配帧的新大小。如何使滚动条能够显示所有结果?我已经编写了一个快速而肮脏的代码版本来演示我遇到的问题

import tkinter as tk

def Lookup():
    list = frame_buttons.grid_slaves()
    for l in list:
        l.destroy()
    for x in range(1000):
        tk.Label(frame_buttons, text="test", background="white").grid(row=x)


root = tk.Tk()
root.grid_rowconfigure(0, weight=1)
root.columnconfigure(0, weight=1)

frame_main = tk.Frame(root, bg="white")
frame_main.grid(row = 0,sticky='news')
frame_input = tk.Frame(frame_main, background = "white")
frame_input.grid(row=0, column=0, pady=(5, 0), sticky='nw')

tk.Button(frame_input, text="Search", fg="black", background = "grey",command=Lookup).grid(row=3, column=0,sticky='nw')

# Create a frame for the canvas with non-zero row&column weights
frame_canvas = tk.Frame(frame_main)
frame_canvas.grid(row=1, column=0, pady=(5, 0), sticky='nw')
frame_canvas.grid_rowconfigure(0, weight=1)
frame_canvas.grid_columnconfigure(0, weight=1)
# Set grid_propagate to False to allow 5-by-5 buttons resizing later
frame_canvas.grid_propagate(False)

# Add a canvas in that frame
canvas = tk.Canvas(frame_canvas, bg="gray")
canvas.grid(row=0, column=0, sticky="news")

# Link a scrollbar to the canvas
vsb = tk.Scrollbar(frame_canvas, orient="vertical", command=canvas.yview)
vsb.grid(row=0, column=1, sticky='ns')
canvas.configure(yscrollcommand=vsb.set)
frame_buttons = tk.Frame(canvas, bg="gray")
canvas.create_window((0, 0), window=frame_buttons, anchor='nw')
for x in range(15):
    tk.Label(frame_buttons, text="blah", background = "white").grid(row=x)
frame_buttons.update_idletasks()
frame_canvas.config(width=500, height=100)
canvas.config(scrollregion=canvas.bbox("all"))
root.mainloop()

这会在滚动区域中放置20个标签,足以激活滚动条。然后,当您单击“搜索”时,它将用1000个测试标签替换这20个标签。但是只有前20个可以查看。

每当帧大小改变并且项目被重新绘制时,您需要重置滚动区域

通常的方法是绑定到帧的
事件,以便它在帧增长和收缩时自动发生

例如:

def reset_scrollregion(event):
    canvas.config(scrollregion=canvas.bbox("all"))
...
frame_buttons.bind("<Configure>", reset_scrollregion)
def reset_滚动区域(事件):
canvas.config(scrollregion=canvas.bbox(“全部”))
...
框按钮。绑定(“,重置滚动区域)

每当帧大小改变并且项目被重新绘制时,您需要重置滚动区域

通常的方法是绑定到帧的
事件,以便它在帧增长和收缩时自动发生

例如:

def reset_scrollregion(event):
    canvas.config(scrollregion=canvas.bbox("all"))
...
frame_buttons.bind("<Configure>", reset_scrollregion)
def reset_滚动区域(事件):
canvas.config(scrollregion=canvas.bbox(“全部”))
...
框按钮。绑定(“,重置滚动区域)

作为一种后期跟进:我现在已经在代码中实现了这个解决方案,但是当我返回几百个结果范围内的内容时,它会将滚动框的大小调整为远远大于结果的大小。结果只占新滚动条区域的30-40%。知道为什么会这样吗?作为一种后期跟进:我现在已经在代码中实现了这个解决方案,但是当我返回几百个结果范围内的内容时,它会将滚动框的大小调整为远远大于结果的大小。结果只占新滚动条区域的30-40%。知道为什么会这样吗?