реализация витой с интерфейсом tkinter - PullRequest
2 голосов
/ 15 февраля 2012

Я работал над созданием простой программы обмена мгновенными сообщениями и хочу, чтобы с ней был пользовательский интерфейс, чтобы было легче работать.Я хорошо знаю, как использовать tkinter, поэтому я хочу, чтобы пользовательский интерфейс был tkinter, но я новичок в витой и понимаю его основы, но я не знаю, как внедрить его в пользовательский интерфейс.Это моя попытка, я долго искал в Интернете, но не смог найти ничего похожего на то, что я пытаюсь сделать.Основная проблема, с которой я столкнулся ранее, - это запуск реакторов при попытке прослушивания и отправки сообщений.Одна из моих предыдущих программ могла просто получать сообщения, но не отправлять их обратно, поэтому это основная проблема, которую я пытаюсь решить.Заранее большое спасибо.

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()

1 Ответ

1 голос
/ 15 февраля 2012
  • 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, чтобы получить всю строку сразу.Эти методы получают байты, которые необходимо декодировать в Unicode перед передачей в виджеты пользовательского интерфейса.

  • вы отправляете на порт 1234, но сервер прослушивает 8000.Возможно, вы хотели использовать тот же номер порта здесь

В вашем коде есть другие проблемы.

...