Seite 1 von 1

wx.YieldIfNeeded auf MAC wirkungslos?

Verfasst: Donnerstag 16. Juli 2009, 17:54
von snakeseven
Hallo,
um meine GUI bedienbar zu halten, verwende ich auf der Windows Plattform wx.YieldIfNeeded(),
was auch hervorragend funktioniert. Auf dem MAC hingegen, scheint die Funktion völlig wirkungslos zu sein !?
Die GUI kann, während die While-Schleifen laufen, nicht bedient werden.

Auch schreibt mir die Ausgabefunktion die komplette GUI voll, anstatt die Ausgabe in die ListBox einzutragen,
was auf dem Win-Rechner ebenfalls ohne Probleme funktioniert. Dann stürzt das Programm schließlich ab.

Ich steige nicht durch, was auf dem MAC anders ist und wie ich dieses Problem beheben kann.
Hat einer eine Idee ? (weitere Verbesserungsvorschläge sind natürlich auch gerne gesehen).

Hier das Programm:
http://spacejammer.com/Python/FindMusicOnSkreemR.txt

Grüße, Seven

Verfasst: Freitag 17. Juli 2009, 10:59
von snakeseven
wx.CallAfter verhindert immerhin, dass die komplette GUI vollgeschrieben wird, aber das YieldIfNeeded-Problem ist damit noch nicht gelöst.
Habe mal das Ganze in einem sinnfreien Miniscript zusammengefasst. Das YielIfNeeded der while-Schleife wird auf dem MAC nach wie vor ignoriert !?

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import os, wx,urllib2,threading
from random import randint 
from threading import Timer  

if 'wxMSW' in wx.PlatformInfo: 
    OS = 'win'
elif 'wxMac' in wx.PlatformInfo: 
    OS = 'mac'
    

class MainWindow(wx.MiniFrame):
    def __init__(self):
        wx.MiniFrame.__init__(self, None, -1, '', style = wx.DEFAULT_FRAME_STYLE | wx.TAB_TRAVERSAL) 

        self.panel = wx.Panel(self, -1)                  
        sizer = wx.GridBagSizer(5, 5)
        self.countlabel = wx.Button(self.panel, -1, '0')                         
        sizer.Add (self.countlabel, (1, 1), flag= wx.RIGHT, border=10)
        self.resultlist = wx.ListBox(self.panel, 999, None, (400,200), [], wx.LB_SINGLE | wx.LB_HSCROLL)
        sizer.Add (self.resultlist, (1, 0), flag=wx.LEFT | wx.RIGHT | wx.BOTTOM, border=10)
        
        self.panel.SetSizerAndFit(sizer)
        self.Bind (wx.EVT_CLOSE, self.cancel)

        self.SetMinSize(sizer.Fit(self))
        self.SetMaxSize(sizer.Fit(self))
        
        self.Show()
        self.Center()

        
    def cancel(self, event=None):
        self.Destroy()
        
        
        
        
class RandomWords:
    def __init__(self):
       self.count = 0
       self.maxentries = 200
       self.maxthreads = 10
       self.snippet = ''
       
       self.startrandom()


    def start_threads(self, number):
        threads = [] 
        for i in range(number): 
            wx.YieldIfNeeded()
            threads.append(threading.Thread(target = self.randomwords)) 
            threads[-1].start() 
        for thrd in threads: 
            thrd.join()


    def startrandom(self):
        if OS == 'win':
            t= Timer(0.01, self.call_randomwords); t.start()
        else:
            self.call_randomwords()
    
    
    def append_result_to_list(self, txt):
        try:
            ln = MW.resultlist.Append(txt)
            wx.CallAfter(MW.resultlist.SetSelection,ln)
            wx.CallAfter(MW.resultlist.Update)
            wx.CallAfter(MW.countlabel.SetLabel, str(self.count)) 
        except: pass
        

    def call_randomwords(self): 
        self.count = 0 
        MW.resultlist.Clear()
        MW.countlabel.SetLabel('0')
        self.start_threads(self.maxthreads)     
            
            
    def randomwords(self): 
        while self.count <= self.maxentries:
            wx.YieldIfNeeded()                                   # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            try:
                u = urllib2.urlopen('http://www.spacejammer.com/de/downloads.html')
                src = u.read()
                u.close()
            except:
                pass
            else:
                pos = randint (0, 10000)
                try: self.snippet = src[pos:pos+10].encode('utf-8')
                except: self.snippet = '--------'

                self.append_result_to_list(self.snippet)
                print self.snippet
                self.count += 1

                
if __name__ == '__main__':
    app = wx.PySimpleApp()
     
    MW = MainWindow()
    RandomWords()
    
    app.MainLoop()