Python 使用readline()从终端发送东西很好,但是我无法理解。Dewzy,你能把你的程序精简到一个最小的例子来说明什么不起作用吗?还有,到底是什么不起作用?好吧,我清理了代码。这是我的困境。有了这个代码,如果我把东西输入终端,它就可以正常工作。GUI显示代码
Python 使用readline()从终端发送东西很好,但是我无法理解。Dewzy,你能把你的程序精简到一个最小的例子来说明什么不起作用吗?还有,到底是什么不起作用?好吧,我清理了代码。这是我的困境。有了这个代码,如果我把东西输入终端,它就可以正常工作。GUI显示代码,python,sockets,tkinter,Python,Sockets,Tkinter,使用readline()从终端发送东西很好,但是我无法理解。Dewzy,你能把你的程序精简到一个最小的例子来说明什么不起作用吗?还有,到底是什么不起作用?好吧,我清理了代码。这是我的困境。有了这个代码,如果我把东西输入终端,它就可以正常工作。GUI显示代码,服务器接收代码。但是,如果我尝试在条目中键入任何内容并按enter键,则什么也不会发生。我仍然可以输入到终端,这仍然会发送到服务器,但Tkinter条目不会发生任何变化。我无法将Tkinter输入字段添加到select中,因为它不是具有fil
使用readline()从终端发送东西很好,但是我无法理解。Dewzy,你能把你的程序精简到一个最小的例子来说明什么不起作用吗?还有,到底是什么不起作用?好吧,我清理了代码。这是我的困境。有了这个代码,如果我把东西输入终端,它就可以正常工作。GUI显示代码,服务器接收代码。但是,如果我尝试在条目中键入任何内容并按enter键,则什么也不会发生。我仍然可以输入到终端,这仍然会发送到服务器,但Tkinter条目不会发生任何变化。我无法将Tkinter输入字段添加到
select
中,因为它不是具有fileno
方法的套接字或类似文件的对象。这有意义吗?fwiw,这在windows上不起作用,因为它缺少createfilehandler
。
import socket, select, threading, Queue, cPickle
from Tkinter import *
from Message import *
class GUI(Frame):
def __init__(self, host="localhost",port=5678, root="Tk()"):
Frame.__init__(self,root)
self.nickname = raw_input("What is your screen name? ")
self.inqueue = Queue.Queue()
self.outqueue = Queue.Queue()
self.root = root
self.text = Text(self,height=10,width=40)
self.scroll=Scrollbar(self)
self.text.configure(yscrollcommand=self.scroll.set)
self.scroll.grid(row=0, column=1, sticky=N+S)
self.scroll.config(command=self.text.yview)
self.text.grid(row=0,column=0)
self.entry = Entry(self)
self.entry.grid(row=1,column=0)
self.pack()
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.connect((host, port))
self.sock.send(self.nickname)
self.thread1=threading.Thread(target=self.cmdloop)
self.thread1.start()
self.entry.bind("<Return>",self.enter)
self.call()
def enter(self,event):
msg = Message(self.nickname,0,self.entry.get())
self.entry.delete(0, END)
msg = cPickle.dumps(msg)
self.inqueue.put(msg)
self.sock.send(msg)
def call(self):
self.processData()
self.after(100,self.call)
def cmdloop(self):
while 1:
sys.stdout.flush()
# Wait for input from stdin & socket
inputs, outputs, excepts = select.select([0,self.sock],[],[])
for i in inputs:
if i == 0:
data = sys.stdin.readline()
msg = Message(self.nickname,0,data)
msg = cPickle.dumps(msg)
self.inqueue.put(msg)
self.sock.send(msg)
elif i == self.sock:
data = self.sock.recv(1024)
self.inqueue.put(data)
def processData(self):
while self.inqueue.qsize():
try:
msg = self.inqueue.get(0)
msg = cPickle.loads(msg)
self.text.insert(END, msg.getusr()+": "+msg.getmsg())
self.text.yview(END)
except Queue.Empty:
pass
if __name__ == "__main__":
root = Tk()
root.title("textarea")
client = GUI(sys.argv[1],int(sys.argv[2]),root)
root.mainloop()
from Tkinter import *
import socket
master = Tk()
entry = Entry(master)
entry.pack()
def process(data):
print "processing: {0}".format(data)
def stdin_callback(fd, mask):
print "stdin"
data = sys.stdin.readline()
process(data[:-1])
def socket_callback(fd, mask):
print "socket"
try:
data= sock.recv(1024)
if data:
process (data)
else:
close_socket ()
except socket.error as ex:
close_socket ()
def close_socket():
#closing socket without removing filehandler may hurt
sock.close()
master.deletefilehandler(fileno)
def entry_callback(event):
print "entry"
process(event.widget.get())
entry.bind("<Return>", entry_callback)
master.createfilehandler(sys.stdin,READABLE, stdin_callback)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("localhost", 5678))
fileno = sock.fileno()
master.createfilehandler(fileno, READABLE, socket_callback)
master.mainloop()
def cmdloop():
(sread, swrite, sexc) = select.select( [sock], [], [], 0)
for s in sread:
...
...
...
app.after(500,cmdloop)
def sendMsg(event=''):
message = inputBox.get()
message += "\n"
msg = Message(nickname,0,message,None) #Custom Class
sock.send(pickle.dumps(msg))
inputBox.delete(0,END)
return