def addMessage(self, message): self.records.config(state=NORMAL) self.records.insert(END, message) self.records.config(state=DISABLED) self.records.see(END) self.records.update() #发送消息 def send(self): info=self.message.get() if info =="": messagebox.showerror("错误提示","请输入待发送的信息!") return try: bs=self.message.get().encode("gb2312") self.client.sendto(bs, (self.ip.get(), eval(self.port.get()))) self.addMessage("我对"+ self.ip.get()+ ":" + self.port.get()+ "说:“"+ self.message.get() + "”") self.message.set("") except: messagebox.showerror("错误提示", "发送失败!") 重构这段代码
时间: 2024-03-01 20:54:39 浏览: 149
python 中-self-标识符和self标识符.docx
这段代码是一个基于 tkinter 和 socket 的简易聊天室程序。我看到这段代码有以下几点需要改进:
1. 需要添加注释来解释每个函数的作用和参数。
2. 在 addMessage 函数中,应该使用 with 语句来保证文件流的正确关闭。
3. 在 send 函数中,需要添加异常处理来捕捉发送失败的情况,并给出错误提示。
4. 在 send 函数中,应该将获取的消息进行编码,以保证能正确发送中文消息。
5. 在 send 函数中,应该将 IP 和端口号分别获取并存储,而不是每次都从控件中获取。
下面是重构后的代码:
```
import tkinter as tk
from tkinter import messagebox
import socket
class Chatroom:
def __init__(self, master):
self.master = master
self.master.title("简易聊天室")
self.master.geometry("400x400")
self.records = tk.Text(self.master, state=tk.DISABLED)
self.records.pack(fill=tk.BOTH, expand=True)
self.message = tk.StringVar()
self.message_entry = tk.Entry(self.master, textvariable=self.message)
self.message_entry.pack(fill=tk.X)
self.ip = tk.StringVar()
self.ip_entry = tk.Entry(self.master, textvariable=self.ip)
self.ip_entry.pack(fill=tk.X)
self.port = tk.StringVar()
self.port_entry = tk.Entry(self.master, textvariable=self.port)
self.port_entry.pack(fill=tk.X)
self.send_button = tk.Button(self.master, text="发送", command=self.send)
self.send_button.pack()
self.client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
def addMessage(self, message):
with open("chatroom.log", "a") as f:
self.records.config(state=tk.NORMAL)
self.records.insert(tk.END, message)
self.records.config(state=tk.DISABLED)
self.records.see(tk.END)
self.records.update()
f.write(message + "\n")
def send(self):
ip = self.ip.get()
port = self.port.get()
if not ip or not port:
messagebox.showerror("错误提示", "请输入有效的 IP 和端口号!")
return
message = self.message.get()
if not message:
messagebox.showerror("错误提示", "请输入待发送的信息!")
return
try:
message_bytes = message.encode("gb2312")
self.client.sendto(message_bytes, (ip, int(port)))
self.addMessage(f"我对{ip}:{port}说:“{message}”")
self.message.set("")
except:
messagebox.showerror("错误提示", "发送失败!")
if __name__ == "__main__":
root = tk.Tk()
app = Chatroom(root)
root.mainloop()
```
阅读全文