2012-02-14 4 views
2

私は簡単なIMプログラムを作成していて、使いやすくするためのUIが必要です。私はtkinterをうまく使う方法を知っています。だから私はuiをtkinterにしたいのですが、私はひねりを新しいものにして、その基本を理解していますが、私はそれをUiに実装する方法がわかりません。これは私の試みですが、私は長い間オンラインで検索していますが、私がしようとしていることをするために何かsimmilarを見つけることができませんでした。私が先に実行していた主な問題は、メッセージを聞いて送信しようとするときに、原子炉に走っていたことでした。私の以前のプログラムの1つは、メッセージを受信するだけでしたが返信することはできませんでした。それが私が修正しようとしている主な問題です。事前にどうもありがとうございました。tkinterのUIでtwistedを実装しています

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
  • 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を受信します。おそらく、ここで同じポート番号を使用するつもりです

コードには他にも問題があります。

関連する問題