ソケット データの受信と出力をループするスレッドがあります。
def post(self):
while True:
try:
data = pickle.loads(self.sock.recv(1024))
print data[0] % tuple(data[1])
except (socket.error, EOFError):
break
次に、次のように stdout を textctrl にリダイレクトする GUI を作成します。
import wx
import sys
import threading
class Redirect:
def __init__(self, ctrl):
self.out = ctrl
def write(self, string):
wx.CallAfter(self.out.AppendText,string)
class GUI(wx.Frame):
def __init__(self, parent):
self.monitor = wx.TextCtrl(self, wx.ID_ANY, \
style = wx.TE_MULTILINE | wx.TE_READONLY)
redir = Redirect(self.monitor)
sys.stdout = redir
self.sizer = BoxSizer(wx.VERTICAL)
self.sizer.Add(self.monitor, 1, wx.GROW | wx.ALL)
self.SetSizer(self.sizer)
self.Show(True)
if __name__ == "__main__":
app = wx.App(False)
frame = GUI(None)
app.MainLoop()
入力を受け入れる 2 つ目の textctrl もあります (簡単にするために省略しています)。問題は、CallAfter(AppendText,string) が文字列全体を出力しない場合があることです。非常にまれですが、文字列の途中で印刷が突然停止し、その時点で次の文字列が印刷されることがあります (そして、アプリは何も起こらなかったかのように、受信した文字列を印刷し続けます)。
2 番目の textctrl に入力して、それが原因かどうかを確認しようとしましたが、何もしなくても、これらの「部分的な印刷」が時々表示されます。どうしたの?