Форум сайта python.su
Нужна вваша помощь, есть следующая задумка: серверный скрипт, при получении сообщения должен показать его на экране монитора, для этого воспользовался wx модулем. Но при этом возникает следующая проблема, пока не закроешь окно с сообщением, новое не появится. Эту проблем я решил запуском функции отображения окна в отдельном потоке, но порожденном из другого потока который слушает и получает текстовые сообщения от клиента. В принципе все заработало как надо, но Винду, в отличии от Убунту, этот сценарий не устраивает и она сообщает:
python.exe - обнаружена ошибка. Приложение будет закрыто. Приносим извинения за неудобства., а
В общем, как можно решить эту проблему?
Серверный скрипт:
#!/usr/bin/python #-*- coding: UTF-8 -*- import os, sys, time, wx, socket, threading def show_mes(text): #создаем окно с текстовым сообщением class InsertFrame(wx.Frame): def __init__(self, parent, id=-1): wx.Frame.__init__(self, parent, id, 'Server info',pos=(1480,1070), size=(370, 80), style=(wx.DEFAULT_FRAME_STYLE ^ (wx.RESIZE_BORDER | wx.MINIMIZE_BOX | wx.MAXIMIZE_BOX | wx.SIMPLE_BORDER))) panel = wx.Panel(self) info = text.decode('utf-8') pnl = wx.Panel(self, -1, size=(370, 80), style=wx.NO_BORDER) st1 = wx.TextCtrl(pnl, -1, info, size=(370, 80), style=wx.ALIGN_LEFT | wx.TE_WORDWRAP | wx.TE_READONLY | wx.TE_RICH2) #st1.SetBackgroundColour("Yellow") def OnCloseMe(self, event): self.Close(True) def OnCloseWindow(self, event): self.Destroy() if __name__ == '__main__': app = wx.PySimpleApp() frame = InsertFrame(parent=None, id=-1) frame.Show() app.MainLoop() class MyThread(threading.Thread): def run (self): show_mes(text) class GetTextThread(threading.Thread): def run (self): get_text() def get_text(): #получам сообщение от клиента global text while True: conn, addr = s.accept() text = conn.recv(1448) conn.close() #создаем новый поток для вывода окна с сообщением #иначе функция ожидает закрытия окна thrd = MyThread() thrd.start() s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind(('', 3036)) s.listen(300) get_text_thread = GetTextThread() get_text_thread.start()
import os, socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('127.0.0.1', 3036)) s.sendall("some info") s.close()
Отредактировано nauman (Окт. 26, 2012 12:38:49)
Офлайн