Seite 1 von 1

Grafik ein und aus blenden

Verfasst: Freitag 12. Januar 2007, 17:20
von Alexci
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

Re: Grafik ein und aus blenden

Verfasst: Freitag 12. Januar 2007, 19:29
von gerold
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
:-)

Verfasst: Freitag 12. Januar 2007, 22:01
von Alexci
Danke! Geht!


Aleksandar :D

Verfasst: Samstag 13. Januar 2007, 09:38
von gerold
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
:-)

Verfasst: Montag 15. Januar 2007, 22:36
von gerold
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
:-)

Verfasst: Mittwoch 17. Januar 2007, 01:12
von Alexci
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