differenza tra predefinito e argomenti opzionali
-
30-09-2019 - |
Domanda
Codice bene:
#!/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()
ha aggiunto:
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)
sostituito:
frame = wx.Frame(None, -1, title='Redirect Test', size=(620,450), style=wx.STAY_ON_TOP|wx.DEFAULT_FRAME_STYLE)
con:
frame = MyFrame(None, -1, title='Redirect Test', size=(620,450), style=wx.STAY_ON_TOP|wx.DEFAULT_FRAME_STYLE)
Ora, non viene eseguito ...
Voglio essere in grado di chiamare il costruttore MyFrame più di una volta nel mio codice passaggio diversi argomenti
Ho provato molte cose ...
instanciating MyFrame con tutti gli argomenti
instanciating MyFrame e con tutti, ma gli argomenti di default
metodo di costruzione di firma con tutti gli argomenti
metodo di costruzione di firma con tutti, ma di default argomenti
chiamando metodo costruttore genitore con tutti gli argomenti
chiamando il metodo costruttore genitore con tutti, ma gli argomenti di default
http://zetcode.com/wxpython/ menziona un metodo in cui il numero di Default e argomenti opzionali sono diversi! (Qual è la differenza?)
UDPATE:
"ha parametri sette. Il primo parametro non ha un valore predefinito. Gli altri sei parametri hanno. Queste quattro parametri sono opzionali. I primi tre sono obbligatori." - http://zetcode.com/wxpython/firststeps/
UPDATE 2:
Con la correzione e virgola, ho appena provato:
class MyFrame(wx.Frame):
def __init__(self, parent, id, title, size, style):
wx.Frame.__init__(self, parent, id, title, size, style)
- dico quali argomenti vanno nella (seconda linea)
- io chiamo con gli argomenti che sono andati a (terza linea)
UPDATE 3:
il messaggio di errore completo è:
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.
Perché non ha funzionato?
Soluzione
funziona bene per me con un ritocco; vi state perdendo due punti dopo la sua dichiarazione wx.Frame
sottoclasse.
Un commento; se siete solo "di passaggio" argomenti alla initalizer genitore, l'uso *args
e / o **kwargs
per risparmiare un po 'di battitura.
class MyFrame(wx.Frame):
def __init__(self, *args, **kwargs):
wx.Frame.__init__(self, *args, **kwargs)
Se si desidera modificare o aggiungere particolari argomenti, si può solo modificare il kwargs
dizionario, per esempio
class MyFrame(wx.Frame):
def __init__(self, *args, **kwargs):
kwargs['size']=(1000,200)
wx.Frame.__init__(self, *args, **kwargs)
Il file in esecuzione per lo sviluppo:
eseguire script su cui stai lavorando nella console, con python
, non pythonw
. Quest'ultimo sarà solo uscire quando vede gli errori e li inviano via a lala-terra.
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>
Su argomenti chiave:
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)
Quando si passa argomenti come parole chiave per esempio titolo, dimensioni, lo stile, la loro posizione alla funzione che in realtà prende loro potrebbe essere completamente diverso. La prima linea ci assegna "dimensione" a tutto ciò che è il quinto argomento della funzione wx.Frame.__init__
, che probabilmente non è formato. Potrebbe essere l'argomento 100 °, ma si utilizza la parola chiave per dirgli dove andare.
"opzionali" è un po 'vago; argomenti chiave impostazioni predefinite di alimentazione, ma il default potrebbe essere inappropriato.
Altri suggerimenti
Stai perdendo il pos
dalla vostra chiamata Frame.__init__
. Ecco il prototipo dal docs :
Frame.__init__(self, parent, id, title, pos, size, style, name)
Quindi, in pratica l'errore sta dicendo che si aspetta size
per essere un 2-tuple o un oggetto wxSize, e ciò che si passavano non corrisponde a quello. Sto indovinando che questo insinuato in cui è stato rimosso size=
dal costruttore qui:
class MyFrame(wx.Frame):
def __init__(self, parent, id, title, size, style):
wx.Frame.__init__(self, parent, id, title, size, style)
Modifica: entrambi dei seguenti sarebbe bene
wx.Frame.__init__(self, parent, id, title, size=size, style=style)
wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, size, style)
, ma omettendo le parole chiave dagli argomenti, la chiamata è stata gestita in ordine passato, come
wx.Frame.__init__(self, parent, id, title, pos=size, size=style)