PyQt界面中用twisted建立server,pyqttwistedserver,这两天在看《Python


这两天在看《Python网络编程基础》,里面有一个聊天服务器的例子,想给它增加一个界面,但是发现twisted会堵塞主线程。google了一下,发现可以用qt4reactor,试了试,还真行。

当然,这个demo的界面是很简陋的!

参考文献:http://twistedmatrix.com/trac/wiki/QTReactor

#!/usr/bin/env python# -*- coding:utf-8 -*-from PyQt4 import QtGuiimport sys, qt4reactorqt4reactor.install()app = QtGui.QApplication(sys.argv)from twisted.internet.protocol import Factoryfrom twisted.protocols.basic import LineOnlyReceiverfrom twisted.internet import reactorclass Core(LineOnlyReceiver):  #or class Core(Protocol):    def getId(self):        return str(self.transport.getPeer())    def connectionMade(self):        self.factory.window.protocol = self        self.factory.addClient(self)        self.log('New User Login:%s!' % self.getId())    def connectionLost(self, reason):        self.log('%s disconnected!' % str(self.transport.client))        self.factory.delClient(self)    def dataReceived(self, data):        msg = "%s:%s" % (self.transport.client[0], data)        self.factory.sendAll(msg)        self.log(msg)    def log(self, msg):        self.factory.window.sendMessage(msg)class CoreFactory(Factory):    protocol = Core    def __init__(self, window):        self.window = window        self.clients = []    def addClient(self, client):        self.clients.append(client)    def delClient(self, client):        self.clients.remove(client)    def sendAll(self, data):        for x in self.clients:            x.transport.write(data)class Frame(QtGui.QFrame):    def __init__(self):        super(Frame, self).__init__()        self.btn_listen = QtGui.QPushButton(u'侦听', self)        self.btn_listen.clicked.connect(self.btn_listen_click)        self.btn_stop = QtGui.QPushButton(u'停止', self)        self.btn_stop.clicked.connect(self.btn_stop_click)        self.btn_radio = QtGui.QPushButton(u"广播", self)        self.btn_radio.clicked.connect(self.btn_radio_click)        self.text_port = QtGui.QLineEdit("1250", self)        self.text_msg = QtGui.QLineEdit("hello", self)        self.view = QtGui.QTextEdit(self)        layout = QtGui.QGridLayout()        layout.addWidget(self.text_port, 0, 0)        layout.addWidget(self.btn_listen, 0, 1)        layout.addWidget(self.btn_stop, 0, 2)        layout.addWidget(self.view, 1, 0, 1, 0)        layout.addWidget(self.text_msg, 2, 0)        layout.addWidget(self.btn_radio, 2, 1, 1, 2)        self.setLayout(layout)        self.core_factory = CoreFactory(self)        self.protocol = None    def sendMessage(self, msg):        self.view.append(msg)    def btn_listen_click(self):        port = int(self.text_port.text())        reactor.listenTCP(port, self.core_factory)        print "start running..."        reactor.run()    def btn_stop_click(self):        reactor.stop()    def btn_radio_click(self):        msg = str(self.text_msg.text())        self.core_factory.sendAll(msg)    def closeEvent(self, event):        print('Attempting to close the main window!')        self.btn_stop_click()        event.accept()if __name__ == '__main__':    frm = Frame()    frm.show()    sys.exit(app.exec_())#该片段来自于http://byrx.net

评论关闭