wx.Panel an Unterklasse übergeben => Darstellungsprobleme

Plattformunabhängige GUIs mit wxWidgets.
Antworten
WienerSchnitzel
User
Beiträge: 10
Registriert: Freitag 23. November 2012, 18:41

Hallo,

mein Ziel ist zunächst Tabs zu erzeugen, unter http://wiki.wxpython.org/Simple%20wx.Notebook%20Example habe ich auch eine gute und funktionierende Anleitung gefunden.

Ich kann das zwar in meinem Projekt implementieren, erhalte aber stets ein kleines störendes Kästchen in der linken oberen Ecke. Wenn ich andere Sizer nehme, wird der Inhalt erst gar nicht angezeigt.

Hier mein derzeitiger Code in gekürzter Form:

Code: Alles auswählen

if __name__ == '__main__':
    ArgReader = arg_reader (sys.argv)
    app = wx.App()
    interface (None, ArgReader)
    app.MainLoop()

Code: Alles auswählen

class interface(wx.Frame):

    def __init__(self, title, Argreader):
        self.frame = wx.Frame.__init__(self, None, title= "gEEX", size=(720, 680))
        self.panel = wx.Panel(self)
        self.__all_subwindows = []
        self.__all_subwindows.append (subwindow_main(self.panel, Argreader))

        for s in self.__all_subwindows:
            s.show()
        self.Show()

Code: Alles auswählen

class subwindow_main (subwindow):
    def __init__ (self, window, ArgReader):

        subwindow.__init__ (self, window)
        self.__ArgReader = ArgReader

        self.__notebook = wx.Notebook (window)
        self.__all_tabs = []

        self.__all_tabs.append (tab_EEX_prices (self.__notebook, self.__ArgReader))
        self.__notebook.AddPage (self.__all_tabs[len(self.__all_tabs) - 1], "EEX prices")
        self.__all_tabs.append (tab_EEX_prices (self.__notebook, self.__ArgReader))
        self.__notebook.AddPage (self.__all_tabs[len(self.__all_tabs) - 1], "EEX prices")

        sizer = wx.BoxSizer()
        sizer.Add(self.__notebook, 1, wx.EXPAND, border=10)
        window.SetSizer(sizer)
Um die Übersichtlichkeit zu wahren, erstelle ich für jedes Fenster und jeden Tab ein "subwindow".
Wird das Notebook genauso im in der interface-Klasse erstellt, funktioniert es tadellos. Ich vermute, dass es ein Problem beim übergeben des panels im Konstruktor an die Subwindows gibt. (Wieso nur gibt es bei python keine Pointer...)

Könnt ihr mir einen Tipp geben, wo ich den Fehler gemacht habe?

Ich danke euch.
BlackJack

@WienerSchnitzel: Könnte es daran liegen, dass Du die `Show()`-Methode nicht aufrufst? `show` ist ein anderer Name als `Show`. Ansonsten wäre ein minimales, lauffähiges Beispiel nett, welches das Problem aufzeigt.

Apropos Namen: Deine halten sich nicht an PEP8 *und* nicht mal an die Namenskonventionen von wxPython — was sich auch nicht an PEP8 hält. Das Projekt hat wenigstens die gute Ausrede, dass die Namen aus einer C++-Bibliothek übernommen wurden.

Die beiden führenden Unterstriche solltest Du durch einen ersetzen. Zwei führende Unterstriche sind nicht „private” — man kann an diese Attribute immer noch problemlos heran kommen, sondern dienen dazu Namenskollisionen bei Mehrfachvererbung zu vermeiden.

Leerzeichen zwischen Namen und Aufrufklammern sind sehr inkonsistent gesetzt. Nach PEP8 gehören da keine hin.

Der Ausdruck ``self.__all_tabs[len(self.__all_tabs) - 1]`` ist unnötig kompliziert. Es gibt in Python auch negative Indizes. Also einfach nur ``self._all_tabs[-1]``

Was meinst Du in diesem Zusammenhang mit „Pointer”? Falls Du damit den Datentypen in C oder C++ meinst: Die gibt es in Python nicht weil die unsicher sind. Letztendlich hat Python aber eine Parameterübergabesemantik die denen von Pointern *sehr* ähnlich ist. In Python werden bei Argumentübergabe und Zuweisung an Namen *nie* Werte kopiert. Also wüsste ich nicht wo da ein Problem bei der Übergabe entstehen sollte, denn im Gegensatz zu Pointern in C oder C++ kann man sich in Python immer sicher sein, dass der Name oder der übergebene Parameter zu einem gültigen Objekt aufgelöst wird. (Mal Fehler oder Eigenarten in der Implementierung von externen Modulen oder Fehlern in der Python-Laufzeitumgebung aussen vor gelassen.)
WienerSchnitzel
User
Beiträge: 10
Registriert: Freitag 23. November 2012, 18:41

Danke für deine Antwort. Du hast mich ertappt, ich komme eigentlich aus der C++ Ecke und arbeite mit Vorliebe mit Qt. Dazu eine ungewohnte IDE und eine große Portion python-Unkenntnis, dann kommt so etwas heraus.

Ich wollte gerade mal ein ausführbares Minimalbeispiel posten und habe dabei alles Nötige aus der subwindow-parent Klasse heraus geholt. Bei Qt benutze ich immer eine "subwindow"-Klasse, die alle Objekte des jeweiligen Fensters speichert und handelt und sich später um den Abwasch sorgt (wobei bei python ja fast kein Abwasch mehr anfällt).

Dabei fiel mir auf, dass ich vorher die Panels erstellt hatte, obwohl die Subwindows die Panels darstellen sollten. Das brachte das natürlich durcheinander.
Zuletzt geändert von WienerSchnitzel am Freitag 23. November 2012, 23:59, insgesamt 1-mal geändert.
BlackJack

@WienerSchnitzel: Ich verstehe nicht so ganz was das Problem ist/war?

Nur mal so aus Neugierde: Wenn Du bei C++ auf Qt setzt, warum bei Python dann wxPython und nicht PyQt?
WienerSchnitzel
User
Beiträge: 10
Registriert: Freitag 23. November 2012, 18:41

Ich habe mal den vorherigen Beitrag editiert, ich habe da etwas durcheinander gebracht.

Lediglich privat nutze ich C++ & Qt.

Ich danke euch nochmal.
Antworten