2012-08-13 63 views
0

我正在使用wxPython编写简单的IRC服务器和客户端GUI。在我的应用程序中,我运行了两个线程:一个用于GUI,另一个用于发送和接收信息所需的套接字连接。到目前为止,我相信我已成功通过客户端应用程序连接到服务器,但我看不到任何消息已处理。我尝试使用我的客户端与另一个TCP侦听器应用程序,我能够成功发送消息。我相信问题在于我设置GUI的方式。这里是我的服务器端应用程序(道歉任何尴尬的间距)(Python)在多线程IRC GUI中动态追加文本

我有一种感觉问题出在启动中的代码()函数..

#!/usr/bin/python 

import wx 
import socket 
import threading 
from threading import Thread 

ip = "" 
port = 0 
backlog = 5 

chatText = "" 

class relayServerGUI(wx.Frame): 
def __init__(self, parent, id): 
    wx.Frame.__init__(self, parent, id, "Enter IP address", size = (600, 600)) 
    orciPanel = wx.Panel(self) 
    relayChat = wx.TextCtrl(orciPanel, 0, chatText, (50, 50), (500, 500),style    = wx.TE_MULTILINE) 
    portInput = wx.TextEntryDialog(None, "Enter Port: ", "") 
    if portInput.ShowModal() == wx.ID_OK: 
     global port 
     port = int(portInput.GetValue()) 
     thread2()  

def relayInterpretor(): 
    socketRelay = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    socketRelay.bind((ip, port)) 
    socketRelay.listen(backlog) 
    client, address = socketRelay.accept() 

    while 1: 
        relayData = client.recv(1024) 
        global chatText 
        chatText += (relayData) 
        client.send(relayData) 


def bootUP(): 
if __name__ == "__main__": 
    relayApplication = wx.PySimpleApp() 
    relayFrame = relayServerGUI(parent = None, id = -1) 
    relayFrame.Show() 
    relayApplication.MainLoop() 

    while 1: 
     relayChat.Clear() 
     relayChat.AppendText(chatText) 

Thread(target = bootUP).start() 
def thread2(): 
    Thread(target = relayInterpretor).start() 

编辑:relayChat是其中的消息会,理想地显示。我将它设置为复制chatText,一个全局字符串变量,所以我不必深入研究交叉线程。

回答

0

我不是很流利的wx,但我认为这个问题不是非常明确的wx相关反正。我在这里看到两个可能的问题。

首先,您在线程之间共享字符串以将文本与relayChat小部件进行通信,这通常是非常糟糕的方法。应该有一种方法让你在线程中发出一个wx事件,这样事件循环就会在主线程中选择它并运行一个处理程序来更新小部件。

其次,事件循环...

relayApplication.MainLoop() 

这是一个阻塞调用。您的应用程序进入事件循环,所以没有得到执行这下面的代码:

while 1: 
    relayChat.Clear() 
    relayChat.AppendText(chatText) 

同样,这种关系回到第一点。当线程中的套接字接收到一些数据时,它应该发出一个包含该数据的事件,因此主GUI线程可以正确地调用将附加到您的小部件的处理程序。

更新

引用如何发出自定义的WX事件this question,你也许可以修复它是这样的:

from wx.lib.newevent import NewEvent 

ChatTextEvent, EVT_CHATTEXT = NewEvent() 

class relayServerGUI(wx.Frame): 
    def __init__(self, parent, id): 
     ... 
     # make sure to save a ref to your chat widget 
     self.relayChat = wx.TextCtrl(orciPanel, 0, chatText, (50, 50), (500, 500),style    = wx.TE_MULTILINE) 
     self.Bind(EVT_CHATTEXT, self.newChatTextEvent) 
     ... 
     thread2(self) 

    def newChatTextEvent(self, event): 
     self.relayChat.AppendText(event.data) 


def relayInterpretor(wxObject): 
    ... 
    while 1: 
     ... 
     # wxObject needs to be an instance of relayServerGUI 
     wx.PostEvent(wxObject, ChatTextEvent(data=relayData)) 

def thread2(wxObject): 
    Thread(target = relayInterpretor, args=(wxObject,)).start()  

*注:我不是对语法的100%。试试看。它可能需要稍微调整。

+0

我认为这是一种糟糕的做法,但我对这门语言仍然很陌生,这是我所能抛弃的一切:\如何处理接收数据时创建的事件? – PL43 2012-08-13 03:54:01

+0

尝试更新。 – jdi 2012-08-13 04:10:43

+0

嗯试了一下,并尝试了一下语法,但主要得到这个错误:AttributeError:'relayServerGUI'对象没有属性'newChatTextEvent' – PL43 2012-08-13 04:22:27