3 Bilder im Window blinken

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Alexci
User
Beiträge: 44
Registriert: Dienstag 18. April 2006, 23:08

Hallo,

Wie kann ich 3 bilder in einen wx.Window blinken, d.h. sie nach einen Zeitinterwal auswaechseln und anzeigen.
Die bilder werden in drei statbmp geladen und die muessten dann eins nach dem anderen nagezeigt werden.
Ich habe es mit Show() versucht, es geht mit 2 Bilder, aber nicht mit drei. :(

Code: Alles auswählen

# -*- coding: cp1250 -*-
import wx 
import wx.lib.scrolledpanel as scrolled
import wx.lib.buttons


global blinkn
blinkn='1'

class MyFrame(wx.Frame):
    def __init__(self, parent = None, id = -1, title = "", size = wx.Size(1000, 750)): 
        wx.Frame.__init__(self, parent, id, title= '', pos = wx.Point(0, 0), size = size)

        self.statusbar=self.CreateStatusBar()
        self.sashWindow1 = wx.SashWindow(self, name='sashWindow1', pos=wx.Point(820, 24), size=wx.Size(152, 128), style=wx.CLIP_CHILDREN | wx.SW_3D)
    
        self.scrolledWindow1 = wx.ScrolledWindow(self, name='scrolledWindow', pos=wx.Point(0, 24), size=wx.Size(780, 550), style=wx.HSCROLL | wx.VSCROLL)
        self.scrolledWindow1.SetBackgroundColour(wx.Colour(0, 90, 159))
        self.scrolledWindow1.SetScrollbars(1,1, 3000, 2000)
        self.scrolledWindow1.SetScrollRate(40,40)
        self.toggleButton2 = wx.ToggleButton(self, label='Show Image', name='toggleButton2', pos=wx.Point(800, 295), size=wx.Size(90, 23), style=0)
        self.checkBox4 = wx.CheckBox(self, label='Start / Stop', name='checkBox4', pos=wx.Point(880, 202), size=wx.Size(75, 13), style=0)


        statbmp = wx.StaticBitmap(self.scrolledWindow1)
        self.statbmp = statbmp
        statbmp2 = wx.StaticBitmap(self.scrolledWindow1)
        self.statbmp2 = statbmp2
        statbmp3 = wx.StaticBitmap(self.scrolledWindow1)
        self.statbmp3 = statbmp3

    

        self.toggleButton2.Bind(wx.EVT_TOGGLEBUTTON, self.update_bitmap)
        self.statbmp.Bind(wx.EVT_MOTION, self.OnMotion)

        self.Bind(wx.EVT_TIMER, self.blink)

        self.timer = wx.Timer(self)
        self.timer.Start(int((1/float(4))*1000))


    def blink(self, event):
        global blinkn
        if self.checkBox4.GetValue() == True:
            if blinkn=='1':
                self.statbmp.Show(True)
                self.statbmp2.Show(False)
                self.statbmp3.Show(False)
                blinkn='2'
            if blinkn=='2':
                self.statbmp.Show(False)
                self.statbmp2.Show(True)
                self.statbmp3.Show(False)
                blinkn='3'
            if blinkn=='3':
                self.statbmp3.Show(True)
                self.statbmp.Show(False)
                self.statbmp2.Show(False)
                blinkn='1'


## So funktioniert es mit 2 statbmps
##    def blink(self, event):
##        if (self.checkBox4.GetValue() == True):
##             if self.statbmp.Show() == True:
##                self.statbmp2.Show(False)
##                self.statbmp.Show(True)
##                
##             else:
##                self.statbmp.Show(False)
##                self.statbmp2.Show(True)


    def OnMotion(self, event):
        pt = event.GetPositionTuple()  
       
        self.statusbar.SetStatusText(str(pt))
        event.Skip()



    def update_bitmap(self, event = None):
        """
        Bild1 holen und anzeigen
        """
        
        w, h = 3000, 2000 # hier sollte natürlich die korrekte Größe stehen
        bmp = wx.EmptyBitmap(w, h)
        dc = wx.MemoryDC(bmp)
        hdc = dc.GetHDC()
        
        
     
        tmpbmp = wx.Bitmap("spanish.jpg")
        dc.DrawBitmap(tmpbmp, 0, 0)
      
        # Bildaufbau blockieren
        self.scrolledWindow1.Freeze()
        
        # Bild zuweisen
        self.statbmp.SetBitmap(bmp)
        
        # ScrolledWindow einrichten
        self.scrolledWindow1.FitInside()
        self.scrolledWindow1.SetScrollbars(20, 20, w/20, h/20)
        
        self.statbmp.Refresh()
        
        # Bildaufbau wieder erlauben
        self.scrolledWindow1.Thaw()


        """
        Bild2 holen und anzeigen
        """
        
        w, h = 3000, 2000 # hier sollte natürlich die korrekte Größe stehen
        bmp2 = wx.EmptyBitmap(w, h)
        dc2 = wx.MemoryDC(bmp2)
        hdc2 = dc2.GetHDC()
        
        
     
        tmpbmp2 = wx.Bitmap("Samsung.jpg")
        dc2.DrawBitmap(tmpbmp2, 0, 0)
      
        # Bildaufbau blockieren
        self.scrolledWindow1.Freeze()
        
        # Bild zuweisen
        self.statbmp2.SetBitmap(bmp2)
        
        # ScrolledWindow einrichten
        self.scrolledWindow1.FitInside()
        self.scrolledWindow1.SetScrollbars(20, 20, w/20, h/20)
        
        self.statbmp2.Refresh()
        
        # Bildaufbau wieder erlauben
        self.scrolledWindow1.Thaw()





        """
        Bild3 holen und anzeigen
        """
        
        w, h = 3000, 2000 # hier sollte natürlich die korrekte Größe stehen
        bmp3 = wx.EmptyBitmap(w, h)
        dc3 = wx.MemoryDC(bmp3)
        hdc3 = dc3.GetHDC()
        
        
     
        tmpbmp3 = wx.Bitmap("mist.jpg")
        dc3.DrawBitmap(tmpbmp3, 0, 0)
      
        # Bildaufbau blockieren
        self.scrolledWindow1.Freeze()
        
        # Bild zuweisen
        self.statbmp3.SetBitmap(bmp3)
        
        # ScrolledWindow einrichten
        self.scrolledWindow1.FitInside()
        self.scrolledWindow1.SetScrollbars(20, 20, w/20, h/20)
        
        self.statbmp3.Refresh()
        
        # Bildaufbau wieder erlauben
        self.scrolledWindow1.Thaw()



def main(): 
    app = wx.PySimpleApp() 
    myframe = MyFrame() 
    #myframe.Center() 
    myframe.Show() 
    app.MainLoop()



if __name__ == "__main__": 
    main()


Danke!


Mit freundlichen Gruessen,
Aleksandar Cikota
Alexci
User
Beiträge: 44
Registriert: Dienstag 18. April 2006, 23:08

Hi,

vielleicht geht es irgenwie mit Hilfe von self.SetTopWindow()... einmal klappt es, es zeigt das naechste bild an aber dann kommt ein error weil es ja fuer Fenster ist....
sonst bleibt das Blinken immer am dritten Bild haengen...

Code: Alles auswählen

def blink(self, event):
        global blinkn
        if self.checkBox4.GetValue() == True:
            if blinkn=='1':
                self.statbmp3.Hide()
                self.statbmp.Show(True)
                self.statbmp2.Hide()
               # self.SetTopWindow(self.statbmp)
                
                blinkn='2'
                print '1'
            if blinkn=='2':
                self.statbmp.Hide()
                self.statbmp2.Show(True)
                self.statbmp3.Hide()
                #self.SetTopWindow(self.statbmp2)
                blinkn='3'
                print '2'
            if blinkn=='3':   
                self.statbmp.Hide()
                self.statbmp2.Hide()
                self.statbmp3.Show(True)
                #self.SetTopWindow(self.statbmp3)
                blinkn='1'
                print '3'


Danke!


Aleksandar
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Alexci hat geschrieben:nach einen Zeitinterwal auswaechseln
Hi Aleksandar!

Ich verstehe deinen Code nicht, wenn ich nur drüber lese.

Wie auch immer. Versuche nicht mehrere Widgets übereinander zu legen. Das wird wahrscheinlich schief gehen. Und dann frage ich mich noch, warum du die StaticBitmaps austauschen willst und nicht die Bilder in EINEM StaticBitmap neu einliest.

Mit ``statbmp.SetBitmap()`` lässt sich das Bild tauschen. Die Bilder selbst -- also die Bitmaps -- kannst du ja zwischenspeichern. Du musst diese nicht ständig neu einlesen.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Alexci
User
Beiträge: 44
Registriert: Dienstag 18. April 2006, 23:08

Hallo,

Ich hab's... :D :D :D

Code: Alles auswählen

    def blink(self, event):
        global blinkn
        if self.checkBox4.GetValue() == True:
            if blinkn=='1':
                self.statbmp.Show(True)
                self.statbmp2.Show(False)
                self.statbmp3.Show(False)
                blinkn='2'
                exit()
            if blinkn=='2':
                self.statbmp.Show(False)
                self.statbmp2.Show(True)
                self.statbmp3.Show(False)
                blinkn='3'
                exit()
            if blinkn=='3':   
                self.statbmp.Show(False)
                self.statbmp2.Show(False)
                self.statbmp3.Show(True)
                blinkn='1'
                exit()


Aleksandar
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Vergisst doch mal bitte endlich ``global``. Ich hoffe ``gobal`` verschwindet in Py3K!

lg
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

sape hat geschrieben:Ich hoffe ``gobal`` verschwindet in Py3K!
Hi sape!

:twisted: ``global`` wird nicht verschwinden und darf auch nicht verschwinden. Es gibt wirklich Anwendungsfälle, in denen ``global`` Sinn macht.

Ich schreibe derzeit an einem Bankomatkassen-Schnittstellenprogramm. Da laufen ständig mehrere Threads gleichzeitig (XMLRPC-Server, XMLRPC-Clients, XML-Reader, -Writer, Journalschreiber, Logger, GUI, usw.). Diese werden von einer Hauptprozedur aus gestartet. Wenn ich da nicht die Möglichkeit hätte, auf Kommandozeilenparameter oder INI-Einträge, von einer anderen Klasse aus zu reagieren und z.B. den Logger im Nachhinein in den Debug-Modus zu schalten, dann würde ich verzweifelt das Handtuch werfen. :wink:

Ich habe in solchen Fällen im Header vermerkt, dass es diese globalen Variablen gibt und mit welchen Objekten diese belegt sind. Dann habe ich diese (wenigen) Variablen noch mit dem Präfix "global_" gekennzeichnet.

Ich glaube also, es gibt Fälle, in denen eine globale Variable die Dinge wirklich sehr viel einfacher macht. Also bitte nicht abschaffen -- nur davor warnen.

lg
Gerold
:-)

PS: In dem Codebeispiel von Alexci macht es keinen Sinn. Der Code ist eh schon in einer Klasse. Warum also keine Instanzvariable (self.xxx) dafür verwenden!?
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Alexci
User
Beiträge: 44
Registriert: Dienstag 18. April 2006, 23:08

Hallo,

Das blinken funktioniert zwar, aber es "flimmert". Versucht es mal, erst auf "Show image" button klicken und dann auf das checkbutton... ihr braucht 3 verschiedene Bilder, Temp0.jpg, Temp1.jpg und Temp2.jpg die ungefaehr gleich gross sind.
Ich habe es auch versucht das bild immer in das selbe statbmp zu laden... flimmert immer noch... was soll ich machen?

Danke!

MfG,
Aleksandar

Code: Alles auswählen

# -*- coding: cp1250 -*- 
import wx 
import wx.lib.scrolledpanel as scrolled 
import wx.lib.buttons 


global blinkn 
blinkn='1' 

class MyFrame(wx.Frame): 
    def __init__(self, parent = None, id = -1, title = "", size = wx.Size(1000, 750)): 
        wx.Frame.__init__(self, parent, id, title= '', pos = wx.Point(0, 0), size = size) 

        self.statusbar=self.CreateStatusBar() 
        self.sashWindow1 = wx.SashWindow(self, name='sashWindow1', pos=wx.Point(820, 24), size=wx.Size(152, 128), style=wx.CLIP_CHILDREN | wx.SW_3D) 
    
        self.scrolledWindow1 = wx.ScrolledWindow(self, name='scrolledWindow', pos=wx.Point(0, 24), size=wx.Size(780, 550), style=wx.HSCROLL | wx.VSCROLL) 
        self.scrolledWindow1.SetBackgroundColour(wx.Colour(0, 90, 159)) 
        self.scrolledWindow1.SetScrollbars(1,1, 3000, 2000) 
        self.scrolledWindow1.SetScrollRate(40,40) 
        self.toggleButton2 = wx.ToggleButton(self, label='Show Image', name='toggleButton2', pos=wx.Point(800, 295), size=wx.Size(90, 23), style=0) 
        self.checkBox4 = wx.CheckBox(self, label='Start / Stop', name='checkBox4', pos=wx.Point(880, 202), size=wx.Size(75, 13), style=0) 


        statbmp = wx.StaticBitmap(self.scrolledWindow1) 
        self.statbmp = statbmp 
      

    

        self.toggleButton2.Bind(wx.EVT_TOGGLEBUTTON, self.update_bitmap) 
        self.statbmp.Bind(wx.EVT_MOTION, self.OnMotion) 

        self.Bind(wx.EVT_TIMER, self.blink) 

        self.timer = wx.Timer(self) 
        self.timer.Start(int((1/float(4))*1000)) 


    def blink(self, event): 
        global blinkn
 
        if self.checkBox4.GetValue() == True: 

            if blinkn=='1': 
                #self.scrolledWindow1.Freeze()  
                self.statbmp.SetBitmap(bmp1) 
                #self.scrolledWindow1.FitInside() 
                self.statbmp.Refresh() 
                #self.scrolledWindow1.Thaw()
                
                blinkn='2'
                exit()
            if blinkn=='2': 
                #self.scrolledWindow1.Freeze()  
                self.statbmp.SetBitmap(bmp2) 
                #self.scrolledWindow1.FitInside()             
                self.statbmp.Refresh()
                #self.scrolledWindow1.Thaw()                 
                blinkn='3'
                exit()
            if blinkn=='3': 
                #self.scrolledWindow1.Freeze()  
                self.statbmp.SetBitmap(bmp3) 
                #self.scrolledWindow1.FitInside()  
                self.statbmp.Refresh()  
                #self.scrolledWindow1.Thaw() 
                blinkn='1'
                exit()

    def OnMotion(self, event): 
        pt = event.GetPositionTuple()  
        
        self.statusbar.SetStatusText(str(pt)) 
        event.Skip() 



    def update_bitmap(self, event = None):
        global bmp1, bmp2, bmp3, w, h
        w, h = 3000, 2000 # hier sollte natürlich die korrekte Größe stehen 

        """ 
        Bild1 holen und anzeigen 
        """ 
        
        bmp1 = wx.EmptyBitmap(w, h) 
        dc = wx.MemoryDC(bmp1) 
        hdc = dc.GetHDC() 
        tmpbmp = wx.Bitmap("Temp0.jpg") 
        dc.DrawBitmap(tmpbmp, 0, 0) 
      

        """ 
        Bild2 holen und anzeigen 
        """ 
        bmp2 = wx.EmptyBitmap(w, h) 
        dc2 = wx.MemoryDC(bmp2) 
        hdc2 = dc2.GetHDC()      
        tmpbmp2 = wx.Bitmap("Temp1.jpg") 
        dc2.DrawBitmap(tmpbmp2, 0, 0) 


        """ 
        Bild3 holen und anzeigen 
        """ 
        bmp3 = wx.EmptyBitmap(w, h) 
        dc3 = wx.MemoryDC(bmp3) 
        hdc3 = dc3.GetHDC()         
        tmpbmp3 = wx.Bitmap("Temp2.jpg") 
        dc3.DrawBitmap(tmpbmp3, 0, 0) 
      
 
def main(): 
    app = wx.PySimpleApp() 
    myframe = MyFrame() 
    #myframe.Center() 
    myframe.Show() 
    app.MainLoop() 



if __name__ == "__main__": 
    main() 

Alexci
User
Beiträge: 44
Registriert: Dienstag 18. April 2006, 23:08

Hallo,

Das problem ist, wie kriegt man den uebergang "sanft" hin, wie in einer slideshow?

Danke!

Mit freundlichen gruessen,
Aleksandar
Antworten