Elementübergabe bei Non-Modal Dialogen

Plattformunabhängige GUIs mit wxWidgets.
Antworten
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hoi,

wo ich gerade dabei bin, noch 'ne Frage:

Ich möchte gerne einige Dialoge so halten, daß man vom "Hauptfenster" kopieren und in den entsprechenden Dialog pasten kann.

Eine Möglichkeit ist vielleicht von "modal" (keine Ahnung wie das auf Deutsch heißt) zu "modeless" Dialogen zu wechseln. Bekomme ich auch hin, nur leider schaffe ich es dann nicht mehr die Werte, die der Dialog übergeben soll, auch tatsächlich zu übernehmen.

Bisher hatte ich stets etwas in dieser Art:

Code: Alles auswählen

if dialogue.ShowModal() == wx.ID_OK:
	self.data = dialogue.GetValue()
Wobei GetValue() dann eine Funktion der Dialogklasse ist und alle Daten z. B. in einen Tuple verpackt. Das geht wohl bei einem modeless Dialog nicht mehr - oder gibt es eine Möglichkeit, nach Drücken des OK-Buttons noch GetValue() aufzurufen?

Allgemein: Wie kann man denn diese beiden Ziele unter einen Hut bringen? Gibt es irgendwo ein gutes Beispiel? In den Demos gibt es leider nur modal-dialogs oder modless panels, die jedoch keine Daten übergeben. (Mir würde es wohl schon reichen, wenn jemand von euch einen Link auf ein gutes Beispiel weiß - ich selber habe leider nichts gefunden.)

Vielen Dank.
Gruß,
Christian
Christopy
User
Beiträge: 131
Registriert: Montag 15. Dezember 2003, 22:39

Der Unterschied zwischen einem modalen und nichtmodalen Dialog ist doch eigentlich nur der Aufruf (Show() oder ShowModal() ). D.h. solange die Instanz des Dialogs existiert kannst Du auch darauf zugreifen.
Du könntest im Konstruktor des Dialogs die aufrufende Klasse (Parent) übergeben und beim betätigen des OK Button eine Funktions des Parents aufrufen. Dabei kannst Du dann diverse Variablen übergeben...

EDIT: Eigentlich ist die Übergabe eines Parents im Konstruktor ja schon vorgesehen:
wxDialog(wxWindow* parent, wxWindowID id, const wxString& title,...)
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hi Christopy,

Danke. Punkt ist leider: Ich stehe völlig auf dem Schlauch. :oops: Muß das leider so sagen. Ich habe seid Tagen versucht EVT_CLOSE oder EVT_BUTTON zu binden. Und auch sonst rumgespielt. Ich bekomme einfach nicht das gewünschte Verhalten.

Ehrlich gesagt / gefragt: Wüßtest Du (oder sonst jemand) ein Beispiel, daß ich mal durcharbeiten kann? Das würde die Sache vereinfachen und uns nicht zig Posts hin- und herschreiben lassen.

Gruß,
Christian
Gast

Ich kann Dir nur ein eigenes Beispiel anbieten. ;)
MyFrame ruft einen MyDialog nichtmodal auf. Dabei übergibt er seine Instanz im Konstruktor von MyDialog. MyDialog wird beendet wenn der Button in MyDialog betätigt wird (oder das X in der Fensterleiste). Dazu wird OnEnde() aufgerufen. Hier wird MyFrame aufgerufen und Variablen übergeben die von MyFrame ausgegeben werden. Dann wird MyDialog unsichtbar gemacht.

Code: Alles auswählen

class MyFrame(wxFrame):
    
    def __init__(self, *args, **kwds):
        kwds["style"] = wxDEFAULT_FRAME_STYLE
        wxFrame.__init__(self, *args, **kwds)
        self.button_1 = wxButton(self, wxNewId(), "Dialog")
        
        EVT_BUTTON( self, self.button_1.GetId(), self.OnPressButton ) 
        
        sizer_1 = wxBoxSizer(wxVERTICAL)
        sizer_1.Add(self.button_1, 0, 0, 0)
        self.SetAutoLayout(1)
        self.SetSizer(sizer_1)
        sizer_1.Fit(self)
        sizer_1.SetSizeHints(self)
        self.Layout()
        
    def OnPressButton( self, event ):        
        d = MyDialog.MyDialog( self, -1, "Hallo" )
        d.Show()

    def SetVariablen( self, a, b ):
        print a
        print b


class MyDialog(wxDialog):
    
    def __init__(self, *args, **kwds):
        wxDialog.__init__(self, *args, **kwds)
        self.parent = args[0]
        self.button_1 = wxButton(self, wxNewId(), "OK")
        
        EVT_BUTTON( self, self.button_1.GetId(), self.OnEnde ) 
        EVT_CLOSE( self, self.OnEnde )
        
        sizer_1 = wxBoxSizer(wxVERTICAL)
        sizer_1.Add(self.button_1, 0, 0, 0)
        self.SetAutoLayout(1)
        self.SetSizer(sizer_1)
        sizer_1.Fit(self)
        sizer_1.SetSizeHints(self)
        self.Layout()
        
    def OnEnde( self, event ):
        self.parent.SetVariablen( 11, "Hallo" )
        self.Show( 0 )
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Aaaaah, cool, vielen vielen Dank. (Glaube, jetzt ist der Groschen gefallen.)

Das kann ich sicher so umstricken, daß es dem entspricht, was ich brauche. (Muß ich gleich heute abend mal ausprobieren! Aber noch will ich mich nicht zu früh freuen ...)

Gruß,
Christian
Antworten