Unterschied zwischen Standard und optionalen Argumenten
-
30-09-2019 - |
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?
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)