wxPython-> Zugriff auf Methoden aus anderem Modul/Classe

Plattformunabhängige GUIs mit wxWidgets.
Antworten
macpes
User
Beiträge: 7
Registriert: Dienstag 13. Mai 2003, 08:24

Dienstag 13. Mai 2003, 13:18

Hallo!

Ich bin neu in Python und habe noch so meine Probleme. In meinem
Programm habe ich unter anderem die Module "wxPanel1" und "wxPanel4".

1.) Ich möchte von wxPanel1 aus eine Methode in wxPanel4 ausführen.
2.) Ich möchte auf ein wxTextCtrl-Feld in wxPanel4 von wxPanel1 aus
zugreifen.

Beides bekomme ich zur Zeit leider noch nicht hin. :evil:
Vielleicht könnt Ihr mir weiter helfen.

Modul wxPanel4.py

Code: Alles auswählen

#Boa:FramePanel:wxPanel4

from wxPython.wx import *
import daten
import serial

[wxID_WXPANEL4, wxID_WXPANEL4BUTTON_GETINFO, wxID_WXPANEL4GAUGE1, 
 wxID_WXPANEL4TEXTPARAMETER, 
] = map(lambda _init_ctrls: wxNewId(), range(4))


class wxPanel4(wxPanel):
    def _init_utils(self):
        # generated method, don't edit
        pass

    def _init_ctrls(self, prnt):
        # generated method, don't edit
        wxPanel.__init__(self, id=wxID_WXPANEL4, name='', parent=prnt,
              pos=wxPoint(193, 233), size=wxSize(800, 460),
              style=wxTAB_TRAVERSAL)
        self._init_utils()
        self.SetClientSize(wxSize(792, 426))

        self.textParameter = wxTextCtrl(id=wxID_WXPANEL4TEXTPARAMETER,
              name='textParameter', parent=self, pos=wxPoint(8, 40),
              size=wxSize(784, 384), style=wxTE_MULTILINE,
              value='noch keine Daten ausgelesen')
        self.textParameter.SetToolTipString('Hier werden die ausgelesenen Parameter angezeigt.')

        self.button_getInfo = wxButton(id=wxID_WXPANEL4BUTTON_GETINFO,
              label='>>> Informationen auslesen', name='button_getInfo',
              parent=self, pos=wxPoint(8, 8), size=wxSize(144, 23), style=0)
        self.button_getInfo.SetToolTipString('Informationen aus dem Automaten holen')
        EVT_BUTTON(self.button_getInfo, wxID_WXPANEL4BUTTON_GETINFO,
              self.OnButton_getinfoButton)

        self.gauge1 = wxGauge(id=wxID_WXPANEL4GAUGE1, name='gauge1',
              parent=self, pos=wxPoint(168, 13), range=100, size=wxSize(464,
              16), style=wxGA_HORIZONTAL, validator=wxDefaultValidator)

    def __init__(self, parent, id, pos, size, style, name):
        self._init_ctrls(parent)
       
 #--Informationen auslesen--------------------------------------------
    def OnButton_getinfoButton(self, event):
        try:#Schnittstelle öffnen
            ser=serial.Serial(daten.port, daten.baudrate, daten.bytesize,
                daten.parity, daten.stopbits, daten.timeout, daten.xonxoff,
                daten.rtscts)
        except:
            #Fehlermeldung wenn der Com-Port nicht geöffnet werden kann
            dlg = wxMessageDialog(self, 'Schnittstellenport kann nicht geöffnet werden.\nDie Schnittstelle wird evtw. bereits von einem anderen Programm verwendet.',
                  'Fehlermeldung', wxOK | wxICON_INFORMATION)
            try:
                dlg.ShowModal()
            finally:
                dlg.Destroy()
            return
        
        range=158 #Anzahl der erwarteten Zeilen
        position=0
        self.gauge1.SetRange(range)
        self.textParameter.Clear() #alter Feldinhalt löschen
        ser.write("get_para") #Kommando "Parameterliste anfordern"    
        while 1:
            Text = ser.readline()
            if not Text: break             
            self.textParameter.WriteText(Text)
            position += 1
            if position > 158: position = 158
            self.gauge1.SetValue(position)
        ser.close() #Schnittstelle schliessen
        Bemerkung="Anzahl der Zeilen: " + str(position)
        self.textParameter.WriteText(Bemerkung)
            
        #empfangene Daten in einer Datei speichern
        dlg = wxFileDialog(self, "Datei auswaehlen", ".", "", "*.*", wxOPEN)
        try:
            if dlg.ShowModal() == wxID_OK:
                filename = dlg.GetPath()
                # Your code
                self.textParameter.SaveFile(filename)
                self.FileName=filename
        finally:
            dlg.Destroy()
Modul wxPanel1.py

Code: Alles auswählen

#Boa:FramePanel:wxPanel1

#Karteikarte Informationen

from wxPython.wx import *
from wxPython.grid import *
from wxPanel4 import *
import wxDialog3
import daten
import serial
...
...
class wxPanel1(wxPanel):
...
...
    #--Informationen auslesen---------------------------------------------
    def OnButton_getDaten(self, event):  
        wxPanel4.OnButton_getinfoButton(self, event)
        #event.Skip()

    #--Feldinhalt löschen---------------------------------------------
    def OnButton_delDaten(self, event):  
        wxPanel4.textParameter.Clear()
        #event.Skip()
So einfach geht´s wohl nicht. Kann mir jemand einen Hinweis geben wie ich dieses Problem am besten löse?

Danke!

Grüße
Markus
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Dienstag 13. Mai 2003, 13:29

macpes hat geschrieben:Kann mir jemand einen Hinweis geben wie ich dieses Problem am besten löse?
Welches Problem? Bitte immer angeben, was nicht geht bzw. welche Fehlermeldungen kommen. Nicht jeder wird bereit sein, Deinen Code Zeile für Zeile zu lesen oder ihn zum laufen zu bringen.
Jan
macpes
User
Beiträge: 7
Registriert: Dienstag 13. Mai 2003, 08:24

Dienstag 13. Mai 2003, 14:09

Mein Problem ist folgendes:

1.) In wxPanel4 funktioniert alles Wunderbar. Wenn ich z.Bsp. den
dazugeörigen Button "button_getInfo" drücke wird die
Methode "OnButton_getinfoButton(self, event)" auch fehlerfrei ausgeführt.

Meine Frage hierzu: Wie kann ich von wxPanel1 aus dieselbe Methode aufrufen :?:
Im Klartext: Wenn ich in wxPanel1 einen Button drücke möchte ich das die Methode "OnButton_getinfoButton(self,event)" aus wxPanel4 ausgeführt wird.

Bei meinem Beispielcode "wxPanel1" bekomme ich beim drücken des Buttons in wxPanel1 folgende Fehlermeldung:

TypeError: unbound method OnButton_getinfoButton() must be called with wxPanel4 instance as first argument (got wxPanel1 instance instead)

2.) In wxPanel4 habe ich ein wxTextCtrl-Feld dessen Inhalt ich von wxPanel1 aus löschen möchte. Mit "wxPanel4.textParameter.Clear()" schneint das nicht zu Funktionieren.

Fehlermeldung hier: AttributeError: class wxPanel4 has no attribute 'textParameter'

Gruß
Markus
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Dienstag 13. Mai 2003, 15:00

Hallo!
Ich selbst hab' von wxPython leider keine Ahnung, deswegen nur grobe Hinweise von mir.

Ich vermisse irgendwie ein Instanz von wxPanel4. Du arbeitest in wxPanel1.py direkt auf der Klasse. Ich hätte jetzt eher sowas erwartet:

Code: Alles auswählen

class wxPanel1(wxPanel):
...
...
	def __init__(self):
		self.wxp4 = wxPanel4(......)
    #--Informationen auslesen---------------------------------------------
    def OnButton_getDaten(self, event): 
        self.wxp4.OnButton_getinfoButton(event)
        #event.Skip()
Zur 2. Fehlermeldung: Da Du keine Instanz von wxPanel4 erzeugst, wird __init__() auch nie aufgerufen und somit auch nicht _init_ctrls(), aber in letzterer Methode wird offensichlich self.textParameter erstmalig erzeugt. Ohne Instanz gibt es also auch kein self.textParameter. Tipp: Pack' mal ein paar print-Anweisungen hier und da rein. so kannst Du verfolgen, welche Funktionen und Methoden überhaupt abgearbeitet werden.

Aber wie gesagt, ich weiß nicht, wie wxPython tickt, deswegen kann obiges Blödsinn sein. Vielleicht ließt Mickey zufällig mit und weiß mehr. Er hat schließlich ein Buch zum Thema geschrieben ;-)

BTW: Bei den Fehlermeldungen wird auch immer die Zeilennummer ausgegeben. Ist immer sehr hilfreich, dann im geposteten Code anzugeben, wo die Fehlermeldung erfolgte.

Jan
Antworten