Seite 1 von 1

[gelöst] Linien komplett und scrollbar darstellen

Verfasst: Montag 4. Februar 2008, 13:38
von Mawilo
Hallo,

ich habe nun das nächste Problem :cry:
Beim Zeichnen meines Weg-Zeit-Diagramms werden die vertikalen Linien nicht richtig gezeichnet. Sobald ich scrolle, sind diese wie wegradiert. Im Gegensatz zum folgenden Beispiel werden aber wenigstens die horizontalen Linien vernünftig gezeichnet.

Was muss ich machen, damit die Linien komplett und scrollbar gezeichnet werden?

Mein Beispielcode:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

import wx

wx.SetDefaultPyEncoding("iso-8859-15")


class MainFrame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent, -1, 'Weg-Zeit Diagramm', size=(1000, 700))
        graficwindowsize = 1250, 5200
        self.spWindow = wx.SplitterWindow(self, style=wx.SP_3D)
        self.top_w = wx.Panel(self.spWindow, -1, style=wx.DEFAULT)
        self.bottom_w = wx.ScrolledWindow(self.spWindow, -1, style=wx.DEFAULT)
        self.bottom_w.SetScrollbars(1, 1, graficwindowsize[0], graficwindowsize[1])
        self.spWindow.Initialize(self.top_w)
        self.spWindow.Initialize(self.bottom_w)
        self.spWindow.SetMinimumPaneSize(10)
        self.spWindow.SplitHorizontally(self.top_w, self.bottom_w, 120)
        self.graficpanel = wx.Panel(self.bottom_w, -1, style=wx.SIMPLE_BORDER)
        self.graficpanel.SetBackgroundColour(wx.WHITE)
        self.graficpanel.SetClientSize((3000, 6000))
        
        button_v = wx.Button(self.top_w, -1, label='Vertikale Linien')
        button_h = wx.Button(self.top_w, -1, label='Horizontale Linien')
        
        mainsizer = wx.BoxSizer(wx.VERTICAL)
        mainsizer.Add((10, 10))
        mainsizer.Add(button_h)
        mainsizer.Add((10, 10))
        mainsizer.Add(button_v)
        self.top_w.SetSizer(mainsizer)
        
        self.Bind(wx.EVT_BUTTON, self.createHorizontalLines, button_h)
        self.Bind(wx.EVT_BUTTON, self.createVerticalLines, button_v)
        
    def createHorizontalLines(self, event=None):
        gap = 50
        for y in range(100):
            self.dc.DrawLine(50, gap * y, 1200, gap * y)
            
    def createVerticalLines(self, event=None):
        gap = 130
        for x in range(9):
            self.dc.DrawLine(gap * x, 20, gap * x, 5000)
            
    def startGrafic(self):
        self.graficpanel.Bind(wx.EVT_PAINT, self.initGrafic)
        
    def initGrafic(self, event=None):
        self.dc = wx.PaintDC(self.graficpanel)
        
def main():
    app = wx.PySimpleApp()
    frame = MainFrame(None)
    frame.Show()
    frame.startGrafic()
    app.MainLoop()

if __name__ == '__main__':
    main()
Grüße
Mawilo

Verfasst: Montag 4. Februar 2008, 15:37
von gerold
Hallo Mawilo!

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

mfg
Gerold
:-)

Verfasst: Montag 4. Februar 2008, 16:32
von Mawilo
Hallo Gerold,

vielen Dank - das funktioniert prima. Ich werde mir das Beispiel mal auseinanderpflücken, damit ich nicht nur copy & paste mache, sondern noch was lerne :).

Grüße
Mawilo

Verfasst: Dienstag 18. März 2008, 10:35
von Mawilo
Hallo,

ich habe das Beispiel etwas angepasst. Nun möchte ich noch zusätzlich die Linien neu zeichnen können. Die "alten" Linien sollen dabei gelöscht werden. Leider wird das Panel nicht richtig gezeichnet (nur klein in der Ecke).

Wie bekomme ich das hin, dass nur die neu gezeichneten Linien dargestellt werden?

Mawilo



Edit:

Ich habe den Code nochmals modifiziert und hier abgelegt. Was fehlt, ist ein EVT_PAINT. Die Linien werden immer erst gezeichnet, wenn ich die Größe des Fensters ändere.

Vieleicht hat jemand einen Tip für mich, wie ich den EVT_PAINT auslösen kann?

Mawilo

Verfasst: Freitag 21. März 2008, 17:14
von Mawilo
Ich sitze nun schon ein paar Tage an meinem Problem und bekomme es nicht hin :cry:

Nach Aufruf der Klasse "GraphicPanel" wird zuerst das Bitmap erstellt, dann werden die Linien gezeichnet und dann der EVT_PAINT ausgelöst. Jedenfalls ist das die Reihenfolge, die zurückgegeben wird, wenn man an jede Funktion eine print-Anweisung hängt.

Ich hätte erwartet, dass die Grafik jetzt voll angezeigt wird. Ist aber leider nicht der Fall. Erst wenn ich die Fenstergröße änder, wird wieder ein EVT_PAINT ausgelöst und die Darstellung hat die gewünschte Größe.

Woran liegt es, dass die Darstellungsgröße erst nach dem zweiten Paint-Event richtig ist?


Mawilo - der so langsam graue Haare bekommt

Hier noch einmal der Code

Verfasst: Samstag 22. März 2008, 15:35
von HWK
Füge mal nach Zeile 82 (self.graphic_panel.create_lines()) folgendes ein:

Code: Alles auswählen

        self.scrolled_panel.SetSizer(self.vbox_sp)
        self.vbox_sp.Fit(self.scrolled_panel)
MfG
HWK

Verfasst: Sonntag 23. März 2008, 13:10
von Mawilo
Danke, das war der Fehler :D

Was macht das "sizer.Fit() überhaupt?


Grüße
Mawilo

Verfasst: Sonntag 23. März 2008, 21:04
von HWK
Fit(window) bzw. FitInside(window):

Code: Alles auswählen

Causes the window argument to resize to the sizer’s minimum size. The
argument is usually the window using the sizer. The FitInside()
method is similar, but instead of changing the screen display of the
window, only changes its internal representation. This is used for a window
inside a scroll panel to trigger scroll bar display.
MfG
HWK