这是聊天服务器中客户端的代码,包括在python中使用Tkinter
创建的GUI。
问题是当我发送消息一次然后有无限循环运行并且不允许我发送另一条消息。请告诉我这里有什么问题。
from Tkinter import *
import socket#for sockets
import sys #for exit
import tkMessageBox
blue ="#000fff000"
root = Tk()
frame = Frame(root)
frame.pack()
root.geometry("500x500")
e=NONE
# create dgram udp socket
try:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
except socket.error:
print 'Failed to create socket'
sys.exit()
host = 'localhost';
port = 40019;
def sendmsg():
global e
e = Entry(frame ,width=50 )
e.pack(side=RIGHT)
e.focus_set()
b = Button(frame, text="send", width=10, command=callback ,bg =blue)
b.pack(side=LEFT)
mainloop()
text = e.get()
def callback():
print e.get()
msg=str(e.get())
e.delete(0, END)
while(1):
text_area.insert(END,msg)
try:
#Set the whole string
while(1):
s.sendto(msg, (host, port))
# receive data from client (data, addr)
d = s.recvfrom(1024)
reply = d[0]
addr = d[1]
print 'Server reply : ' + reply
text_area.insert(END,reply)
except socket.error, msg:
print 'Error Code : ' + str(msg[0]) + ' Message ' + msg[1]
sys.exit()
menubar = Menu(root)
filemenu = Menu(menubar, tearoff=0)
filemenu.add_command(label="SEND A MESSAGE", command=sendmsg)
filemenu.add_separator()
filemenu.add_command(label="Exit", command=sys.exit)
menubar.add_cascade(label="SEND", menu=filemenu)
root.config(menu=menubar)
frame=Frame(root)
frame.pack()
text_area = Text(frame)
text_area.pack(side=BOTTOM)
B1 = Button(root, text = "CLOSE", command = sys.exit)
B1.pack(side =TOP)
root.mainloop()
答案 0 :(得分:0)
在任何窗口系统中,您必须定期处理窗口系统事件。这意味着在工作线程上使用非阻塞I / O或执行netowork I / O.您可能还需要注意从工作线程更新UI窗口,以便像扭曲这样将各种事件源集成到一个事件处理循环中的框架可以帮助保持工作和简单。
用于集成网络和Tkinter的基于线程的方案的一个很好的例子是this recipe。请注意,当UI线程准备好处理它时,工作线程将通过从UI线程轮询来处理数据。
我认为twisted包是处理这个问题的好方法,因为这更像是Tcl的文件事件,它将I / O事件集成到与UI事件相同的事件系统中。