现有一个处理好数据的excel文件,需要通过tkinter来进行直观上的窗口列表展示,并按照相同的格式为一栏,水平排列保持窗口美观。
df为提取excel数值的变量
左右两栏、两个列表时,可以通过奇数偶数来插入数值并有其对应的标题
# 创建标签显示关键词、次数、时间
frame_table = tk.Frame(result_window)
frame_table.pack(pady=10)
# 创建左侧栏
left_frame = tk.Frame(frame_table)
left_frame.grid(row=0, column=0)
# 创建右侧栏
right_frame = tk.Frame(frame_table)
right_frame.grid(row=0, column=1)
# 定义标题文本
headers = ["关键词", "次数", "时长/s"]
# 创建标题标签并放置在左侧栏
for col, header in enumerate(headers):
tk.Label(left_frame, text=header, font=("Helvetica", 12)).grid(row=0, column=col, padx=10, pady=10, sticky="nsew")
# 创建标题标签并放置在右侧栏
for col, header in enumerate(headers):
tk.Label(right_frame, text=header, font=("Helvetica", 12)).grid(row=0, column=col, padx=10, pady=10, sticky="nsew")
# 向标签中插入数据
for index, row in df.iterrows():
if index % 2 == 0: # 偶数行放在左侧栏
for col, value in enumerate(row):
tk.Label(left_frame, text=value).grid(row=index//2+1, column=col, padx=10, pady=5, sticky="nsew")
else: # 奇数行放在右侧栏
for col, value in enumerate(row):
tk.Label(right_frame, text=value).grid(row=index//2+1, column=col, padx=10, pady=5, sticky="nsew")
# 设置标题栏列宽统一
for i in range(len(headers)):
left_frame.grid_columnconfigure(i, weight=1, uniform="column")
right_frame.grid_columnconfigure(i, weight=1, uniform="column")
执行之后你会发现标题行无法对齐,那么将未插入数值的列加入空白行
# 向标签中插入数据
for index, row in df.iterrows():
if index % 2 == 0: # 偶数行放在左侧栏
for col, value in enumerate(row):
tk.Label(left_frame, text=value).grid(row=index//2+1, column=col, padx=10, pady=5, sticky="nsew")
else: # 奇数行放在右侧栏
for col, value in enumerate(row):
tk.Label(right_frame, text=value).grid(row=index//2, column=col, padx=10, pady=5, sticky="nsew")
# 如果左右两栏行数不同,就将右栏最后添加一个空白行保证对齐
if len(df) % 2 != 0:
for col in range(len(headers)):
tk.Label(right_frame, text="").grid(row=len(df)//2+1, column=col, padx=10, pady=5, sticky="nsew")
同理,可以使用三栏水平排列的列表栏
# 创建标题框架
frame_table = tk.Frame(result_window)
frame_table .pack(pady=10)
# 创建左侧栏
left_frame = tk.Frame(frame_table)
left_frame.grid(row=0, column=0)
# 创建中间栏
middle_frame = tk.Frame(frame_table)
middle_frame.grid(row=0, column=1)
# 创建右侧栏
right_frame = tk.Frame(frame_table)
right_frame.grid(row=0, column=2)
# 定义标题文本
headers = ["关键词", "次数", "时长/s"]
# 创建标题标签并放置在左侧栏
for col, header in enumerate(headers):
tk.Label(left_frame, text=header, font=("Helvetica", 12)).grid(row=0, column=col, padx=10, pady=10, sticky="nsew")
tk.Label(middle_frame, text=header, font=("Helvetica", 12)).grid(row=0, column=col, padx=10, pady=10, sticky="nsew")
tk.Label(right_frame, text=header, font=("Helvetica", 12)).grid(row=0, column=col, padx=10, pady=10, sticky="nsew")
# 计算整除后每栏应该插入的行数
rows_per_column = len(df) // 3
# 向标签中插入数据
for index, row in df.iterrows():
if index % 3 == 0: # 每三行放在左侧栏
for col, value in enumerate(row):
tk.Label(left_frame, text=value).grid(row=index//3+1, column=col, padx=10, pady=5, sticky="nsew")
elif index % 3 == 1: # 每三行放在中间栏
for col, value in enumerate(row):
tk.Label(middle_frame, text=value).grid(row=index//3+1, column=col, padx=10, pady=5, sticky="nsew")
else: # 每三行放在右侧栏
for col, value in enumerate(row):
tk.Label(right_frame, text=value).grid(row=index//3+1, column=col, padx=10, pady=5, sticky="nsew")
# 如果最后的右栏没有被3整除,用空白行填充
if len(df) % 3 != 0:
for index in range(rows_per_column * 3, len(df)):
for col in range(len(headers)):
tk.Label(middle_frame, text="").grid(row=index//3+2, column=col, padx=10, pady=5, sticky="nsew")
tk.Label(right_frame, text="").grid(row=index//3+2, column=col, padx=10, pady=5, sticky="nsew")
# 设置标题栏列宽统一
for i in range(len(headers)):
left_frame.grid_columnconfigure(i, weight=1, uniform="column")
middle_frame.grid_columnconfigure(i, weight=1, uniform="column")
right_frame.grid_columnconfigure(i, weight=1, uniform="column")