[gelöst] Linien komplett und scrollbar darstellen

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Benutzeravatar
Mawilo
User
Beiträge: 452
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

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
Zuletzt geändert von Mawilo am Sonntag 23. März 2008, 20:27, insgesamt 2-mal geändert.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo Mawilo!

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

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Mawilo
User
Beiträge: 452
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

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
Benutzeravatar
Mawilo
User
Beiträge: 452
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

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
Benutzeravatar
Mawilo
User
Beiträge: 452
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

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
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

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
Benutzeravatar
Mawilo
User
Beiträge: 452
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Danke, das war der Fehler :D

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


Grüße
Mawilo
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

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
Antworten