Python 更改tkinter中滚动条的大小(使用网格布局)
我正在制作一个Tkinter GUI,它允许您查询数据库并以可滚动的框架显示结果。但是,当您生成结果时,滚动条将不会调整以匹配帧的新大小。如何使滚动条能够显示所有结果?我已经编写了一个快速而肮脏的代码版本来演示我遇到的问题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)
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%。知道为什么会这样吗?