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?

È stato utile?

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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top