Frage

in Ordnung Code:

#!/usr/bin/python

import wx
import sys

class XPinst(wx.App):
    def __init__(self, redirect=False, filename=None):
        wx.App.__init__(self, redirect, filename)
    def OnInit(self):
        frame = wx.Frame(None, -1, title='Redirect Test', size=(620,450), style=wx.STAY_ON_TOP|wx.DEFAULT_FRAME_STYLE)
        panel = wx.Panel(frame, -1)
        log = wx.TextCtrl(panel, -1, size=(500,400), style = wx.TE_MULTILINE|wx.TE_READONLY|wx.HSCROLL)
        redir=RedirectText(log)
        sys.stdout=redir
        print 'test'
        frame.Show()
        return True

class RedirectText:
    def __init__(self,aWxTextCtrl):
        self.out=aWxTextCtrl
    def write(self,string):
        self.out.WriteText(string)

app = XPinst()
app.MainLoop()

hinzugefügt:

class MyFrame(wx.Frame)
    def __init__(self, parent, id, title, size=(620,450), style=wx.STAY_ON_TOP|wx.DEFAULT_FRAME_STYLE):
        wx.Frame.__init__(self, parent, id, title, size=(620,450), style=wx.STAY_ON_TOP|wx.DEFAULT_FRAME_STYLE)

ersetzt:

frame = wx.Frame(None, -1, title='Redirect Test', size=(620,450), style=wx.STAY_ON_TOP|wx.DEFAULT_FRAME_STYLE)

mit:

frame = MyFrame(None, -1, title='Redirect Test', size=(620,450), style=wx.STAY_ON_TOP|wx.DEFAULT_FRAME_STYLE)

Nun, es nicht laufen ...

Ich möchte den MyFrame Konstruktor in der Lage sein, mehr zu rufen als einmal in meinem Code unterschiedliche Argumente zu übergeben

Ich habe versucht, viele Dinge ...

Instanziierung MyFrame mit allen Argumenten Instanziierung MyFrame und mit allen, aber Standardargumente
Konstruktor Signatur mit allen Argumenten
Konstruktor Signatur mit allen, aber Standardargumente
Aufruf Mutter Konstruktor-Methode mit allen Argumenten
Aufruf Mutter Konstruktor mit allen, aber Standardargumente

plus Tutorial http://zetcode.com/wxpython/ erwähnt ein Verfahren, bei dem die Anzahl der Standard und optionale Argumente sind anders! (Was ist der Unterschied?)

UDPATE:

„hat es sieben Parameter. Der erste Parameter keinen Standardwert hat. Die anderen sechs Parameter tun haben. Diese vier Parameter sind optional. Die ersten drei sind zwingend erforderlich.“ - http://zetcode.com/wxpython/firststeps/

UPDATE 2:

Mit Semikolon Korrektur, habe ich gerade versucht:

class MyFrame(wx.Frame):
    def __init__(self, parent, id, title, size, style):
        wx.Frame.__init__(self, parent, id, title, size, style)
  • Ich sage, was Argumente werden in (zweite Zeile)
  • Ich rufe mit den Argumenten, die in ging (dritte Zeile)

UPDATE 3:

die vollständige Fehlermeldung lautet:

Traceback (most recent call last):
  File "test.py", line 29, in <module>
    app = XPinst()
  File "test.py", line 8, in __init__
    wx.App.__init__(self, redirect, filename)
  File "/usr/lib/python2.6/dist-packages/wx-2.8-gtk2-unicode/wx/_core.py", line 7978, in __init__
    self._BootstrapApp()
  File "/usr/lib/python2.6/dist-packages/wx-2.8-gtk2-unicode/wx/_core.py", line 7552, in _BootstrapApp
    return _core_.PyApp__BootstrapApp(*args, **kwargs)
  File "test.py", line 10, in OnInit
    frame = MyFrame(None, -1, title='Redirect Test', size=(620,450), style=wx.STAY_ON_TOP|wx.DEFAULT_FRAME_STYLE)
  File "test.py", line 21, in __init__
    wx.Frame.__init__(self, parent, id, title, size, style)
  File "/usr/lib/python2.6/dist-packages/wx-2.8-gtk2-unicode/wx/_windows.py", line 497, in __init__
    _windows_.Frame_swiginit(self,_windows_.new_Frame(*args, **kwargs))
TypeError: Expected a 2-tuple of integers or a wxSize object.

Warum es nicht funktioniert hat?

War es hilfreich?

Lösung

läuft gut für mich mit einem zwicken; Sie einen Doppelpunkt nach dem Unterklasse wx.Frame Anweisung fehlen.

Ein Kommentar; wenn Sie nur „die durch“ Argumente an die Eltern initalizer, Verwendung *args und / oder **kwargs zu etwas Tipp zu speichern.

class MyFrame(wx.Frame):
    def __init__(self, *args, **kwargs):
        wx.Frame.__init__(self, *args, **kwargs)

Wenn Sie bestimmte Argumente ändern möchten oder hinzufügen, können Sie ändern nur das Wörterbuch kwargs, z.B.

class MyFrame(wx.Frame):
    def __init__(self, *args, **kwargs):
        kwargs['size']=(1000,200)
        wx.Frame.__init__(self, *args, **kwargs)

On-Dateien für die Entwicklung ausgeführt wird:

Ausführen Skripte, die Sie gerade arbeiten in der Konsole mit python, nicht pythonw. Letzteres wird nur beendet werden, wenn sie Fehler sehen und sie lala-Land schicken.

N:\Code>pythonw wxso.pyw

N:\Code>rem nothing happened.

N:\Code>python wxso.pyw
  File "wxso.pyw", line 24
    class MyFrame(wx.Frame)
                          ^
SyntaxError: invalid syntax

N:\Code>

Ein Schlüsselwort-Argumente:

class MyFrame(wx.Frame):
    def __init__(self, parent, id, title, size, style):
        #wx.Frame.__init__(self, parent, id, title, size, style) # broken
        # equivalent to:
        #wx.Frame.__init__(self, parent, id=id, title=title, pos=size, size=style)

        # the below works.
        wx.Frame.__init__(self, parent, id, title=title, size=size, style=style)

Wenn Sie Argumente als Schlüsselwörter zum Beispiel passieren Titel, Größe, Stil, ihre Position zu der Funktion, die sie tatsächlich nimmt ganz anders sein könnten. Die erste Zeile gibt „Größe“, was auch immer weist das fünfte Argument in der wx.Frame.__init__ Funktion, die wahrscheinlich nicht groß ist. Es könnte das 100. Argument sein, aber Sie verwenden Sie das Schlüsselwort, es zu sagen, wohin sie gehen.

"Optional" ist etwas vage; Keyword-Argumente Lieferung in Verzug, aber der Standard ungeeignet sein kann.

Andere Tipps

Sie verpassen die pos von Ihrem Frame.__init__ Anruf. Hier ist der Prototyp aus dem docs :

Frame.__init__(self, parent, id, title, pos, size, style, name)

Also im Grunde die Fehler sagen, dass es size erwartet ein 2-fach oder wxSize Objekt zu sein, und was du nebenbei, dass stimmt nicht überein. Ich vermute, dass diese schlich in, wenn Sie size= vom Konstruktor entfernt sich hier:

class MyFrame(wx.Frame):
    def __init__(self, parent, id, title, size, style):
        wx.Frame.__init__(self, parent, id, title, size, style)

Edit: Eine der folgenden wäre schön

        wx.Frame.__init__(self, parent, id, title, size=size, style=style)
        wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, size, style)

, sondern durch die Schlüsselwörter aus den Argumenten Weglassen Ihr Anruf in der Reihenfolge behandelt wurde übergeben, wie

        wx.Frame.__init__(self, parent, id, title, pos=size, size=style)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top