Python 用tkinter UI实现twisted

Python 用tkinter UI实现twisted,python,tkinter,twisted,Python,Tkinter,Twisted,我一直在做一个简单的即时通讯程序,并希望有一个与它的用户界面,使其更容易工作。我知道如何很好地使用tkinter,这就是为什么我希望ui是tkinter,但是我对twisted是新手,并且了解它的基础知识,但是我不知道如何将它实现到ui中。这是我的尝试,我在网上搜索了很长一段时间,但找不到任何类似的东西来做我想做的事情。我之前遇到的主要问题是,在尝试监听和发送消息时,必须运行到反应堆。我以前的一个程序只能接收消息,但不能将它们发送回,所以这是我试图解决的主要问题。事先非常感谢 from twis

我一直在做一个简单的即时通讯程序,并希望有一个与它的用户界面,使其更容易工作。我知道如何很好地使用tkinter,这就是为什么我希望ui是tkinter,但是我对twisted是新手,并且了解它的基础知识,但是我不知道如何将它实现到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()
来自twisted.internet.protocol导入协议,工厂
从twisted.internet.endpoints导入TCP4ClientEndpoint
从twisted.internet导入tksupport、reactor、protocol
从Tkinter进口*
类用户界面:
定义初始(自我,主):
#设置启动屏幕
self.root=master
#架
self.frame=frame(self.root,宽度=250,高度=325)
self.frame.pack_传播(0)
self.frame.pack()
#设置消息框
self.message_box=文本(self.frame,高度=15,宽度=25,bg='white',bd=5,浮雕=RIDGE,状态='disabled')
自我信息盒包装(侧面=顶部)
#设置输入框
self.entry_box=文本(self.frame,高度=2,宽度=25,bg='white',bd=5,浮雕=RIDGE)
self.entry\u box.bind(“”,self.send\u message)
自进箱包装(侧面=底部)
#设置标签
self.label=label(self.frame,text='Enter a message')
self.label.pack(侧面=底部)
def发送消息(自身、事件):
message=self.entry\u box.get(1.0,结束)
自输入框删除(1.0,结束)
point=TCP4ClientEndpoint(reactor,“localhost”,1234)
d=点连接(GreeterFactory())
d、 发送消息(消息)
迎宾员(礼宾):
def sendMessage(自我,消息):
self.transport.write(msg)
等级迎宾工厂(工厂):
def构建协议(自身、地址):
回程迎宾员()
类侦听(protocol.protocol):
接收到def数据(自身、数据):
message=str(数据)
ui.message\u box.config(state='normal')
ui.message_box.insert(结束,'%s\n'(消息))
ui.message\u box.config(state='disabled')
#启动用户界面
root=Tk()
root.tk_bisque()
root.title('Client Messager')
根。可调整大小(宽度=假,高度=假)
ui=ui(根)
tksupport.install(根目录)
#开始列表
factory=protocol.ServerFactory()
factory.protocol=侦听
反应堆listenTCP(8000,工厂)
反应堆运行()
  • point.connect()
    返回延迟的,而不是协议实例。如果您运行代码,它会在
    d.sendMessage(message)
    上引发异常:

  • transport.write()
    需要字节,而不是Unicode字符串:

    self.transport.write(msg.encode('utf-8'))
    
  • Listen.dataReceived()
    一次只能接收部分消息。您可以使用
    LineReceiver.lineReceived
    一次获取整行。这些方法接收字节,在传递到UI小部件之前,您应该将它们解码为Unicode

  • 您发送到
    1234
    端口,但服务器监听
    8000
    。您可能想在这里使用相同的端口号

代码中还有其他问题

self.transport.write(msg.encode('utf-8'))