wx.YieldIfNeeded auf MAC wirkungslos?

Plattformunabhängige GUIs mit wxWidgets.
Antworten
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

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
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

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()
Antworten