Pregunta

código bien:

#!/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()

añadido:

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)

reemplazado:

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

por:

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

Ahora, no se ejecuta ...

Quiero ser capaz de llamar al constructor MyFrame más de una vez en mi código pasando diferentes argumentos

He intentado muchas cosas ...

instanciando MyFrame con todos los argumentos instanciando MyFrame y con todo, pero los argumentos por defecto
firma del método constructor con todos los argumentos
método constructor de la firma con todos, pero por defecto argumentos
llamando al método constructor padre con todos los argumentos
llamando al método constructor padre con todo, pero los argumentos por defecto

más el tutorial http://zetcode.com/wxpython/ menciona un método en el que el número de por defecto y los argumentos opcionales son diferentes! (¿Cuál es la diferencia?)

UDPATE:

"tiene siete parámetros. El primer parámetro no tiene un valor por defecto. Los otros seis parámetros tienen. Esos cuatro parámetros son opcionales. Los tres primeros son obligatorios." - http://zetcode.com/wxpython/firststeps/

ACTUALIZACIÓN 2:

Con la corrección de punto y coma, he intentado simplemente:

class MyFrame(wx.Frame):
    def __init__(self, parent, id, title, size, style):
        wx.Frame.__init__(self, parent, id, title, size, style)
  • Me diga qué argumentos van en la (segunda línea)
  • Me llamo con los argumentos que fueron con (tercera línea)

ACTUALIZACIÓN 3:

el mensaje de error completo es:

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.

¿Por qué no funcionó?

¿Fue útil?

Solución

funciona muy bien para mí con un pellizco; que se está perdiendo dos puntos después de su estado de cuenta wx.Frame subclases.

Uno de los comentarios; si sólo está "pasando por" argumentos al initalizer padres, el uso *args y / o **kwargs para salvar algo de tecleo.

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

Si desea modificar o añadir argumentos particulares, sólo podría modificar el kwargs diccionario, por ejemplo,

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

En la ejecución de archivos para el desarrollo:

ejecución secuencias de comandos que está trabajando en la consola, con python, no pythonw. Este último acaba de dejar cuando ve errores y enviarlos a lala-tierra.

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>

En los argumentos de palabras clave:

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)

Cuando se pasa argumentos como palabras clave, por ejemplo, título, tamaño, estilo, su posición a la función que realmente lleva a ellos podría ser totalmente diferente. La primera línea no asigna "tamaño" a lo que es el quinto argumento de la función wx.Frame.__init__, que probablemente no es el tamaño. Podría ser el argumento número 100, pero se utilice la palabra clave que le indiquen dónde ir.

"Opcional" es algo vaga; argumentos de palabra clave por defecto de suministro, pero el defecto puede ser inapropiado.

Otros consejos

Te estás perdiendo el pos de su llamada Frame.__init__. Aquí está el prototipo de la docs :

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

Así que, básicamente, el error está diciendo que espera size para ser un 2-tupla o un objeto wxSize, y lo que estaba pasando no coincide con eso. Supongo que este arrastraba en cuando retiró size= desde el constructor aquí:

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

Editar: Cualquiera de las siguientes estaría bien

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

pero omitiendo las palabras clave de los argumentos, se está manejando la llamada en el orden pasado, como

        wx.Frame.__init__(self, parent, id, title, pos=size, size=style)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top