Question

Code correct:

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

ajouté:

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)

remplacé:

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

avec:

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

Maintenant, il ne fonctionne pas ...

Je veux être en mesure d'appeler le constructeur de MyFrame plus d'une fois dans mon code qui passe différents arguments

J'ai essayé beaucoup de choses ...

instanciation MyFrame avec tous les arguments instancier myFrame et avec tous, mais les arguments par défaut
signature de la méthode constructeur avec tous les arguments
signature de la méthode constructeur avec tous, mais les arguments par défaut
appelant la méthode constructeur parent avec tous les arguments
appelant la méthode constructeur parent avec tous, mais les arguments par défaut

ainsi que le tutoriel http://zetcode.com/wxpython/ mentionne un procédé dans lequel le nombre de par défaut et les arguments facultatifs sont différents! (Quelle est la différence?)

UDPATE:

« il a des paramètres sept. Le premier paramètre n'a pas de valeur par défaut. Les six autres paramètres ont. Ces quatre paramètres sont facultatifs. Les trois premiers sont obligatoires. » - http://zetcode.com/wxpython/firststeps/

Mise à jour 2:

Avec correction point-virgule, je viens d'essayer:

class MyFrame(wx.Frame):
    def __init__(self, parent, id, title, size, style):
        wx.Frame.__init__(self, parent, id, title, size, style)
  • Je dis quels arguments vont dans (deuxième ligne)
  • J'appelle les arguments qui sont allés au (troisième ligne)

UPDATE 3:

le message d'erreur complet est:

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.

Pourquoi ne pas travailler?

Était-ce utile?

La solution

fonctionne très bien pour moi avec un coup sec; vous manque deux points après votre déclaration de sous-classé wx.Frame.

Un commentaire; si vous êtes juste « en passant par » arguments à la initalizer mère, l'utilisation *args et / ou **kwargs pour économiser quelques.

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

Si vous souhaitez modifier ou ajouter des arguments particuliers, vous pouvez simplement modifier le dictionnaire kwargs, par exemple

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

Sur les fichiers en cours d'exécution pour le développement:

Exécuter les scripts que vous travaillez dans la console, avec python, pas pythonw. Ce dernier sera tout simplement quitter quand il voit les erreurs et les envoyer à lala-terre.

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>

Sur arguments clés:

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)

Lorsque vous passez des arguments comme mots clés par exemple titre, la taille, le style, leur position à la fonction qui prend effectivement eux pourrait être totalement différent. La première ligne, il attribue la « taille » à tout ce qui est le cinquième argument dans la fonction wx.Frame.__init__, ce qui est probablement pas la taille. Il pourrait être le 100ème argument, mais vous utilisez le mot-clé pour lui dire où aller.

"option" est un peu vague; arguments clés par défaut d'approvisionnement, mais la valeur par défaut peut être inapproprié.

Autres conseils

Vous êtes absent le pos de votre appel Frame.__init__. Voici le prototype de la docs :

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

Donc, fondamentalement, l'erreur dit qu'il attend size soit un 2-tuple ou objet wxSize, et ce que vous passiez ne correspond pas. Je devine que ce rampé lorsque vous avez retiré size= du constructeur ici:

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

Edit: un des problèmes suivants serait bien

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

mais en omettant les mots-clés des arguments, votre appel est en cours de traitement dans l'ordre passé, comme

        wx.Frame.__init__(self, parent, id, title, pos=size, size=style)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top