如何在tkinter中自动包装小部件?

3

我几年前在android中看到过这个函数(布局?),但我想不起来它的名字是什么了...

我需要一个自动替换的小部件。 如果新小部件的宽度达到窗口的末端,我想将该小部件移动到新行。

以下是我期望的输出。

进入图像描述

进入图像描述

我认为获取宽度并计算新小部件位置可以解决这个问题。 但是,我认为这是很常见的需求。tkinter是否支持它?

2个回答

5

由于tkinter拥有画布(canvas),可以使你对控件的位置有绝对的掌控,因此在添加项目时只需要进行简单的数学计算就可以完成。当窗口大小改变时,你需要添加代码来重新定位小部件。

一个更简单的方法是使用文本(text)控件,它支持嵌入图像或控件,并支持换行。

这里是一个演示:

import tkinter as tk

root = tk.Tk()
toolbar = tk.Frame(root)
text = tk.Text(root, wrap="word", yscrollcommand=lambda *args: vsb.set(*args))
vsb = tk.Scrollbar(root, command=text.yview)

toolbar.pack(side="top", fill="x")
vsb.pack(side="right", fill="y")
text.pack(side="left",fill="both", expand=True)

COUNT = 0
def add_widget():
    global COUNT
    COUNT += 1
    widget = tk.Label(root, width=12, text=f"Widget #{COUNT}", bd=1, relief="raised",
                      bg="#5C9BD5", foreground="white", padx=4, pady=4)
    text.configure(state="normal")
    text.window_create("insert", window=widget, padx=10, pady=10)
    text.configure(state="disabled")

add_button = tk.Button(toolbar, command=add_widget, text="Add")
add_button.pack(side="left")

for i in range(9):
    add_widget()

root.mainloop()

screenshot 3x3 widgets screenshot of expanded widget


不知道Text小部件有多强大。太棒了,是个好解决方案! - Thingamabobs

0

重构代码:

Bryan的答案中的代码非常有效!但有点难以理解。 因此,我对代码进行了重构。

import tkinter as tk

def add_widget():
    widget = tk.Button(root, width=12, text=f"Widget", padx=4, pady=4)
    text.window_create("end", window=widget, padx=10, pady=10)

root = tk.Tk()

add_button = tk.Button(root, command=add_widget, text="Add")
add_button.pack()

text = tk.Text(root, wrap="word", yscrollcommand=lambda *args: vscroll.set(*args))
text.configure(state="disabled") 
text.pack(side="left",fill="both", expand=True)

vscroll = tk.Scrollbar(root, command=text.yview)
vscroll.pack(side="right", fill="both")

root.mainloop()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接