由于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()
重构代码:
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()