wx.Python: Custom Dialog - wie referenziert man Werte?

Plattformunabhängige GUIs mit wxWidgets.
Antworten
CM

Sonntag 22. August 2004, 19:54

Hoi

wider mal ne kleine Frage:
Ich möchte einen Dialog direkt von wx.Dialog ableiten (sprich: selberbauen) und stehe auf dem Schlauch, bei der Frage, wie ich dann an die Werte komme.

Angenommen es gibt folgenden Code:

Code: Alles auswählen

class CutDialog(wx.Dialog):
	def __init__(self,parent):
		wx.Dialog.__init__(self,parent,-1,"title)
              # einiger Code mit sizer, der bloss langweilig ist
              # dann z.B. ein TextCtrl-Feld:
              x = wx.TextCtrl(self,-1,"")
              # etc.
Frage 1.): Wie komme ich an den Inhalt des Feldes (von x)? Bzw. Wie kann ich diesen Inhalt einer Variable self.y zuweisen?
Ist das einmal gemacht, muß es natürlich auch eine Art von GetValue()-Funktion geben. Ich nehme an, das man von wx.Dialog nichts übernehmen und nichts überschreiben kann. Aber 2.): Ist das richtig?

Also eigentlich läuft beides darauf hinaus, daß ich eine Code-Beispiel oder ein Stück spezifischer Dokumentation bräuchte. Aber auch nach einigem Suchen, bin ich nicht fündig geworden (insbesondere bei der ersten Frage, bei der zweiten, habe ich nichts gefunden und wenn niemand das Gegenteil belegt ist es ja egal ...). Weiß jemand Abhilfe?

Vielen Dank,
Christian
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Sonntag 22. August 2004, 20:44

Hi!

Wenn ich Deine erste Frage richtig verstanden habe, hast Du Dir die Antwort schon selbst gegeben:

Code: Alles auswählen

self.y = x.GetValue()
Hast Du das gemeint?

Gruß, mawe
CM

Sonntag 22. August 2004, 21:21

Hoi mawe,

Vielen Dank. Meinen Fehler hast Du zwar nicht erkennen können, aber Deine Nachricht hat mich drauf gebracht:

Ich Dummkopf hatte nämlich GetValue in __init__ stehen und nicht in der GetValue-Funktion der Dialogklasse. Konsequenz Nr.1: Ich habe das Fenster stehts zerstört, bevor ich mir die Werte geholt habe. Konsequenz Nr.2: Mein Tisch hat eine Delle und meine Stirn ziert eine Beule ;-).

Ist wohl besser, wenn ich abspeichere und den lieben Gott für heute mal nen guten Mann sein lasse ...

Schöne Woche,
Christian
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Sonntag 22. August 2004, 21:31

Hi CM,
Frage 1.): Wie komme ich an den Inhalt des Feldes (von x)? Bzw. Wie kann ich diesen Inhalt einer Variable self.y zuweisen?
ausserhalb von __init__ gar nicht mehr!
Du kannst aber schreiben

Code: Alles auswählen

class CutDialog(wx.Dialog):
    def __init__(self,parent):
        wx.Dialog.__init__(self,parent,-1,"title")
         # einiger Code mit sizer, der bloss langweilig ist
         # dann z.B. ein TextCtrl-Feld:
         self.x = wx.TextCtrl(self,-1,"")
         # etc. 
dann kannst du in Methoden von CutDialog auf self.x zugreifen, ausserhalb, von CutDialog über myCutDialog.x, wenn einer Variablen myCutDialog ein CutDialog zugewiesen wurde.
Du kannst natürlich auf alle Attribute von Dialog auch innerhalb von Methoden von CutDialog über self.attributname zugreifen, wenn es Attribute gäbe.
Hier noch ein kleines Beispiel:

Code: Alles auswählen

import wx

class CutDialog(wx.Dialog):
    def __init__(self,parent):
        wx.Dialog.__init__(self,parent,-1,"title")
        # einiger Code mit sizer, der bloss langweilig ist
        # dann z.B. ein TextCtrl-Feld:
        self.x = wx.TextCtrl(self,-1,"")
        # etc. 

class MyApp(wx.App):

    def OnInit(self):
        self.dialog = CutDialog(None)
        self.dialog.x.AppendText(u"Hallo")
        self.dialog.ShowModal()
        return True


if __name__ == "__main__":
    myApp = MyApp()

Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
CM

Mittwoch 25. August 2004, 03:28

Hoi,

wollte euch noch Feedback geben (in der Zwischenzeit bin ich nicht dazu gekommen weiter dran zu arbeiten):

Also, Dookie, Du hast natürlich recht, was __init__ und self.y angeht. Ich glaube, ich habe mich vor lauter Unwissenheit schlicht ziemlich schlecht ausgedrückt. Vielleicht wird klarer was ich wollte, wenn ich meine Lösung kurz schreibe.

So habe ich nun im GUI parent folgende Wertzuweisung:

Code: Alles auswählen

self.input_something = somethin_dialog.GetValue()
Nun kennt natürlich mein Dialog keine GetValue-Funktion, also habe ich diese geschrieben:

Code: Alles auswählen

def GetValue(self):
		return (int(self.y.GetValue()),int(self.z.GetValue()))
Zurückgegeben wird also ein tuple, was in diesem Fall gewünscht wird, weil für den nächsten Funktionsaufruf ein tuple auch recht praktisch ist. Stattdessen ist natürlich auch jede andere Form der Rückgabe möglich.

Das Ganze ist noch nicht idiotensicher: siehe die int()-Funktion, vor der nämlich nicht sichergestellt ist, daß auch in ein integer konvertiert werden kann. Aber zum Überbrücken, d.h. bevor ich mich damit beschäftige einen Validator einzubauen, muß es so herhalten. Es funktioniert aber auch bei einem komplexeren Dialog ganz gut.

Davon ab entspricht die Lösung im Dialog Deiner Angabe, Dookie. Aber wie mein zweiter Beitrag schon sagte: Ich stand so auf dem Schlauch, das man eigentlich nicht spezifisch hat helfen können. Eure Tipps waren trotzdem wertvoll. Bin halt Anfänger in Python & GUI.

Gruß,
Christian
Antworten