微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何更新带有按钮的滚动条链接的框架,以便在添加按钮时更新并正常工作?

如何解决如何更新带有按钮的滚动条链接的框架,以便在添加按钮时更新并正常工作?

我正在 tkinter 中编写一个具有以下结构的应用程序:

  1. 笔记本
  2. Tab(笔记本上的边框)
  3. 画布(在框架上)
  4. SecondFrame(在画布上)← 这是我想要打包按钮的地方
  5. MyButtons(在第二帧)

虽然滚动条按预期链接到我的画布。

假设我在运行程序时有 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()

然而,当点击一个按钮时,最后一个按钮被销毁,但在窗口的顶部和底部会产生一个丑陋的空间。 (因为丢失的按钮在我想之前占用了空间。)

before pressing any button

after pressing any button

解决方法

由于您用于创建 anchor= 窗口对象的 Canvas 选项而出现空间:

canvas.create_window((0,0),window=second_frame,anchor='center')

这会导致每次删除 Button 之一时内容都重新居中。

为了防止删除导致的一些额外空间分布到 Canvas 的顶部,只需将窗口对象锚定到它的西北(左上)角,如下所示:

canvas.create_window((0,anchor='nw')

另请注意,second_frame.update_idletasks() 函数中的 delete_buttons() 调用不是必需的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。