如何更新带有滚动条的框架,其中包含按钮,以便在添加按钮时更新并正常工作?
How to update a frame with a scrollbar linked in it that has buttons so that it updates and works correctly when adding buttons?
我正在用 tkinter 编写一个具有以下结构的应用程序:
- 笔记本
- 选项卡(笔记本上的框架)
- Canvas(上框)
- SecondFrame(在 canvas 上)← 这是我要打包按钮的地方
- MyButtons(在第二帧)
虽然滚动条按预期链接到我的 canvas。
假设程序 运行 时我有 20 个按钮,按下其中任何一个我想销毁最后一个按钮
这是我的代码:
from tkinter import *
from tkinter.ttk import *
root = Tk()
root.geometry('300x300')
root.title('Update Scrollbar')
notebook = Notebook(root)
tab1 = Frame(notebook)
notebook.add(tab1, text='Home')
notebook.pack(expand=1, fill='both')
canvas = Canvas(tab1)
second_frame = Frame(canvas)
scrollbar = Scrollbar(tab1, orient='vertical', command=canvas.yview)
canvas.create_window((0, 0), window=second_frame, anchor='center')
scrollbar.pack(side='right', fill='y')
canvas.config(yscrollcommand=scrollbar.set)
canvas.bind('<Configure>', lambda e: canvas.configure(scrollregion=canvas.bbox('all')))
canvas.pack()
# With this function I destroy the last button:
def delete_buttons():
list(second_frame.winfo_children())[-1].destroy()
second_frame.update_idletasks()
# Here I pack my buttons all with a command 'delete_buttons'
for i in range(20):
Button(second_frame, text='Button' + str(i), command=delete_buttons).pack()
root.mainloop()
然而,当点击一个按钮时,最后一个按钮被销毁,但在 window 的顶部和底部创建了一个丑陋的 space。 (因为缺少按钮,我想之前花了 space。)
space 出现是因为您使用 anchor=
选项来创建 Canvas
window 对象:
canvas.create_window((0, 0), window=second_frame, anchor='center')
每次删除 Button
之一时,内容都会重新居中。
为了防止删除导致的一些额外 space 分布到 Canvas
的顶部,只需将 window 对象锚定到其西北(左上)这样的角落:
canvas.create_window((0, 0), window=second_frame, anchor='nw')
另请注意,second_frame.update_idletasks()
调用 delete_buttons()
函数不是必需的。
我正在用 tkinter 编写一个具有以下结构的应用程序:
- 笔记本
- 选项卡(笔记本上的框架)
- Canvas(上框)
- SecondFrame(在 canvas 上)← 这是我要打包按钮的地方
- MyButtons(在第二帧)
虽然滚动条按预期链接到我的 canvas。
假设程序 运行 时我有 20 个按钮,按下其中任何一个我想销毁最后一个按钮
这是我的代码:
from tkinter import *
from tkinter.ttk import *
root = Tk()
root.geometry('300x300')
root.title('Update Scrollbar')
notebook = Notebook(root)
tab1 = Frame(notebook)
notebook.add(tab1, text='Home')
notebook.pack(expand=1, fill='both')
canvas = Canvas(tab1)
second_frame = Frame(canvas)
scrollbar = Scrollbar(tab1, orient='vertical', command=canvas.yview)
canvas.create_window((0, 0), window=second_frame, anchor='center')
scrollbar.pack(side='right', fill='y')
canvas.config(yscrollcommand=scrollbar.set)
canvas.bind('<Configure>', lambda e: canvas.configure(scrollregion=canvas.bbox('all')))
canvas.pack()
# With this function I destroy the last button:
def delete_buttons():
list(second_frame.winfo_children())[-1].destroy()
second_frame.update_idletasks()
# Here I pack my buttons all with a command 'delete_buttons'
for i in range(20):
Button(second_frame, text='Button' + str(i), command=delete_buttons).pack()
root.mainloop()
然而,当点击一个按钮时,最后一个按钮被销毁,但在 window 的顶部和底部创建了一个丑陋的 space。 (因为缺少按钮,我想之前花了 space。)
space 出现是因为您使用 anchor=
选项来创建 Canvas
window 对象:
canvas.create_window((0, 0), window=second_frame, anchor='center')
每次删除 Button
之一时,内容都会重新居中。
为了防止删除导致的一些额外 space 分布到 Canvas
的顶部,只需将 window 对象锚定到其西北(左上)这样的角落:
canvas.create_window((0, 0), window=second_frame, anchor='nw')
另请注意,second_frame.update_idletasks()
调用 delete_buttons()
函数不是必需的。