簡體   English   中英

如何在 tkinter 中自動包裝小部件?

[英]How to auto-wrap widget in tkinter?

幾年前在android看到過這個function(布局?),但是想不起來這個function是什么名字...

我需要一個自動替換小部件。 如果新小部件的寬度滿足 window 的末尾,我想將該小部件移到新行。

下面是我預期的 output。

在此處輸入圖像描述

在此處輸入圖像描述

我想,獲取寬度並計算新的小部件 position 將解決它。 但是,我認為這是如此普遍的需求。 tkinter支持嗎?

由於 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()

屏幕截圖 3x3 小部件 擴展小部件的屏幕截圖

重構代碼:

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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM