Welchen Sizer verwenden?

Plattformunabhängige GUIs mit wxWidgets.
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

Welchen Sizer verwenden?

Beitragvon C4S3 » Dienstag 9. Oktober 2007, 08:13

Hallo und guten Morgen alle beisammen!

Gerade versuche ich, mit dem Rumspielen der diversen Widgets, die wxPython mir bietet, aufzuhören und das erste mehr oder weniger vollständige Programm zu schreiben, welches dann auch einen praktischen Nutzen erfüllen soll.
Da ich es leid bin, meine Arbeitsstunden immer in eine Excel-Liste einzutragen, dachte ich mir, dass dies doch eine nette Aufgabe wäre.

So, nun zum Layout!
Ich hätte meinen Frame (also das Hauptfenster) gerne in 3 Teile unterteilt. Das soll also ähnlich aussehen, wie in den meisten Mailprogrammen (e.g. Thunderbird): Links von oben bis unten ein Bereich, der entweder eine TreeCtrl oder so beinhaltet (darin sollen die Monate gelistet sein). Dann im rechten Bereich oben die Möglichkeit, Details zu einem Eintrag anzulegen, ein zu sehen, editieren, löschen. Und darunter eine Übersicht der Einträge / Monat.

(Misslungene Asci-Art:)

Code: Alles auswählen

+----+----------+
|    |          |
|    +----------|
|    |          |
|    |          |
+----+----------+


Mit welchem Sizer kann ich das eurer Meinung nach am besten lösen?

Danke schon mal für eure Anregungen.
Viele Grüße,
Gruß!
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Re: Welchen Sizer verwenden?

Beitragvon gerold » Dienstag 9. Oktober 2007, 09:21

C4S3 hat geschrieben:So, nun zum Layout!

Hallo C4S3!

Na gut. Auf zum Layout. ;-)

Bild

Code ausgelagert: http://paste.pocoo.org/show/5668/

mfg
Gerold
:-)

PS: Vielleicht habe ich es mit den Panels übertrieben. Aber ich will sicher stellen, dass man mit Tab von einem Panel in das nächste springen kann und es macht auch die Erstellung etwas einfacher. Ansonsten müsste man den rechten Bereich mit den zwei untereinander liegenden Panels zuerst erstellen und dann in den Splitter legen, der dafür zuständig ist, den Bereich in zwei Spalten aufzuteilen. -- Alles hat seine Vor- und Nachteile...

EDIT: Code ausgelagert.
Zuletzt geändert von gerold am Dienstag 9. Oktober 2007, 10:06, insgesamt 6-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Byte
User
Beiträge: 63
Registriert: Dienstag 26. September 2006, 07:04

Beitragvon Byte » Dienstag 9. Oktober 2007, 09:21

Hi C4S3,

da ich mich zur Zeit auch mit Sizern befasse, kann ich mir nicht vorstellen, dass das was Du willst damit funktioniert.

Evtl. entspricht das dem Aufbau des wxPython Demo, ich würde mir dazu das Demo wxSplitterWindow ansehen.

In die drei Frames die Du dir so erstellst, kommt dann jeweils ein Panel, auf dem du deine Widgets mit Sizern positionierst.

Ich finde den GridBagSizer nicht schlecht, wenn du einen tabellarischen Aufbau hast. Ansonsten sind sicher die BoxSizer das Mittel der Wahl.

Gruß Christian

edit: zu Spät!
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Dienstag 9. Oktober 2007, 09:35

Byte hat geschrieben:edit: zu Spät!

Hallo Christian!

Es ist niemals zu spät!

So sind es schon zwei gleiche Meinungen, die damit dem Fragenden mehr Sicherheit geben. Die Sicherheit, nicht nur die Meinung eines Einzelnen, der dir evt. nur etwas einreden will, angewiesen zu sein.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Byte
User
Beiträge: 63
Registriert: Dienstag 26. September 2006, 07:04

Beitragvon Byte » Dienstag 9. Oktober 2007, 09:47

Hi Gerold,

bei mir ist es halt eine Vermutung, und Du kannst es halt. Ich hätte kein Beispiel zur Hand.

Gruß Christian :oops:
BlackJack

Beitragvon BlackJack » Dienstag 9. Oktober 2007, 09:54

@gerold: Naja, man tauscht die Unsicherheit einer einzelnen Meinung gegen die Unsicherheit ob man es mit einer Verschwörung zu tun hat. ;-)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Re: Welchen Sizer verwenden?

Beitragvon gerold » Dienstag 9. Oktober 2007, 10:04

gerold hat geschrieben:Vielleicht habe ich es mit den Panels übertrieben.

Ja, ich habe übertrieben.

So funktioniert es auch -- nur viel einfacher: :oops:

Code: Alles auswählen

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

import wx

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


class MyFrame(wx.Frame):
   
    def __init__(
        self, parent = None, title = "Example", size = wx.Size(550, 420)
    ):
        wx.Frame.__init__(self, parent, -1, title, size = size)
       
        main_panel = wx.Panel(self)
       
        main_border = wx.BoxSizer(wx.VERTICAL)
        main_panel.SetSizer(main_border)
       
        vsplitter = wx.SplitterWindow(main_panel)
        main_border.Add(vsplitter, 1, wx.ALL | wx.EXPAND, 5)
       
        left_panel = wx.Panel(vsplitter)
        left_panel.SetBackgroundColour("green")
        hsplitter = wx.SplitterWindow(vsplitter)
       
        vsplitter.SplitVertically(left_panel, hsplitter)
       
        top_panel = wx.Panel(hsplitter)
        top_panel.SetBackgroundColour("blue")
        bottom_panel = wx.Panel(hsplitter)
        bottom_panel.SetBackgroundColour("yellow")
       
        hsplitter.SplitHorizontally(top_panel, bottom_panel)
       
        # Zum Testen der Tab-Taste
        txt1 = wx.TextCtrl(left_panel)
        txt2 = wx.TextCtrl(top_panel)
        txt3 = wx.TextCtrl(bottom_panel)


def main():
    app = wx.PySimpleApp()
    f = MyFrame()
    f.Center()
    f.Show()
    app.MainLoop()


if __name__ == "__main__":
    main()

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Dienstag 9. Oktober 2007, 10:20

BlackJack hat geschrieben:@gerold: Naja, man tauscht die Unsicherheit einer einzelnen Meinung gegen die Unsicherheit ob man es mit einer Verschwörung zu tun hat. ;-)

Hallo BlackJack!

Ich grüble jetzt schon mehrere Minuten... :mrgreen: Aber irgendwie fällt mir nichts ein, mit dem man dem entgegentreten könnte.

---

Ich bin Borg. Widerstand ist zwecklos.
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

Beitragvon C4S3 » Dienstag 9. Oktober 2007, 10:27

Vielen Dank für die Hilfe und Anregungen.
Da muss ich mich wohl jetzt durch kämpfen.
Mir kommt das alles sehr kompliziert vor. :oops:
Gruß!
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Dienstag 9. Oktober 2007, 10:52

C4S3 hat geschrieben:Mir kommt das alles sehr kompliziert vor. :oops:

Hallo C4S3!

Mit "wxPython in Action" wird es einfacher.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
alan
User
Beiträge: 81
Registriert: Dienstag 10. April 2007, 11:30

Beitragvon alan » Dienstag 9. Oktober 2007, 16:28

Und generell kann ich sagen, dass man ziemlich schnell reinkommt. Einfach irgendeine Idee versuchen umzusetzen. Bei Problemen bekommt man hier super Hilfestellungen 8)
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

Beitragvon C4S3 » Mittwoch 10. Oktober 2007, 14:27

Hallo nochmal!

Ich habe mir den obigen Code von gerold jetzt noch mal ganz genau angesehen und noch einige Fragen dazu. Nur um sicher zu gehen, dass ich es auch verstanden habe...

  • Also die Klasse instanziiert erst den Frame.
  • Darauf dann ein Panel (main_panel).
  • Das Panel bekommt einen vertikalen Box-Sizer (main_border) ...
  • ... und der Box-Sizer einen Splitter (vsplitter).
  • Dann wird ein weiteres Panel (left_panel) erzeugt und in den Splitter (vsplitter) gelegt.
  • Dann wird der erzeugt Splitter (vsplitter) nochmals durch einen Splitter (hsplitter) geteilt.
  • Dann werden 2 weitere Panels gemacht und durch den hsplitter separiert.
  • Und erst dann werden Widgets auf die einzelnen Panele gesetzt.

Puh, das ist ganz schön komplex. :?

Ist das immer notwendig? Ein Panel, darauf dann wieder Sachen zum Teilen, Vergrößern, .... und darin dann wieder Panels, auf denen dann Widgets platziert werden. Ich habe echt schon einen Knoten im Hirn.

Ich könnte doch aber theoretisch auch die paar Widgest die ich brauche "absolut" positionieren, oder? Da die Anwendung ausschließlich für mich ist, wäre ein R, ... ohnehin nicht gegeben.
Gruß!
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Mittwoch 10. Oktober 2007, 14:43

C4S3 hat geschrieben:Ist das immer notwendig? Ein Panel, darauf dann wieder Sachen zum Teilen, Vergrößern, .... und darin dann wieder Panels, auf denen dann Widgets platziert werden. Ich habe echt schon einen Knoten im Hirn.

Deswegen gibt es in GTK+ das IMHO exzellente ``gtk.Table``, bei dem man so Dinge wunderbar definieren kann. So etwas würde wx sicher nicht schaden.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Mittwoch 10. Oktober 2007, 15:34

Leonidas hat geschrieben:``gtk.Table``

Hallo Leonidas!

``gtk.Table`` -- das gibt es in wxPython auch.

wx.GridSizer --> Jede Zelle gleich groß. Die größte Zelle bestimmt die Größe aller Zellen.

wx.FlexGridSizer --> Die Zellen können sich in der Größe unterscheiden. Die Größe wird zeilenweise oder spaltenweise an die jeweils größte Zelle angepasst.

wx.GridBagSizer --> Wie wx.FlexGridSizer, mit dem Unterschied, dass Widgets mehrere Zellen einnehmen können.

lg
Gerold
:-)

PS: Ich glaube, ich werde mal eine kleine Anleitung schreiben.
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Mittwoch 10. Oktober 2007, 15:42

C4S3 hat geschrieben:Ist das immer notwendig? Ein Panel, darauf dann wieder Sachen zum Teilen, Vergrößern, .... und darin dann wieder Panels, auf denen dann Widgets platziert werden.

Hallo C4S3!

Ich muss mich bei dir entschuldigen. Du schriebst "...wie im Thunderbird". Das hat mich veranlasst, dir zu zeigen, wie man mit wx.SplitterWindow die Bereiche so erstellt, dass sich diese mit der Maus vergrößern und verkleinern lassen. Der gezeigte Aufwand ist nur dann nötig, wenn du das so mit den Splittern haben möchtest.

Wenn das nicht der Fall ist und du einfach nur ein dreigeteiltes Layout (ohne Splitter) haben möchtest, dann ist der Aufwand um einiges geringer (und überschaubarer).

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder