我一直致力于制作一个简单的即时消息程序,并希望有一个用它的ui,以便更容易使用。我知道如何很好地使用tkinter,这就是为什么我希望ui成为tkinter,但我是新的扭曲,并了解它的基础知识,但我不知道如何将它实现到ui。这是我的尝试,我已经在网上搜索了很长时间,但无法找到任何类似于我想做的事情。我之前遇到的主要问题是在尝试收听和发送消息时跑到反应堆。我之前的一个程序能够收到消息但不发送回来,所以这是我试图解决的主要问题。非常感谢你提前。
from twisted.internet.protocol import Protocol, Factory
from twisted.internet.endpoints import TCP4ClientEndpoint
from twisted.internet import tksupport, reactor, protocol
from Tkinter import *
class UI:
def __init__(self, master):
# set up start of screen
self.root = master
# set up frame
self.frame = Frame(self.root, width=250, height=325)
self.frame.pack_propagate(0)
self.frame.pack()
# set up Message box
self.message_box = Text(self.frame, height=15, width=25, bg='white', bd=5, relief=RIDGE, state='disabled')
self.message_box.pack(side=TOP)
# set up entry box
self.entry_box = Text(self.frame, height=2, width=25, bg='white', bd=5, relief=RIDGE)
self.entry_box.bind('<Return>', self.send_message)
self.entry_box.pack(side=BOTTOM)
# set up label
self.label = Label(self.frame, text='Enter a message')
self.label.pack(side=BOTTOM)
def send_message(self, event):
message = self.entry_box.get(1.0, END)
self.entry_box.delete(1.0, END)
point = TCP4ClientEndpoint(reactor, "localhost", 1234)
d = point.connect(GreeterFactory())
d.sendMessage(message)
class Greeter(Protocol):
def sendMessage(self, msg):
self.transport.write(msg)
class GreeterFactory(Factory):
def buildProtocol(self, addr):
return Greeter()
class Listen(protocol.Protocol):
def dataReceived(self, data):
message = str(data)
ui.message_box.config(state='normal')
ui.message_box.insert(END, '%s\n' %(message))
ui.message_box.config(state='disabled')
# start UI
root = Tk()
root.tk_bisque()
root.title('Client Messager')
root.resizable(width=FALSE, height=FALSE)
ui = UI(root)
tksupport.install(root)
# start listneing
factory = protocol.ServerFactory()
factory.protocol = Listen
reactor.listenTCP(8000,factory)
reactor.run()
答案 0 :(得分:1)
point.connect()
返回延迟的,而不是协议实例。如果您运行代码,则会在d.sendMessage(message)
上引发异常:
d.addCallback(lambda p: p.sendMessage(message))
transport.write()
需要字节,而不是Unicode字符串:
self.transport.write(msg.encode('utf-8'))
Listen.dataReceived()
一次只能收到部分消息。您可以使用LineReceiver.lineReceived
来获取整行。这些方法接收在传递给UI小部件之前应将它们解码为Unicode的字节。
您发送到1234
端口,但服务器侦听8000
。你可能想在这里使用相同的端口号
您的代码中还有其他问题。