Falsch angezeigte Grafiken

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Simpliciter
User
Beiträge: 32
Registriert: Sonntag 3. Februar 2013, 17:29

Hallo, liebe Python-Programmierer!

Ich habe ein Problem mit folgenden Grafiken, die sich fehlerhaft, beziehungsweise nur teilweise darstellen.

Bild

Wir haben dabei ein Frame mit mehreren Panels. Der Bug tritt auf, wenn ich von einem anderen Panel darauf zurückgehe.

Kann mit jemand sagen, woran das liegen könnte?

Vielen Dank, Simpliciter.
Zuletzt geändert von Simpliciter am Freitag 22. Februar 2013, 21:17, insgesamt 1-mal geändert.
BlackJack

@Simpliciter: Was heisst ein Frame mit mehreren Panels und „von einem anderen Panel […] zurückgehe[n]” in diesem Kontext?
Simpliciter
User
Beiträge: 32
Registriert: Sonntag 3. Februar 2013, 17:29

Hallo!
Ersteinmal vielen Dank für die schnelle Antwort! :D Es tut mir leid, wenn ich mich nicht ganz klar ausgedrückt habe...
Ich habe ein Frame, indem ich verschiedene Panels habe und zwischen diesen hin und her wechsle. Ich habe quasi eine Startseite. Zu und von diesem wechseln die einzelnen Panels. In diesem main-Panel (so habe ich die Startseite genannt) sind verschiedene Bitmap-Buttons. Wenn ich nun von einem Panel zum main-Panel wechsle, dann werden die darin enthaltenen BitmapButtons verschoben angezeigt (wie auf dem Bild oben zu sehen ist). Da ich mich mit wxPython relativ schlecht auskenne habe ich keine Ahnung, was das sein könnte. Auch im Internet habe ich dazu nichts finden können. :K
Ich hoffe mein Problem ist etwas verständlicher geworden...

Simpliciter
BlackJack

@Simpliciter: Vermutlich verwendest Du `wx` und seine Objekte falsch. Mehr kann man da so jetzt auch nicht sagen.
Simpliciter
User
Beiträge: 32
Registriert: Sonntag 3. Februar 2013, 17:29

BlackJack hat geschrieben:@Simpliciter: Vermutlich verwendest Du `wx` und seine Objekte falsch. Mehr kann man da so jetzt auch nicht sagen.
was meinst du damit, wenn ich fragen darf?
BlackJack

@Simpliciter: Damit meine ich das man anhand des Bildes sagen kann, das etwas schief läuft aber nicht was schief läuft. Es weiss ja niemand *was* Du da *genau* machst. Was hättest Du denn da jetzt als Antwort erwartet?
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@Simpliciter: Man kann schlecht sagen wo der Fehler in deinem Code ist, wenn du den Code nicht zeigst.
In specifications, Murphy's Law supersedes Ohm's.
Simpliciter
User
Beiträge: 32
Registriert: Sonntag 3. Februar 2013, 17:29

pillmuncher hat geschrieben:@Simpliciter: Man kann schlecht sagen wo der Fehler in deinem Code ist, wenn du den Code nicht zeigst.
wenn das das Problem ist; hier der Code, der das Wechseln "veranlasst":

Code: Alles auswählen

self.__hide_all()
        
        if bereich == "intro":
            self.panel_intro.Show()
            self.__set_titel("Willkommen bei Simpliciter!")
            self.__get_best_size()
        elif bereich == "main":
            self.abfrage = False
            self.panel_main.Show()
            self.__set_titel("Simpliciter")
            self.__get_best_size()
        elif bereich == "update":
            self.panel_update.check_updates()
            self.panel_update.Show()
            self.__set_titel("Simpliciter  -  Nach Updates suchen")
        elif bereich == "ueber":
            self.panel_ueber.Show()
            self.__set_titel(u"Simpliciter  -  Über")
            self.__get_best_size()
        elif bereich == "lizenz":
            self.panel_lizenz.start()
            self.panel_lizenz.Show()
            self.__set_titel("Simpliciter  -  Lizenz")
        elif bereich == "einstellungen":
            self.panel_einstellungen.get_old()
            self.panel_einstellungen.Show()
            self.__set_titel("Simpliciter  -  Einstellungen")
            self.__get_best_size()
        elif bereich == "admin":
            self.panel_admin.get_lek()
            self.panel_admin.Show()
            self.__set_titel("Simpliciter  -  Verwaltung")
        elif bereich == "imex":
            self.panel_imex.Show()
            self.panel_imex.refresh()
            self.__set_titel("Simpliciter  -  Import/Export")
        elif bereich == "addvok":
            self.panel_addvok.Show()
            self.__set_titel(u"Simpliciter  -  Vokabeln hinzufügen")
        elif bereich == "editvok":
            self.panel_editvok.Show()
            self.__set_titel(u"Simpliciter  -  Vokabel bearbeiten")
        elif bereich == "stats":
            self.panel_stats.get_leks()
            self.panel_stats.Show()
            self.__set_titel("Simpliciter  -  Statistik-Bereich")
        elif bereich == "abf1":
            self.panel_abf1.Show()
            self.__set_titel("Simpliciter  -  Abfrage")
        elif bereich == "abf2":
            self.panel_abf2.get_leks()
            self.panel_abf2.build()
            self.panel_abf2.Show()
            self.__set_titel("Simpliciter  -  Abfrage vorbereiten")
        elif bereich == "abf12":
            self.panel_abf_t1t2.aktual(self)
            self.panel_abf_t1t2.Show()
            self.__set_titel("Simpliciter  -  Abfrage")
        elif bereich == "abf4":
            self.panel_abf_t4.aktual(self)
            self.panel_abf_t4.Show()
            self.__set_titel("Simpliciter  -  Abfrage")
        elif bereich == "abf3":
            self.panel_abf_t3.aktual(self)
            self.panel_abf_t3.Show()
            self.__set_titel("Simpliciter  -  Abfrage")
        elif bereich == "team":
            self.panel_team.Show()
            self.__set_titel("Simpliciter  -  Das Team")
        
        
        
        
        
        elif bereich == "abf":
            self.abfrage = True
            if self.abf_type == 1 or self.abf_type == 2:
                self.call("abf12")
            elif self.abf_type == 3:
                self.call("abf3")
            elif self.abf_type == 4:
                self.call("abf4")
        elif bereich == "error":
            if not "msg" in kwrds:
                kwrds["msg"] = "Es wurde keine Fehlermeldung mitgegeben..."
            else:
                msg = kwrds["msg"]
                self.panel_error.set_msg(msg)
                self.panel_error.Show()
                self.__set_titel("Fehler!")
        else:
            self.call("error", msg=u"Es wurde versucht einen unbekannten Bereich aufzurufen: '{0}'".format(bereich))
        
        
        self.Layout()
Als erstes werden alle Panels versteckt. Anschließend wird überprüft, welces Panel angezeigt werden soll.
War das der Code, der gebraucht wird?
BlackJack

@Simpliciter: Nicht wirklich vollständig, denn man sieht ja immer noch nicht wie die Grafiken/Schaltflächen auf das Panel kommen oder was vor/beim/nach dem Anzeigen für Code läuft.

Man sieht allerdings, dass Du unnötigerweise doppelte führende Unterstriche verwendest wo eigentlich nur einzelne führende Unterstriche hingehören.

Diese elend lange ``if``/``elif``-Kaskade und sehr ähnlicher Quelltext in den einzelnen Zweigen lässt vermuten, dass man das mit OOP besser lösen kann, also kürzer und ohne die ganze Quelltext-Wiederholungen.

Anwendungen die den Inhalt von einem Fenster ständig komplett ändern finde ich auch ein bisschen ungewöhnlich. Das hat man üblicherweise nur bei „Wizard”-Dialogen. In Anwendungen werden an der Stelle normalerweise „Notebook”-Anzeigeelemente verwendet. Davon bietet `wx` gleich einen ganzen Zoo von verschiedenen Varianten aus denen der Programmierer wählen kann.
Simpliciter
User
Beiträge: 32
Registriert: Sonntag 3. Februar 2013, 17:29

Hallo!
Wir haben jetzt gefunden, wo das Problem passiert. Nachdem wir das return() hinzugefügt haben trat der Fehler nicht mehr auf. Kann uns jemand von Euch sagen, ob er weiß, wieso soetwas passieren könnte?

Code: Alles auswählen

    def __get_best_size(self):
        return()
        wx.Yield()
        self.Layout()
        self.SetMinSize(self.GetBestSize())
        self.SetSize(self.GetBestSize())
        self.Layout()
Vielen Dank schoneinmal im Vorraus!
Simpliciter
BlackJack

@Simpliciter: Hinter das ``return`` gehören keine Klammern — das ist keine Funktion.
Simpliciter
User
Beiträge: 32
Registriert: Sonntag 3. Februar 2013, 17:29

BlackJack hat geschrieben:@Simpliciter: Hinter das ``return`` gehören keine Klammern — das ist keine Funktion.
von mir aus. :? bei dem problem wird das aber nicht weiterhelfen, oder? mache ich irgendwas falsch? in den dokus steht, dass ich das so machen soll..... :|
BlackJack

@Simpliciter: In welcher Dokumentation?

Letztendlich ist es schwer zu helfen wenn man nicht weiss was Du machst. Wir wissen nicht was `self` ist, nicht wie die Panels gefüllt wurden, überhaupt wie die Struktur der GUI tatsächlich aussieht. Und ich glaube durch das komplette Programm möchte sich auch niemand durcharbeiten, also wäre es schön ein minimales, aber lauffähiges Programm zu sehen, welches das Problem demonstriert. Damit man nicht raten muss wie die Teile aussehen die Du bisher nicht gezeigt hast.

Letztendlich versuchst Du hier IMHO zu viel selber am Layout zu schrauben. Gibt es einen Grund warum ein Notebook nicht in Frage kommt?
Simpliciter
User
Beiträge: 32
Registriert: Sonntag 3. Februar 2013, 17:29

In der Dokumentation zu wx.Window stehen die Funktionen bezüglich der Größenverstellung drinnen. Was das Beispiel angeht, das werde ich im Verlauf des Abend machen und Dir/Euch gleich posten.
BlackJack

@Simpliciter: Ich meinte ja eher wo Du die Verwendung nach diesem Muster her hast. Das da dreimal `Layout()` aufgerufen wird, ist wahrscheinlich kein Problem, aber auch nicht nötig.
Simpliciter
User
Beiträge: 32
Registriert: Sonntag 3. Februar 2013, 17:29

Das habe ich hinzugefügt in der Hoffnung, dass das was bringt, aber leider nicht :(

Das Problem tritt wie gesagt dann auf, wenn ich die Skripte oben angewendet habe. Hat jemand eine Idee warum?
Antworten