如何在可变行数中添加小部件? (网格)
How can I add widgets in variable number of rows? (Grid)
我正在努力实现这样的目标:
基本上是一个包含可变数量条目的列表,每个条目都是一个框架,其中包含一个贴在西边的标签和两个贴在东边的按钮。
我该怎么做?
我不明白这是什么问题。
标准规则:如果您有 list/dictionary,则使用 for
-循环(或 while
-循环)。
最小工作示例
import tkinter as tk
data = [
['A', 'X1', 'Y1'],
['B', 'X2', 'Y2'],
['C', 'X3', 'Y3'],
['D', 'X4', 'Y4'],
['E', 'X5', 'Y5'],
['F', 'X6', 'Y6'],
]
root = tk.Tk()
for item in data:
frame = tk.Frame(root)
tk.Label( frame, text=f'Row: {item[0]}' ).pack(side='left')
tk.Button(frame, text=f'Button: {item[1]}').pack(side='left')
tk.Button(frame, text=f'Button: {item[2]}').pack(side='left')
frame.pack()
root.mainloop()
结果:
顺便说一句:
如果您有类似的对象,那么您可以使用 tk.Frame
创建自己的小部件
import tkinter as tk
# --- classes ---
class Row(tk.Frame):
def __init__(self, master, label, button1, button2):
super().__init__(master)
tk.Label( self, text=f'Row: {label}' ).pack(side='left')
tk.Button(self, text=f'Button: {button1}').pack(side='left')
tk.Button(self, text=f'Button: {button2}').pack(side='left')
# --- main ---
data = [
['A', 'X1', 'Y1'],
['B', 'X2', 'Y2'],
['C', 'X3', 'Y3'],
['D', 'X4', 'Y4'],
['E', 'X5', 'Y5'],
['F', 'X6', 'Y6'],
]
root = tk.Tk()
for item in data:
#row = Row(root, item[0], item[1], item[2])
row = Row(root, *item)
row.pack()
root.mainloop()
如果您想将对象(标签、按钮)保留在同一列中,那么您必须直接使用 .grid()
而没有 Frame
import tkinter as tk
data = [
['A', 'X1', 'Y1'],
['B-longer', 'X2', 'Y2'],
['C', 'X3', 'Y3'],
['D', 'X4', 'Y4'],
['E', 'X5-longer', 'Y5'],
['F', 'X6', 'Y6-longer'],
]
root = tk.Tk()
for number, item in enumerate(data):
tk.Label( root, text=f'Row: {item[0]}' ).grid(column=0, row=number, sticky='we')
tk.Button(root, text=f'Button: {item[1]}').grid(column=1, row=number, sticky='we')
tk.Button(root, text=f'Button: {item[2]}').grid(column=2, row=number, sticky='we')
root.mainloop()
结果:
没有.grid()
你会得到
我正在努力实现这样的目标:
基本上是一个包含可变数量条目的列表,每个条目都是一个框架,其中包含一个贴在西边的标签和两个贴在东边的按钮。 我该怎么做?
我不明白这是什么问题。
标准规则:如果您有 list/dictionary,则使用 for
-循环(或 while
-循环)。
最小工作示例
import tkinter as tk
data = [
['A', 'X1', 'Y1'],
['B', 'X2', 'Y2'],
['C', 'X3', 'Y3'],
['D', 'X4', 'Y4'],
['E', 'X5', 'Y5'],
['F', 'X6', 'Y6'],
]
root = tk.Tk()
for item in data:
frame = tk.Frame(root)
tk.Label( frame, text=f'Row: {item[0]}' ).pack(side='left')
tk.Button(frame, text=f'Button: {item[1]}').pack(side='left')
tk.Button(frame, text=f'Button: {item[2]}').pack(side='left')
frame.pack()
root.mainloop()
结果:
顺便说一句:
如果您有类似的对象,那么您可以使用 tk.Frame
创建自己的小部件
import tkinter as tk
# --- classes ---
class Row(tk.Frame):
def __init__(self, master, label, button1, button2):
super().__init__(master)
tk.Label( self, text=f'Row: {label}' ).pack(side='left')
tk.Button(self, text=f'Button: {button1}').pack(side='left')
tk.Button(self, text=f'Button: {button2}').pack(side='left')
# --- main ---
data = [
['A', 'X1', 'Y1'],
['B', 'X2', 'Y2'],
['C', 'X3', 'Y3'],
['D', 'X4', 'Y4'],
['E', 'X5', 'Y5'],
['F', 'X6', 'Y6'],
]
root = tk.Tk()
for item in data:
#row = Row(root, item[0], item[1], item[2])
row = Row(root, *item)
row.pack()
root.mainloop()
如果您想将对象(标签、按钮)保留在同一列中,那么您必须直接使用 .grid()
而没有 Frame
import tkinter as tk
data = [
['A', 'X1', 'Y1'],
['B-longer', 'X2', 'Y2'],
['C', 'X3', 'Y3'],
['D', 'X4', 'Y4'],
['E', 'X5-longer', 'Y5'],
['F', 'X6', 'Y6-longer'],
]
root = tk.Tk()
for number, item in enumerate(data):
tk.Label( root, text=f'Row: {item[0]}' ).grid(column=0, row=number, sticky='we')
tk.Button(root, text=f'Button: {item[1]}').grid(column=1, row=number, sticky='we')
tk.Button(root, text=f'Button: {item[2]}').grid(column=2, row=number, sticky='we')
root.mainloop()
结果:
没有.grid()
你会得到