Grafik ein und aus blenden

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

Hi,

Ich habe schon wieder ein kleines Problem. Ich moechte, dass man eine Grafik, z.b. einen Kreis ueber ein Bild das in einem Frame angezeigt wird ein und ausblenden kann mit hilfe eines Checkbox.

Hier ist der Code ohne das Bild im hintegrund, man braucht es eigentlich gar nicht zum testen...
Es funktioniert wenn man das scrollen nicht braucht, aber wenn man scrollt verschwinden die Kreise. Die Kreise werden auch nicht an einer fixen Position im Frame angezeigt... d.h. wenn man nach unten scrollt und auf die Checkbox klicht werden die Kreise anzeigt obwohl sie an der Postition nicht sichtbar sein duerfen.

Am besten waehre es uber einen StaticBitmap, den man ueber ein Bild laden kann (wie einen zweiten Layer), zu machen aber das Problem ist dann das der Hintergrund von einen wx.EmptyBitmap nicht transparent ist sondern schwarz. Kann man den transparent machen?

Code: Alles auswählen

import wx 
import wx.lib.scrolledpanel as scrolled
import wx.lib.buttons


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.checkBox1 = wx.CheckBox(self, label='Draw circle', name='checkBox1', pos=wx.Point(890, 288), size=wx.Size(100, 13), style=0)
        self.scrolledWindow1 = wx.ScrolledWindow(self, name='scrolledWindow', pos=wx.Point(0, 24), size=wx.Size(860, 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.checkBox1.Bind(wx.EVT_CHECKBOX, self.Onklick)
        self.circlePoints = []
        self.scrolledWindow1.Bind(wx.EVT_PAINT, self.OnPaint)

    def OnPaint(self, event):
        if self.checkBox1.GetValue() == True:
            dc = wx.PaintDC(self.scrolledWindow1)
            dc.Clear()
            dc.SetPen(wx.Pen("RED", 4))
            for point in self.circlePoints:
                dc.DrawEllipse(point[0]-50, point[1]-50, 100, 100)
                    
        if self.checkBox1.GetValue() == False:
            dc = wx.PaintDC(self.scrolledWindow1)
            dc.Clear()

    def Onklick (self, event):
        if self.checkBox1.GetValue() == True:
            self.circlePoints = self.circlePoints + [(290, 132), (300,300), (400, 400)]
        self.Refresh()


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


if __name__ == "__main__": 
    main()

Danke!


Gruesse,
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:Ich habe schon wieder ein kleines Problem. Ich moechte, dass man eine Grafik, z.b. einen Kreis ueber ein Bild das in einem Frame angezeigt wird ein und ausblenden kann mit hilfe eines Checkbox.
Hi Aleksandar!

Du könntest das Originalbild im Speicher lassen und jeweils, bevor du dem StaticBitmap das NEUE Bitmap übergibst, ins Bitmap (gnauer gesagt, über den DC) die Kreise zeichnen.

Hier ein grobes, nicht optimiertes Beispiel:
http://paste.pocoo.org/show/646/

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

Danke! Geht!


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

Hi Aleksandar!

Was ich noch vergessen habe...

Mein Beispiel ist irgendwie nur die Instant-Version. Wenn dein Programm schneller laufen muss, mit evt. weniger Flackern beim Neuzeichnen, dann wirst du wohl statt einem StaticBitmap direkt auf eine Fläche (z.B. ein Panel) zeichnen müssen. Und beim Neuzeichnen immer nur den geänderten Bereich neu zeichnen. Aber damit habe ich noch keine Erfahrung.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi Aleksandar!

Ich habe mich noch ein wenig damit befasst. Das ist dabei raus gekommen. Ein Beispiel mit einem ``wx.BufferedPaintDC``. Ob es viel bringt? Keine Ahnung. :K

http://paste.pocoo.org/show/668/

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 Gerold,

Danke! Schon Ihr letzter Post hat mir sehr geholfen... ich habe auch die Methode in meinen Programm eingebaut, obwohl auch die sehr praktisch ist.



Mit freundlichen Gruessen,
Aleksandar
Antworten