wx.lib.scrolledpanel scrolled nicht ?

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

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: 452
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

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

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: 452
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

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
Antworten