如何在 tkinter 中自动换行小部件?

Red*_*ngs 3 python tkinter

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

我需要一个自动替换小部件。如果新小部件的宽度与窗口末尾相交,我想将该小部件移至新行。

以下是我的预期输出。

在此输入图像描述

在此输入图像描述

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

Bry*_*ley 5

由于 tkinter 有一个画布,可以让您对位置进行绝对控制,因此在添加项目时只需进行一点数学运算即可完成此操作。您必须添加代码以在调整窗口大小时重新定位小部件。

一种更简单的方法是使用文本小部件,它支持嵌入图像或小部件,并且支持换行。

这是一个演示:

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()
Run Code Online (Sandbox Code Playgroud)

屏幕截图 3x3 小部件 展开的小部件的屏幕截图