Python tkinter Label控件无法完整输出全部打印结果如何解决
解决方案
问题根因
你在遍历对比的循环中,每次都直接给result_label的text属性赋新值,新内容会直接覆盖之前的旧内容,所以最终界面上只保留了最后一条对比结果;而控制台执行print(x)是每次新增一行输出,因此能完整展示所有结果。同时你当前代码还存在两个小问题:缺失sys模块导入(用到了sys.stderr但没有对应导入语句)、用了内置函数名cmp做自定义变量、存在无意义的重复定义DIRS/FILES和空循环代码。
修复方案
推荐使用Text控件替代原来的Label来展示多行结果,更适合多行文本的滚动展示,修改后的完整代码如下:
import filecmp import os import sys import tkinter as tk import tkinter.font as tkFont def gg(): # 先清空之前的输出内容 result_text.delete(1.0, tk.END) disk = number_entry.get() if disk == "2" : DIRS = [r'C:\Newtest\1', r'C:\Newtest\2', r'C:\Newtest\3',r'C:\Newtest\4',r'C:\Newtest\5',r'C:\Newtest\6',r'C:\Newtest\7',r'C:\Newtest\8',r'C:\Newtest\9',r'C:\Newtest\10'] FILES = [('copy1.txt', 'copy2.txt'), ('fcmp1.txt', 'fcmp2.txt'), ('filecp1.txt', 'filecp2.txt')] for e, dir in enumerate(DIRS, 1): cmp_res = True for file in FILES: try: if not filecmp.cmp(os.path.join(dir, file[0]), os.path.join(dir, file[1])): cmp_res = False break except Exception as ex: err_info = f'Error -> {ex}\n' print(err_info, file=sys.stderr) result_text.insert(tk.END, err_info) continue x = f'E_{e} compare {"pass" if cmp_res else "fail"}\n' print(x) # 把新结果追加到Text控件末尾 result_text.insert(tk.END, x) window = tk.Tk() window.title('XXX') window.geometry('1200x700') window.configure(background='Azure') fontExample = tkFont.Font(family="Segoe UI", size=20) fontExample2 = tkFont.Font(family="Segoe UI", size=10) fontExample3 = tkFont.Font(family="Segoe UI", size=15) header_label = tk.Label(window, text='XXXX',font=fontExample) header_label.pack() number_frame = tk.Frame(window) number_frame.pack(side=tk.TOP, pady=10) number_label = tk.Label(number_frame, text='Number of disks',font=fontExample2) number_label.pack(side=tk.LEFT, padx=5) number_entry = tk.Entry(number_frame) number_entry.pack(side=tk.LEFT) # 替换原来的Label为Text控件,支持滚动查看多行结果 result_text = tk.Text(window, font=fontExample3, width=80, height=20, bg='white', wrap=tk.WORD) result_text.pack(pady=10) calculate_btn = tk.Button(window, text='First calculate', command=gg,font=fontExample3) calculate_btn.pack(pady=5) window.mainloop()
如果你坚持用Label控件实现
只需要修改gg函数内的赋值逻辑,每次把新结果拼到原有内容后即可:
def gg(): # 先清空之前的结果 result_label.configure(text="") disk = number_entry.get() if disk == "2" : DIRS = [r'C:\Newtest\1', r'C:\Newtest\2', r'C:\Newtest\3',r'C:\Newtest\4',r'C:\Newtest\5',r'C:\Newtest\6',r'C:\Newtest\7',r'C:\Newtest\8',r'C:\Newtest\9',r'C:\Newtest\10'] FILES = [('copy1.txt', 'copy2.txt'), ('fcmp1.txt', 'fcmp2.txt'), ('filecp1.txt', 'filecp2.txt')] for e, dir in enumerate(DIRS, 1): cmp_res = True for file in FILES: try: if not filecmp.cmp(os.path.join(dir, file[0]), os.path.join(dir, file[1])): cmp_res = False break except Exception as ex: print(f'Error -> {ex}', file=sys.stderr) continue x = (f'E_{e} compare {"pass" if cmp_res else "fail"}\n') print(x) # 拼接新内容到原有内容末尾 old_text = result_label.cget("text") result_label.configure(text=old_text + x,wraplength=300,font=fontExample3)
内容的提问来源于stack exchange,提问作者Wu Ru
相关产品推荐
相关产品推荐

