Seite 1 von 1

events

Verfasst: Mittwoch 9. März 2005, 14:41
von rkruggel
Hallo Liste,

ich habe ein kleines Problem welches ich jedoch nicht lösen kann.
Warscheinlich mangels 'Basiswissen'. Ich möchte euch bitten mir ein
wenig auf die Sprünge zu helfen.

Ich bin bei den ersten gehversuchen mit wxPython.

Folgendes Szenario. (der Einfachheit halbe stark gekürzt)

1) File-1: Ich habe ein wx.Frame. Darin ist ein textCtrl und zwei
staticText enthalten. Ausserdem ist noch ein wxPanel vorhanden.
Das textCtrl erhält ein event EVT_TEXT.

2) File-2: Enthält nur ein textCtrl.
Das textCtrl erhält ebenfalls ein event EVT_TEXT.

File-2 wird in das wxPanel von File-1 eingebettet. Wenn ich das
programm nun starte sehe ich zwei Textfelder und zwei
Eingabefelder. Bis hier her keine Probleme.

Was soll geschehen:
Wenn Text eingegeben wird, soll er in den dazugehörigen textCtrl's
gleichzeitig angezeigt werden. Eigentlich recht trivial. Mit dem
texCtrl und staticText aus File-1 funktioniert das auch
einwandfrei. (Also die events laufen richtig) Aber ich weis die
Daten von dem textCtrl in File-2 nicht in das staticText in File-1
anzuzeigen.

Ich hoffe ich habe das verständlich rübergebracht. Ich drehe mich
hier total im Kreis. Google hilft mir auch nicht wirklich.

Schön wäre eine Erklährung, ein kurzes Code-Fragment oder was zu
lesen. Aber bitte in deutsch.

Vielen Dank schon mal im vorraus

Verfasst: Donnerstag 10. März 2005, 08:17
von Francesco
Hallo,

kannst Du die zwei dateien hier reinposten?
Bitte

Code: Alles auswählen

 Code 
tags verwenden (nehme an, der
source ist nicht zu lange)

events

Verfasst: Donnerstag 10. März 2005, 10:20
von rkruggel
hier ist der Quellcode.

file1

Code: Alles auswählen

#Boa:Frame:Frame1

import wx
from File2 import Panel2

def create(parent):
    return Frame1(parent)

[wxID_FRAME1, wxID_FRAME1PANEL1, wxID_FRAME1PANEL2, wxID_FRAME1STATICTEXT1, 
 wxID_FRAME1STATICTEXT2, wxID_FRAME1TEXTCTRL1, 
] = [wx.NewId() for _init_ctrls in range(6)]

class Frame1(wx.Frame):
    def _init_ctrls(self, prnt):
        # generated method, don't edit
        wx.Frame.__init__(self, id=wxID_FRAME1, name='', parent=prnt,
              pos=wx.Point(507, 408), size=wx.Size(581, 319),
              style=wx.DEFAULT_FRAME_STYLE, title='Frame1')
        self.SetClientSize(wx.Size(581, 319))

        self.staticText1 = wx.StaticText(id=wxID_FRAME1STATICTEXT1,
              label='staticText1', name='staticText1', parent=self,
              pos=wx.Point(150, 32), size=wx.Size(51, 13), style=0)

        self.staticText2 = wx.StaticText(id=wxID_FRAME1STATICTEXT2,
              label='staticText2', name='staticText2', parent=self,
              pos=wx.Point(150, 72), size=wx.Size(51, 13), style=0)

        self.textCtrl1 = wx.TextCtrl(id=wxID_FRAME1TEXTCTRL1,
              name='textCtrl1',  parent=self, pos=wx.Point(30, 32),
              size=wx.Size(80, 21), style=0,  value='textCtrl1')
        self.textCtrl1.Bind(wx.EVT_TEXT, self.OnTextCtrl1Text,
              id=wxID_FRAME1TEXTCTRL1)

        self.panel1 = wx.Panel(id=wxID_FRAME1PANEL1, name='panel1',
              parent=self, pos=wx.Point(32, 72), size=wx.Size(104, 32),
              style=wx.TAB_TRAVERSAL)

        self.panel2 = Panel2(id=wxID_FRAME1PANEL2, name='panel2', 
              parent=self.panel1, pos=wx.Point(0,0), size=wx.Size(104, 32),
              style=wx.TAB_TRAVERSAL)

    def __init__(self, parent):
        self._init_ctrls(parent)

    def OnTextCtrl1Text(self, event):
        wert = self.textCtrl1.GetValue()
        self.staticText1.SetLabel(wert)
        event.Skip()


if __name__ == '__main__':
    app = wx.PySimpleApp()
    wx.InitAllImageHandlers()
    frame = create(None)
    frame.Show()

    app.MainLoop()
und der file2

Code: Alles auswählen

import wx

[wxID_PANEL2, wxID_PANEL2TEXTCTRL2,] = [wx.NewId() for _init_ctrls in range(2)]

class Panel2(wx.Panel):
    def _init_ctrls(self, prnt):
        # generated method, don't edit
        wx.Panel.__init__(self, id=wxID_PANEL2, name=u'Panel2',
              parent=prnt,
              pos=wx.Point(0, 0), size=wx.Size(107, 35),
              style=wx.TAB_TRAVERSAL)
        self.SetClientSize(wx.Size(107, 35))

        self.textCtrl2 = wx.TextCtrl(id=wxID_PANEL2TEXTCTRL2,
              name=u'textCtrl2', parent=self, pos=wx.Point(0, 0),
              size=wx.Size(80, 21), style=0, value=u'textCtrl2')
        self.textCtrl2.Bind(wx.EVT_TEXT, self.OnTextCtrl1Text,
              id=wxID_PANEL2TEXTCTRL2)

    def __init__(self, parent, id, pos, size, style, name):
        self._init_ctrls(parent)

    def OnTextCtrl1Text(self, event):
        event.Skip()
Ich hoffe das hilft. Ich komme hier wirklich nicht weiter. Ein kleiner (oder etwas größerer) Denkanstoß wäre gut.

Edit (Leonidas): Code in Python Tags gesetzt

Verfasst: Donnerstag 10. März 2005, 13:15
von Francesco
Hallo,

schon viel besser :wink:

file2:

Code: Alles auswählen

def OnTextCtrl1Text(self, event):
    wert = self.textCtrl2.GetValue()
    self.GetParent().GetParent().staticText2.SetLabel(wert)
    #oder staticText2
    event.Skip() 
mit GetParent() holst Du zuerst das Panel, davon dann die Frame
und greifst dadurch auf das static control zu.

events

Verfasst: Donnerstag 10. März 2005, 13:48
von rkruggel
:))
Dank zu sagen wäre viel zu wenig.

Vielen vielen Dank.

Mit GetParent() lag ich schon richtig bei meinen Versuchen, aber ich hatte eines zu wenig. Jetzt komme ich endlich weiter.

Verfasst: Donnerstag 10. März 2005, 15:13
von Leonidas
Francesco hat geschrieben:Bitte

Code: Alles auswählen

 Code 
tags verwenden (nehme an, der
source ist nicht zu lange)
Bitte

Code: Alles auswählen

Python
Tags verwenden, dann gibts auch Highlighting.

Re: events

Verfasst: Donnerstag 10. März 2005, 16:47
von Francesco
rkruggel hat geschrieben::))
Dank zu sagen wäre viel zu wenig.

Vielen vielen Dank.

Mit GetParent() lag ich schon richtig bei meinen Versuchen, aber ich hatte eines zu wenig. Jetzt komme ich endlich weiter.
Hallo, freut mich.

Ich verwende oft einfach nur print statements oder pycrust als Shell.
DrPython ist auch gut geeignet (Dynamic Script oder testscript
erstellen, oder prompt in Drpython starten).

mfg