Skip to main content
 首页 » 编程设计

python之使用 tkinter UI 实现扭曲

2025年05月04日22unruledboy

我一直致力于制作一个简单的 IM 程序,并希望有一个 ui 以使其更易于使用。我知道如何很好地使用 tkinter,所以这就是为什么我希望 ui 成为 tkinter,但我是扭曲的新手,并且了解它的基础知识,但我不知道如何将它实现到 ui 中。这是我的尝试,我在网上搜索了很长时间,但找不到任何类似的东西来做我想做的事情。我之前遇到的主要问题是在尝试收听和发送消息时遇到 react 堆。我以前的一个程序只能接收消息但不能发回消息,所以这是我要解决的主要问题。非常感谢您。

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

请您参考如下方法:

  • point.connect() 返回一个延迟实例,而不是协议(protocol)实例。如果您运行代码,它会在 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 上监听。您可能打算在此处使用相同的端口号

您的代码中还有其他问题。