2013-08-20 6 views
1

로그 창 (textctrl 상자)에 쓸 필요가있는 여러 스레드를 사용하는 wxpython 응용 프로그램을 작성했습니다. 이 때문에 나는이 튜토리얼 pyinstaller exe with pubsub

http://www.blog.pythonlibrary.org/2010/05/22/wxpython-and-threads/

을 따라 wx.CallAfter 및 PubSub를 사용했다.

이 코드는 훌륭하게 일을하고 내 코드에 대한 EXE 파일을 만들 pyInstaller 중에 사용하기 쉬운 것이라고 생각

from wx.lib.pubsub import Publisher 

Publisher().subscribe(self.messenger, "update") 

wx.CallAfter(Publisher().sendMessage, "update", "Thread finished!") 

def messenger(self, msg): 
    self.logtxtctrl.WriteText(msg.data) 

내 원래의 코드이었다.

내가 얼마나 잘못 했습니까!

그래서 지금이

http://wiki.wxpython.org/WxLibPubSub

를 사용하여, pubSub의 API의 두 가지 버전이있는 것 같습니다 어떤 의견을 읽은 후 나는이 코드는 지금 작동 다음

from wx.lib.pubsub import setuparg1 

from wx.lib.pubsub import pub 

pub.subscribe(self.messenger, "update") 

wx.CallAfter(pub.sendMessage, "update", data="Program success") 

def messenger(self, data): 
    self.logtxtctrl.WriteText(data) 

에 내 코드를 쥐게 다시 pyinstaller를 사용하려고 시도했지만 여전히 운이 없었습니다.

그래서 난 후 매우 유용했다 둘의 다음 문서

How to get pubsub to work with pyinstaller?

http://www.pyinstaller.org/ticket/312

를 읽고 난 아직도, 후크 파일과 다른 사양 파일을 변경하는 모든 다른 변화를 시도 그것을 작동시키지 못한다.

이 게시물은 거의 2 년 전입니다. 나는 pubsub를 추가하는 것이 해결 될 것이라고 생각했습니다.

누구나 내가 필요로하는 바늘, 사양 파일에 무엇이 있어야하는지, 그리고 내가 작동하도록해야 할 다른 요소를 어떻게 설명 할 수 있습니까?

해결 방법이 없다면 스레드 안전 통신을 위젯에 다른 방법으로 수행 할 수 있습니까?

답변

0

난 당신이 찾고있는 정확하게 수행하는 프로그램이

from wx.lib.pubsub import setupkwargs 
from wx.lib.pubsub import pub 

을보십시오. 내가 사용하는 관련 코드 조각은 다음과 같습니다. WriteText를 사용하는 것보다 Logger과 같은 함수를 만드는 것이 좋을 것입니다. 변경 사항이 적용될 때까지 고통을 덜어 줬습니다.

class Frame(wx.Frame): 
    def __init__(self, *args, **kwargs): 
     super(Frame, self).__init__(*args, **kwargs) 
     self.InitUI() 
     self.SetSize((380,340)) 
     self.Show() 
     self.count = 0 
     self.threads = [] 
     pub.subscribe(self.__StatusChanged, 'status.changed') 

    def __StatusChanged(self, asset, time, status): 
     if status: 
      msg = 'Online' 
     else: 
      msg = 'Offline' 
     self.Logger('{}: {} - {}\n'.format(time, asset, msg)) 

    def Logger(self, msg): 
     self.txtresults.AppendText(msg) 

class PingAssets(threading.Thread): 
    def __init__(self, threadNum, asset, window): 
     threading.Thread.__init__(self) 
     self.threadNum = threadNum 
     self.window = window 
     self.asset = asset 
     self.signal = True 
     self.status = None 

    def run(self): 
     while self.signal: 
      logging.debug("Thread {} started run sequence.".format(self.threadNum)) 
      start_time = datetime.now().strftime(self.fmt) 
      try: 
       newstatus = onlinecheck.check_status(self.asset) 
       if newstatus != self.status or self.verbose: 
        self.status = newstatus 
        pub.sendMessage('status.changed', asset=self.asset, 
            time=start_time, status=self.status) 
+0

나는 이것을 고맙게 생각한다. 다행히도 pyinstaller와 함께 작동 할 것입니다 - 이것을 확인할 수 있습니까? – tjmgis

+0

할 수 있습니다. PyInstaller를 사용하여 모든 것을 배포합니다. 작동하거나 도움이된다면 +1/우수 답변으로 표시하는 것이 좋습니다. Sidenote : PyInstaller https://github.com/multiphrenic/GooeyPi의 GUI 프런트 엔드도 만들었습니다. 현재 PyStructer (2.1)의 최신 개발 버전과 만 호환되며 stable 2.0은 호환되지 않습니다. 그러나 거기에 많은 버그 수정이 있기 때문에 대부분의 유스 케이스에 대해 2.1을 권장합니다. – pedram

+0

나는 이것을 작동 시키려고 노력한 지난 몇 시간을 보냈다. 아직 wxpython 2.8의 현재 릴리스에는 운이 없다.그래서 나는 그것을 제거하고 pyinstaller의 개발 버전과 함께 개발 버전을 가지고, 내 동일한 스크립트를 사용하고 pubsub에 대한 import 문을 사용하고 pyinstaller를 실행했습니다. 그것은 그것을 발견하고 지금은 내 exe 작품. 도움을 주셔서 감사합니다 – tjmgis