GetEffectiveMinSize() und wx.Dialog()

Plattformunabhängige GUIs mit wxWidgets.
Antworten
akhof
User
Beiträge: 104
Registriert: Mittwoch 11. Mai 2011, 19:07
Kontaktdaten:

Hallo!
Ich bin gerade dabei meinem Programm "den letzten Schliff zu geben", "und wollte den Dialogen sagen, wie klein sie maximal werden dürfen".
In meinem Frame war das auch gar kein Problem; hier mein Code:

Code: Alles auswählen

self.SetMinSize(self.GetEffectiveMinSize())
Wenn ich nun dieses

Code: Alles auswählen

self.GetEffectiveMinSize()
in meinem Dialog einfüge passiert leider nichts -> bzw. man kann den Dialog so stark verkleinern, dass der Dialog schon fast weg ist :cry:
Nach der Doku müsste es den Befehl auch für Dialoge geben :K

Hat jemand eine Idee, was ich versuchen könnte??

Vielen Dank schonmal im Voraus!
Gremlin
User
Beiträge: 166
Registriert: Freitag 28. Mai 2010, 23:49

Hast du es schonmal mit GetBestSize bzw. SetSizeHints versucht?
akhof
User
Beiträge: 104
Registriert: Mittwoch 11. Mai 2011, 19:07
Kontaktdaten:

Gremlin hat geschrieben:Hast du es schonmal mit GetBestSize bzw. SetSizeHints versucht?
Nein :( - das klappt leider auch nicht...
Gremlin
User
Beiträge: 166
Registriert: Freitag 28. Mai 2010, 23:49

Dann zeig doch mal deinen ganzen Code vom Dialog. Denn bei mir funktioniert das tadellos. (Btw. Für welches OS soll das sein?)
akhof
User
Beiträge: 104
Registriert: Mittwoch 11. Mai 2011, 19:07
Kontaktdaten:

Hier:

Code: Alles auswählen

class Edit_Vok(wx.Dialog):
    def __init__(self, *args, **kwds):
        kwds["style"] = wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER | wx.THICK_FRAME
        wx.Dialog.__init__(self, *args, **kwds)
        self.label_edit_vok = wx.StaticText(self, -1, "Vokabel bearbeiten")
        self.label_frage = wx.StaticText(self, -1, "Frage:")
        self.input_frage = wx.TextCtrl(self, -1, "", style=wx.TE_MULTILINE | wx.NO_BORDER)
        self.label_antwort = wx.StaticText(self, -1, "Antwort:")
        self.input_antwort = wx.TextCtrl(self, -1, "", style=wx.TE_MULTILINE | wx.NO_BORDER)
        self.label_tipp = wx.StaticText(self, -1, "Tipp:")
        self.input_tipp = wx.TextCtrl(self, -1, "", style=wx.TE_MULTILINE | wx.NO_BORDER)
        self.button_ok = wx.Button(self, wx.ID_OK, "", style=wx.NO_BORDER)
        self.db = Database()
        global wahl
        #self.lek_sel = lek_sel
        join = os.path.join
        db_p = join(join(os.environ['HOME'], ".Simpliciter"), "db.simpliciter")
        self.db.path = db_p
        self.vok = vok = self.db.get_vok_by_sel(wahl[0], wahl[1])

        self.input_frage.SetValue(vok[2])
        self.input_antwort.SetValue(vok[3])
        self.input_tipp.SetValue(vok[4])

        home = os.environ['HOME']
        self.home = os.path.join(home, ".Simpliciter")
        self.settings = settings(self.home)
        self.SetBackgroundColour(self.settings.get_colour())

        self.__set_properties()
        self.__do_layout()

        self.Bind(wx.EVT_BUTTON, self.ok_pressed, self.button_ok)
        self.Bind(wx.EVT_CLOSE,self.on_close)

    def __set_properties(self):
        #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        self.SetTitle("Vokabel bearbeiten")
        self.SetSize((505, 470))
        self.SetMinSize(self.SetSizeHints())#self.GetEffectiveMinSize())
        #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        self.label_edit_vok.SetFont(wx.Font(20, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "Sans Serif"))
        self.label_frage.SetFont(wx.Font(15, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "Sans Serif"))
        self.input_frage.SetFocus()
        self.label_antwort.SetFont(wx.Font(15, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "Sans Serif"))
        self.label_tipp.SetFont(wx.Font(15, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "Sans Serif"))


    def __do_layout(self):
        sizer_1 = wx.FlexGridSizer(2, 1, 15, 0)
        sizer_2 = wx.FlexGridSizer(3, 2, 15, 10)
        sizer_1.Add(self.label_edit_vok, 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
        sizer_2.Add(self.label_frage, 0, 0, 0)
        sizer_2.Add(self.input_frage, 0, wx.EXPAND, 0)
        sizer_2.Add(self.label_antwort, 0, 0, 0)
        sizer_2.Add(self.input_antwort, 0, wx.EXPAND, 0)
        sizer_2.Add(self.label_tipp, 0, 0, 0)
        sizer_2.Add(self.input_tipp, 0, wx.EXPAND, 0)
        sizer_2.AddGrowableRow(0)
        sizer_2.AddGrowableRow(1)
        sizer_2.AddGrowableRow(2)
        sizer_2.AddGrowableCol(1)
        sizer_1.Add(sizer_2, 1, wx.EXPAND, 0)
        sizer_1.Add(self.button_ok, 0, wx.ALIGN_RIGHT, 0)
        self.SetSizer(sizer_1)
        sizer_1.AddGrowableRow(1)
        sizer_1.AddGrowableCol(0)
        self.Layout()


    def on_close(self,event):
        self.Destroy()

    def ok_pressed(self, event):
        frage = self.input_frage.GetValue()
        antwort = self.input_antwort.GetValue()
        tipp = self.input_tipp.GetValue()
        if (not frage == "" and not antwort == ""):
            self.db.edit_vok(self.vok[0],frage, antwort, tipp)
            self.Destroy()
        else:
            wx.MessageBox(u"Ungültige Eingaben!","ERROR")
Gremlin
User
Beiträge: 166
Registriert: Freitag 28. Mai 2010, 23:49

Ach herrje.. Du warst wohl selber der Meinung den Code besser nicht zu zeigen? :roll:

Bestimmt wärs besser gewesen ich hätt dir gleich ein paar links zur Doku gegeben, aber dennoch, schau doch das nächste mal vorher nach was das für Methoden/Funktionen sind die man dir vorschlägt, bevor du sie einfach so einbaust wie du es für richtig hältst.
SetSizeHints ist eine Alternative zu SetMinSize, und keine zu GetEffectiveMinSize bzw. GetBestSize.

Aber nun zu deinem Problem, das daran liegt dass du vermutlich nicht ganz verstanden hast *wann* die Methoden genau die Wirkung haben die sie haben sollen.

GetEffectiveMinSize, wie der Name bereits sagt, gibt dir die "effektive" minimale Größe. Also das was genau in dem Moment des Aufrufs Bestand hat. Da du das machst, bevor du den Inhalt deines Dialogs anordnest, gibt dir das die Standardgröße zurück die der Dialog zum Zeitpunkt der Initialisierung hat.

Beim SetMinSize Aufruf ist es das selbe Problem. Durch die Anordnung des Inhalts wird diese Information überschrieben.

Vertausche einfach mal __set_properties und __do_layout, dann wirst du das Ergebnis bekommen das du möchtest. (Und entscheide dich für einen Aufruf von SetMinSize. Entweder den mit deiner festen Größe oder den mit GetBestSize bzw. GetEffectiveMinSize.)
akhof
User
Beiträge: 104
Registriert: Mittwoch 11. Mai 2011, 19:07
Kontaktdaten:

Oh du mein Gott - darauf hätt' ich aber auch selber kommen können :oops:
Viiieeelen Dank!! :D
Antworten