import socket import struct import tkinter as tk import threading from udpmsg import * from datetime import datetime from tkinter import font, filedialog from tkinter import Frame from tkinter.ttk import * class logWin(Frame): def __init__(self, root): super().__init__(root) self.root = root custom_font = font.Font(family="Arial", size=8) # 设置 state 为 tk.DISABLED 禁用编辑功能 self.text_box = tk.Text(root, height=10, width=50, font=custom_font, state=tk.DISABLED) self.text_box.grid(row=0, column=0, columnspan=2, sticky='nsew') # 创建垂直滚动条 scrollbar = tk.Scrollbar(root, command=self.text_box.yview) scrollbar.grid(row=0, column=2, sticky='ns') # 将滚动条与 Text 组件关联 self.text_box.config(yscrollcommand=scrollbar.set) # 创建保存按钮 save_button = tk.Button(root, text="保存日志", command=self.save_log) save_button.grid(row=1, column=0, sticky='ew') # 创建清空按钮 clear_button = tk.Button(root, text="清空日志", command=self.clear_log) clear_button.grid(row=1, column=1, sticky='ew') # 配置行和列的权重,使组件能够随窗口大小变化而调整 root.grid_rowconfigure(0, weight=1) root.grid_columnconfigure(0, weight=1) root.grid_columnconfigure(1, weight=1) def display_log(self, log_message): # 启用编辑功能 self.text_box.config(state=tk.NORMAL) # 将日志信息添加到 Text 组件中 self.text_box.insert(tk.END, log_message + "\n") # 滚动到 Text 组件的底部,以显示最新的日志信息 self.text_box.see(tk.END) # 禁用编辑功能 self.text_box.config(state=tk.DISABLED) def save_log(self): # 打开文件选择对话框 file_path = filedialog.asksaveasfilename(defaultextension=".txt", filetypes=[("Text Files", "*.txt"), ("All Files", "*.*")]) if file_path: # 获取文本框中的内容 log_content = self.text_box.get("1.0", tk.END) # 将内容写入文件 with open(file_path, "w") as file: file.write(log_content) # 显示保存成功的提示 tk.messagebox.showinfo("保存成功", "日志已成功保存到文件。") def clear_log(self): # 启用编辑功能 self.text_box.config(state=tk.NORMAL) # 清空 Text 组件中的内容 self.text_box.delete("1.0", tk.END) # 禁用编辑功能 self.text_box.config(state=tk.DISABLED) if __name__ == "__main__": root = tk.Tk() root.title("能源管理系统调试") log_win = logWin(root) # 假设您有一个日志消息需要显示 for i in range(100): log_win.display_log("这是一条日志信息" + str(i)) root.mainloop()