wx.lib.scrolledpanel scrolled nicht ?

Plattformunabhängige GUIs mit wxWidgets.
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

wx.lib.scrolledpanel scrolled nicht ?

Beitragvon sea-live » Montag 12. Januar 2009, 21:50

Ich hätte gerne ein KLEINES fenster das heist SCROLLIGpanel in use!
Nun es werden keine scrollbars angezeigt!
Und beim vergrössern des fensters hängt sich das Fenster(Frame) auf!
Ich muss warscheinlich den event PAINT dem Mainsizer übergeben aber wie ?

Code: Alles auswählen

CODE weiter UNTEN

das ziel sollte dann so aussehen
Bild

schon nahe am ziel !!!!

Edit (Leonidas): Ins wx-Forum verschoben.
Zuletzt geändert von sea-live am Dienstag 13. Januar 2009, 21:01, insgesamt 1-mal geändert.
Benutzeravatar
Mawilo
User
Beiträge: 446
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Beitragvon Mawilo » Dienstag 13. Januar 2009, 16:58

Hallo sea-live,

ich habe einmal ein kleines Beispiel erstellt:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: cp1252 -*-

import wx

class MainFrame(wx.Frame):
    def __init__(self, parent=None, id=-1, title='Scroll-Grafik'):
       
        wx.Frame.__init__(self, parent, id, title, size=(300, 300))
        size = (400, 400)
       
        # Panel für Button und Scrollfenster
        panel = wx.Panel(self, -1, size=size)
       
        #Button
        self.button = wx.Button(panel, -1, "Beenden")
       
        #Scrollfenster
        self.scrollw = wx.ScrolledWindow(panel, -1,
                                    style=wx.SUNKEN_BORDER, size=(200, 220))
        self.scrollw.SetScrollbars(1, 1, 400, 400)
       
        #Sizer
        mainsizer = wx.BoxSizer(wx.VERTICAL)
        mainsizer.Add((10, 10))
        mainsizer.Add(self.button, 0, wx.ALIGN_CENTER)
        mainsizer.Add((10, 10))
        mainsizer.Add(self.scrollw, 0, wx.ALIGN_CENTER)
        panel.SetSizer(mainsizer)

        #Bindungen
        self.Bind(wx.EVT_BUTTON, self.close, self.button)
       
        # Bild, auf dem die Grafik gezeichnet wird
        self.bmp = self.get_base_bitmap(size)
       
        # Aufruf Paint-Event
        self.scrollw.Bind(wx.EVT_PAINT, self.on_paint)
       
        # und jetzt wird gezeichnet
        self.drawPicture()
       
    def get_base_bitmap(self, size):
       
        """
        Funtion zum Erstellen des leeren Bildes
        """
       
        bmp = wx.EmptyBitmap(*size)
        dc = wx.MemoryDC(bmp)
        dc.SetBackground(wx.WHITE_BRUSH)
        dc.Clear()
        dc.SelectObject(wx.NullBitmap)
        return bmp
   
    def on_paint(self, event=None):
        wx.BufferedPaintDC(self.scrollw, self.bmp, style=wx.BUFFER_VIRTUAL_AREA)
       
    def drawPicture(self):
       
        """
        Hier kommt alles rein, was gezeichnet werden soll
        """
       
        dc = wx.MemoryDC(self.bmp)
        for y in xrange(5, 401, 20):
            dc.DrawLine(5, y, 395, y)
        for x in xrange(5, 401, 20):
            dc.DrawLine(x, 5, x, 395)
        dc.SelectObject(wx.NullBitmap)

    def close(self, event):
        self.Destroy()

def main():
    app = wx.PySimpleApp()
    frame = MainFrame()
    frame.Show()
    app.MainLoop()

if __name__ == "__main__":
    main()


Allerdings habe ich mir nicht die Mühe gemacht, Deine Grafik einzufügen :D

Grüße
Mawilo
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

Beitragvon sea-live » Dienstag 13. Januar 2009, 21:00

Danke jetzt klappt es soweit

beim zoomen wird das fensternur neu gezeichnet wenn sich der scroll balken bewegt
kann man das direkt neuzeichnen nach dem ein anderer faktor gewählt wurde

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: cp1252 -*-

import wx

class Hpgl_viewer(wx.Frame):
    def __init__(self, parent=None, id=-1, title='HPGL Viewer'):
       
        wx.Frame.__init__(self, parent, id, title, size=(300, 350))
        #daten von hpgl load
        self.bohrpos = [(203, 102, 360), (305, 102, 360), (406, 102, 360), (508, 102, 360)]
        self.platine = max(t[0] for t in self.bohrpos)+150, max(t[1] for t in self.bohrpos)+150
        self.zoomfaktor = 12.0
        self.Hpgl_Faktor = 40.0
        self.raster = 2.54
        size = self.platine #(580, 580)
         
        # Panel für Button und Scrollfenster
        panel = wx.Panel(self, -1, size=(300,350))
        #Button
        self.button = wx.Button(panel, -1, "Beenden")
        # Zoomfaktor
        self.text_zoom =wx.StaticText(panel, -1, "Zoomfaktor:")
        self.faktor_auswahl_feld = wx.Choice(panel,-1,(40,15),choices =('50%','100%','200%'))
        self.faktor_auswahl_feld.SetSelection(1)
        #'horizontal arangment       
        self.eingabesizer = wx.BoxSizer(wx.HORIZONTAL)
        self.eingabesizer.Add( self.text_zoom,0,wx.ALIGN_LEFT)     
        self.eingabesizer.Add( self.faktor_auswahl_feld,0,wx.ALIGN_LEFT)
        self.eingabesizer.Add((10, 10))
        self.eingabesizer.Add( self.button,0,wx.ALIGN_LEFT)     

        #Scrollfenster
        self.scrollw = wx.ScrolledWindow(panel, -1,
                                    style=wx.SUNKEN_BORDER, size=(250,250))
        self.scrollw.SetScrollbars(1, 1, self.platine[0]-2,self.platine[1]-2)
       
        #Sizer
        mainsizer = wx.BoxSizer(wx.VERTICAL)
        mainsizer.Add((10, 10))
        mainsizer.Add(self.eingabesizer, 0, wx.ALIGN_CENTER)
        mainsizer.Add((10, 10))
        mainsizer.Add(self.scrollw, 0, wx.ALIGN_CENTER)
        panel.SetSizer(mainsizer)

        #Bindungen
        self.Bind(wx.EVT_BUTTON, self.close, self.button)
        self.Bind(wx.EVT_CHOICE, self.EvtChoice, self.faktor_auswahl_feld)
       
        # Bild, auf dem die Grafik gezeichnet wird
        self.bmp = self.get_base_bitmap(size)
       
        # Aufruf Paint-Event
        self.scrollw.Bind(wx.EVT_PAINT, self.on_paint)
       
        # und jetzt wird gezeichnet
        self.drawPicture()

    def EvtChoice(self, event):
        #self.dr.SetUserScale(2,2)
        #self.drawPicture()
        if event.GetString() == '50%':
            self.zoomfaktor = 6.0
        if event.GetString() == '100%':
            self.zoomfaktor = 12.0
        if event.GetString() == '200%':
            self.zoomfaktor = 24.0
        self.bmp = self.get_base_bitmap(self.platine)
        self.drawPicture()
        """
        HIER LIEGT DER FEHLER DENK ICH
        """
    def get_base_bitmap(self, size):
        bmp = wx.EmptyBitmap(*size)
        self.dr = wx.MemoryDC(bmp)
        self.dr.SetBackground(wx.WHITE_BRUSH)
        self.dr.Clear()
        self.dr.SelectObject(wx.NullBitmap)
        return bmp
   
    def on_paint(self, event=None):
        wx.BufferedPaintDC(self.scrollw, self.bmp, style=wx.BUFFER_VIRTUAL_AREA)
       
    def drawPicture(self):
        self.dr = wx.MemoryDC(self.bmp)
        gapx = 10
        gapy = 50
        platinex = int(self.platine[0]/self.Hpgl_Faktor*self.zoomfaktor)
        platiney = int(self.platine[1]/self.Hpgl_Faktor*self.zoomfaktor)
        #pointliste abhängig vom zoomfaktor erstellen
       
        #feldsizer = wx.BoxSizer( wx.VERTICAL )
        #self.dr = wx.PaintDC(self)
        self.dr.SetBrush(wx.Brush(colour = wx.BLACK, style = wx.SOLID))
        # Platine zeichnen
        self.dr.DrawRectangle(gapx, gapy, platinex+20, platiney+20) #schwarzes feld
        self.dr.SetPen(wx.Pen(colour = wx.WHITE, width = 1, style = wx.SOLID))
        self.dr.DrawRectangle(gapx+10,gapy+10, platinex,platiney) # platinenummriss
        # Nullpunkt cross
        # fix in x30
        nullx = 30
        nully = gapy + platiney
        self.dr.DrawLine(nullx-5,nully,nullx+5,nully)
        self.dr.DrawLine(nullx,nully-5,nullx,nully+5)
        # Bohrpunkte
        pointlist =[]
        for bohrung in self.bohrpos:
            pointlist.append((int((bohrung[0]/self.Hpgl_Faktor)*self.zoomfaktor)  + nullx , nully - int((bohrung[1]/self.Hpgl_Faktor)*self.zoomfaktor)))
        self.dr.SetBrush(wx.Brush(colour = wx.GREEN, style = wx.SOLID))
        self.dr.SetPen(wx.Pen(colour = wx.GREEN, width = 1, style = wx.SOLID))
        for point in pointlist:
            self.dr.DrawCirclePoint(point,4)
        #print pointlist   
        # gitter
        self.dr.SetPen(wx.Pen(colour = wx.WHITE, width = 1, style = wx.SOLID))
        rasterpixel = int(self.zoomfaktor*self.raster)
        #print rasterpixel
        anzahlx = int(platinex/rasterpixel)  #2,54mm raster =zoomfaktor * 2,54
        anzahly = int(platiney/rasterpixel)
        gitterpunkte = []
        for punktex in range(anzahlx+1):
            for punktey in range(anzahly+1):
                self.dr.DrawPoint(nullx + punktex * rasterpixel,nully - punktey * rasterpixel)
        self.dr.SelectObject(wx.NullBitmap)

    def close(self, event):
        self.Destroy()

def main():
    app = wx.App()
    frame = Hpgl_viewer()
    frame.Show()
    app.MainLoop()

if __name__ == "__main__":
    main()
Benutzeravatar
Mawilo
User
Beiträge: 446
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Beitragvon Mawilo » Donnerstag 15. Januar 2009, 20:47

So sollte es funktionieren:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: cp1252 -*-

import wx

class Hpgl_viewer(wx.Frame):
    def __init__(self, parent=None, id=-1, title='HPGL Viewer'):
       
        wx.Frame.__init__(self, parent, id, title, size=(300, 350))
        #daten von hpgl load
        self.bohrpos = [(203, 102, 360), (305, 102, 360), (406, 102, 360), (508, 102, 360)]
        self.platine = max(t[0] for t in self.bohrpos)+150, max(t[1] for t in self.bohrpos)+150
        self.zoomfaktor = 12.0
        self.Hpgl_Faktor = 40.0
        self.raster = 2.54
        self.size = self.platine #(580, 580)
         
        # Panel für Button und Scrollfenster
        panel = wx.Panel(self, -1, size=(300,350))
        #Button
        self.button = wx.Button(panel, -1, "Beenden")
        # Zoomfaktor
        self.text_zoom =wx.StaticText(panel, -1, "Zoomfaktor:")
        self.faktor_auswahl_feld = wx.Choice(panel,-1,(40,15),choices =('50%','100%','200%'))
        self.faktor_auswahl_feld.SetSelection(1)
        #'horizontal arangment       
        self.eingabesizer = wx.BoxSizer(wx.HORIZONTAL)
        self.eingabesizer.Add( self.text_zoom,0,wx.ALIGN_LEFT)     
        self.eingabesizer.Add( self.faktor_auswahl_feld,0,wx.ALIGN_LEFT)
        self.eingabesizer.Add((10, 10))
        self.eingabesizer.Add( self.button,0,wx.ALIGN_LEFT)     

        #Scrollfenster
        self.scrollw = wx.ScrolledWindow(panel, -1,
                                    style=wx.SUNKEN_BORDER, size=(250,250))
        self.scrollw.SetScrollbars(1, 1, self.platine[0]-2,self.platine[1]-2)
       
        #Sizer
        mainsizer = wx.BoxSizer(wx.VERTICAL)
        mainsizer.Add((10, 10))
        mainsizer.Add(self.eingabesizer, 0, wx.ALIGN_CENTER)
        mainsizer.Add((10, 10))
        mainsizer.Add(self.scrollw, 0, wx.ALIGN_CENTER)
        panel.SetSizer(mainsizer)

        #Bindungen
        self.Bind(wx.EVT_BUTTON, self.close, self.button)
        self.Bind(wx.EVT_CHOICE, self.EvtChoice, self.faktor_auswahl_feld)
       
        self.action()
       
    def action(self):
        self.bmp = self.get_base_bitmap(self.size)
        self.scrollw.Bind(wx.EVT_PAINT, self.on_paint)
        self.drawPicture()
        self.Refresh()

    def EvtChoice(self, event):
        if event.GetString() == '50%':
            self.zoomfaktor = 6.0
        if event.GetString() == '100%':
            self.zoomfaktor = 12.0
        if event.GetString() == '200%':
            self.zoomfaktor = 24.0
        self.action()
     
    def get_base_bitmap(self, size):
        bmp = wx.EmptyBitmap(*size)
        dc = wx.MemoryDC(bmp)
        dc.SetBackground(wx.WHITE_BRUSH)
        dc.Clear()
        dc.SelectObject(wx.NullBitmap)
        return bmp
   
    def on_paint(self, event=None):
        wx.BufferedPaintDC(self.scrollw, self.bmp, style=wx.BUFFER_VIRTUAL_AREA)
       
    def drawPicture(self):
        self.dr = wx.MemoryDC(self.bmp)
        gapx = 10
        gapy = 50
        platinex = int(self.platine[0]/self.Hpgl_Faktor*self.zoomfaktor)
        platiney = int(self.platine[1]/self.Hpgl_Faktor*self.zoomfaktor)
        #pointliste abhängig vom zoomfaktor erstellen
       
        #feldsizer = wx.BoxSizer( wx.VERTICAL )
        #self.dr = wx.PaintDC(self)
        self.dr.SetBrush(wx.Brush(colour = wx.BLACK, style = wx.SOLID))
        # Platine zeichnen
        self.dr.DrawRectangle(gapx, gapy, platinex+20, platiney+20) #schwarzes feld
        self.dr.SetPen(wx.Pen(colour = wx.WHITE, width = 1, style = wx.SOLID))
        self.dr.DrawRectangle(gapx+10,gapy+10, platinex,platiney) # platinenummriss
        # Nullpunkt cross
        # fix in x30
        nullx = 30
        nully = gapy + platiney
        self.dr.DrawLine(nullx-5,nully,nullx+5,nully)
        self.dr.DrawLine(nullx,nully-5,nullx,nully+5)
        # Bohrpunkte
        pointlist =[]
        for bohrung in self.bohrpos:
            pointlist.append((int((bohrung[0]/self.Hpgl_Faktor)*self.zoomfaktor)  + nullx , nully - int((bohrung[1]/self.Hpgl_Faktor)*self.zoomfaktor)))
        self.dr.SetBrush(wx.Brush(colour = wx.GREEN, style = wx.SOLID))
        self.dr.SetPen(wx.Pen(colour = wx.GREEN, width = 1, style = wx.SOLID))
        for point in pointlist:
            self.dr.DrawCirclePoint(point,4)
        #print pointlist   
        # gitter
        self.dr.SetPen(wx.Pen(colour = wx.WHITE, width = 1, style = wx.SOLID))
        rasterpixel = int(self.zoomfaktor*self.raster)
        #print rasterpixel
        anzahlx = int(platinex/rasterpixel)  #2,54mm raster =zoomfaktor * 2,54
        anzahly = int(platiney/rasterpixel)
        gitterpunkte = []
        for punktex in range(anzahlx+1):
            for punktey in range(anzahly+1):
                self.dr.DrawPoint(nullx + punktex * rasterpixel,nully - punktey * rasterpixel)
        self.dr.SelectObject(wx.NullBitmap)

    def close(self, event):
        self.Destroy()

def main():
    app = wx.App()
    frame = Hpgl_viewer()
    frame.Show()
    app.MainLoop()

if __name__ == "__main__":
    main()


Grüße
Mawilo

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder