Seite 1 von 1

Dialog: TypeError: unbound method __init__()

Verfasst: Freitag 3. Dezember 2004, 19:33
von jens
Ich bekomme immer folgenden Fehler, wenn ich einen Dialog aufrufen will, welchen ich mit wxGlade gebastelt hab:

Code: Alles auswählen

    wx.Dialog.__init__(self, *args, **kwds)
TypeError: unbound method __init__() must be called with Dialog instance as first argument (got wxDialog instance instead)

wxDialog.py (gekürzt)

Code: Alles auswählen

class wxDialog(wx.Frame):
    def __init__(self, *args, **kwds):
        # begin wxGlade: wxDialog.__init__
        kwds["style"] = wx.DEFAULT_DIALOG_STYLE
        wx.Dialog.__init__(self, *args, **kwds)
Aufruf erfolgt über:

Code: Alles auswählen

self.dlg = wxDialog.wxDialog(self, -1)

Verfasst: Freitag 3. Dezember 2004, 19:43
von Leonidas
Also ich habe in ding (Python version von ding) folgendes gemacht:
eine Klasse von wx.Dialog erben lassen und dann sowas:

Code: Alles auswählen

wx.Dialog.__init__(self, parent, DefaultId, _('Set search methods'), size=(320, 200), style=wx.CAPTION|wx.CLOSE_BOX)
Kann es sein, dass dein wxDialog von wx.Frame erbt, aber von wx.Dialog sollte?

Verfasst: Freitag 3. Dezember 2004, 19:45
von jens
Fehler gefunden:

Code: Alles auswählen

class wxDialog(wx.Frame): 
muß heißen:

Code: Alles auswählen

class wxDialog(wx.Dialog): 
Frage mich nur, wie da wx.Frame hingekommen ist :?

Verfasst: Freitag 3. Dezember 2004, 19:46
von Dookie
Hi jens,

Du musst natürlich die __init__ Methode von wx.Frame aufrufen in der __init__ Methode von deiner wxDialog Klasse.

Code: Alles auswählen

class wxDialog(wx.Frame):
    def __init__(self, *args, **kwds):
        # begin wxGlade: wxDialog.__init__
        kwds["style"] = wx.DEFAULT_DIALOG_STYLE
        wx.Frame.__init__(self, *args, **kwds)

Gruß

Dookie

Verfasst: Freitag 3. Dezember 2004, 19:51
von jens
Mist, so einfach ist nun auch wieder nicht...

Jetzt habe ich folgenden Fehler:

Code: Alles auswählen

TypeError: Type error. Got _p_wxPyApp, expected _p_wxWindow
Es liegt wohl daran, das ich es aus meinem wx.App aufrufe... Dabei müßte ich von wx.App erst ein wx.Frame aufrufen und daraus kann ich dann meinen wx.Dialog aufrufen...

Ach was ist das kompliziert...

Da muß ich wohl erstmal ein wenig umstricken...

Verfasst: Freitag 3. Dezember 2004, 19:55
von Leonidas
jens hat geschrieben:Es liegt wohl daran, das ich es aus meinem wx.App aufrufe... Dabei müßte ich von wx.App erst ein wx.Frame aufrufen und daraus kann ich dann meinen wx.Dialog aufrufen...

Ach was ist das kompliziert...
Ja, eben, ich verstehe nicht wirklich warum mann unbedingt wx.App braucht, in GTK+ gehts auch ohne. Aber GTK+ ist auch eher ein Toolkit, statt eines Frameworks.

Du kannst aber sowas nutzen:

Code: Alles auswählen

app = wx.PySimpleApp()
das geht sehr gut, dann sparst du dir das anlegen von eigenen "dummy" wx.Apps

Verfasst: Freitag 3. Dezember 2004, 20:07
von jens
Ich hab ein kleines Beispiel gefunden: http://lists.wxwidgets.org/archive/wxPy ... 00562.html

Da kann man ganz gut sehen, das alles auf einander Aufbaut:

1. wx.App
1.1. wx.Frame
1.1.1. wx.Panel
1.1.1.1. wx.Dialog

Muß man diese Hirachie immer einhalten??? Ich blick da nicht wirklich durch...
Hier hab ich dazu was gefunden:
http://www.wxwidgets.org/manuals/2.5.3/ ... guide.html


Ich muß mir mal dieses wx.PySimpleApp() anschauen, dazu hab ich das gefunden:
http://lists.wxwidgets.org/archive/wxPy ... 00115.html
http://lists.wxwidgets.org/archive/wxPy ... 00423.html

Aber andererseits... Was ist wenn ich das Prog. erweitern will und ich habe PySimpleApp() genutzt? Hab ich mir damit die Möglichkeiten eingeschränkt???

Verfasst: Freitag 3. Dezember 2004, 20:33
von Leonidas
jens hat geschrieben:Da kann man ganz gut sehen, das alles auf einander Aufbaut:

1. wx.App
1.1. wx.Frame
1.1.1. wx.Panel
1.1.1.1. wx.Dialog

Muß man diese Hirachie immer einhalten??? Ich blick da nicht wirklich durch...
Nein, du kannst auch in einem wx.Frame direkt Widgets plazieren, dann hast du aber so einen hässlichen Hintergrund. Ich glaube die Panels braucht man auch für die Tabreihenfolge.

Und wx.Dialog ist auf der gleichen ebene wie wx.Frame, nicht unterhalb von wx.Panel. Ach, in anderen Toolkits ist das ja so einfach.
jens hat geschrieben:Ich muß mir mal dieses wx.PySimpleApp() anschauen, dazu hab ich das gefunden:
http://lists.wxwidgets.org/archive/wxPy ... 00115.html
http://lists.wxwidgets.org/archive/wxPy ... 00423.html[/url]

Aber andererseits... Was ist wenn ich das Prog. erweitern will und ich habe PySimpleApp() genutzt? Hab ich mir damit die Möglichkeiten eingeschränkt???
Nein, wenn du mehr brauchst, kannst du entweder davon erben, oder aber direkt von wx.App. wx.PySimpleApp ist nämlich nur ein minimalistischer dummy, der nur soviel kann, wie nötig. Das größte meinder Programme das wx einsetzte (1174 Zeilen, bevor ich aufgab (an den Sizern und wie man sie versteckt)) nutzt auch nur ein wx.PySimpleApp und läuft ganz gut.

Verfasst: Freitag 3. Dezember 2004, 21:19
von jens
Panels muß man wohl generell haben, wenn man Buttons hat...

Aber, zurück zu meinem Umstrickversuchen... Leider klappt es nicht...

mainFrame.py

Code: Alles auswählen

class mainFrame(wx.Frame):
    def __init__(self, *args, **kwds):
        # begin wxGlade: mainFrame.__init__
        kwds["style"] = wx.DEFAULT_FRAME_STYLE
        wx.Frame.__init__(self, *args, **kwds)

        self.mainPanel = wx.Panel(self, -1)
        
        # Menu Bar
        self.frame_1_menubar = wx.MenuBar()
        self.SetMenuBar(self.frame_1_menubar)
        self.menue_about = wx.Menu()
        self.frame_1_menubar.Append(self.menue_about, "about")
        # Menu Bar end
        self.frame_1_statusbar = self.CreateStatusBar(1, 0)
        self.label_2 = wx.StaticText(self.mainPanel, -1, "Status:")
        self.info_textfeld = wx.TextCtrl(self.mainPanel, -1, "", style=wx.TE_MULTILINE|wx.TE_LINEWRAP)
        self.button_readCD = wx.Button(self.mainPanel, -1, "CD-ROM einlesen")
HauptProgramm:

Code: Alles auswählen

class MyFrame(wx.Frame):
    def __init__(self):
        self.Frame = mainFrame.mainFrame(None, -1)
        self.Frame.Show()

        self.Frame.SetStatusText( "TEST" )

        wx.EVT_MENU(self, self.Frame.menue_about.GetId(), self.test)
        wx.EVT_BUTTON(self, self.Frame.button_readCD.GetId(), self.test)

    def test(self, event):
        print "JAU!"
        sys.exit()


app = wx.PySimpleApp()
MyFrame()
app.MainLoop()
Bei wx.EVT_MENU bekomme ich:

Code: Alles auswählen

Traceback (most recent call last):
  File "test.py", line 87, in ?
    MyFrame()
  File "test.py", line 78, in __init__
    wx.EVT_MENU(self, self.Frame.menue_about.GetId(), self.test)
AttributeError: 'Menu' object has no attribute 'GetId'
Bei wx.EVT_BUTTON das:

Code: Alles auswählen

Traceback (most recent call last):
  File "test.py", line 87, in ?
    MyFrame()
  File "test.py", line 79, in __init__
    wx.EVT_BUTTON(self, self.Frame.button_readCD.GetId(), self.test)
  File "D:\Python\Python\Lib\site-packages\wx-2.5.3-msw-ansi\wx\_core.py", line 2808, in __call__
    self.Bind(target, id1, id2, func)
  File "D:\Python\Python\Lib\site-packages\wx-2.5.3-msw-ansi\wx\_core.py", line 2774, in Bind
    target.Connect(id1, id2, et, function)
  File "D:\Python\Python\Lib\site-packages\wx-2.5.3-msw-ansi\wx\_core.py", line 2696, in Connect
    return _core_.EvtHandler_Connect(*args, **kwargs)
TypeError: Expected a pointer

Ich denke die schwirigkeit liegt darin, das ich die aus wxGlade ausgespucken *.py Dateien unberührt belassen will... Darauf dann zu referenzieren ist schon ziemlich kompliziert für mich :?

Verfasst: Freitag 3. Dezember 2004, 21:32
von jens
Also das produziert keinen Fehler:

Code: Alles auswählen

        self.Frame.menue_about.Bind(wx.EVT_BUTTON, self.test)
        self.Frame.button_readCD.Bind(wx.EVT_BUTTON, self.test)
funktioniert aber auch nicht :( Es passiert schlicht garnichts, wenn man auf dem Button klickt :(


Wahrscheinlich ist es wohl besser über eine XML-Datei zu gehen... Dann habe ich immer noch dir trennung zwischen meinem eigenem Skripten und der wxGlade ausgabe...
Nur das hab ich bisher auch nicht ans laufen bekommen :(