读书人

请问一个关于wxpython Thread的有关问

发布时间: 2013-09-28 10:01:20 作者: rapoo

请教一个关于wxpython Thread的问题
大家好,最近在学习wxpython,现在想做个东西,服务器与客户端建立是socket通信,客户端给服务器发送一个命令,在服务器端执行一系列过程,客户端将服务器端的执行信息打印在客户端的界面上,信息是根据服务器端的执行情况动态显示的,该如何实现?如果存在多个并行服务器,又应该如何处理?谢谢
现在建立socket通信已经实现,发送命令和返回信息也能实现。
[解决办法]
工作线程(非ui线程)调用wx.CallAfter以发消息方式更新界面,不要主动调用其他ui函数,不然程序会崩溃...
[解决办法]
WorkerThread似乎多余无用,适度改写autotest里的输出语句,直接在gui里调用即可。下面是一个简单代码,起10个线程不停滴回显数据在图形界面上。貌似python或者wx的日志模块都适合你这个场景,看看相关帖子:http://bbs.csdn.net/topics/390381049

import wx
import threading
import time
import random
from datetime import datetime

def worker(n, log):
i = 0
while 1:
time.sleep(random.uniform(1, 10))
msg = "echo %d from Thread #%d" % (i, n)
log.write(msg)
i += 1

class MyFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None)
self.textctrl = wx.TextCtrl(self, style=wx.TE_MULTILINE)
self.run()

def write(self, msg):
stamp = datetime.now().strftime('%H:%M:%S.%f')[:-3]
msg = stamp + ': ' + msg.rstrip() + '\n'
wx.CallAfter(self.textctrl.AppendText, msg)

def run(self):
for i in range(10):
t = threading.Thread(target=worker, args=(i+1, self))
t.daemon =True
t.start()

app = wx.App(False)
frame = MyFrame()
frame.Show()
app.MainLoop()

[解决办法]
界面无响应,一般应该是gui线程里有不当的阻塞式调用...
[解决办法]
前面是说检查gui线程是否阻塞,跟其他工作线程无关,不需要把socket改成非阻塞。若是工作线程真的有问题没有获得数据,不可以说成界面无响应。所以,最好是上代码说明问题吧...
[解决办法]
time.sleep(3)应该注释掉,gui里忌讳这样的阻塞调用,界面将失去响应。如果非要在这3秒后输出某些信息,启用一个计时器来做这工作。

另外,每条if里重复调用GetValue()两次是不是换个写法,设定档貌似绑定窗口关闭事件做一次即可,这样代码逻辑较清楚简洁一些...
[解决办法]
不知道为啥cmd下执行会有问题,你直接打python回车,看看是不是进入交互状态,以及看看一开始显示出的版本信息。需要引用其他模块不在默认位置的话,你可以把模块所在路径添入系统环境变量PYTHONPATH里,或者代码里显式sys.path.append(模块路径),然后再import这个模块...

读书人网 >perl python

热点推荐