разница между стандартными и необязательными аргументами - PullRequest
2 голосов
/ 20 августа 2010

хорошо код:

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

добавлены:

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)

заменен:

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

с:

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

Так вот, он не запускается ...

Я хочу иметь возможность вызывать конструктор MyFrame более одного раза в моем коде, передавая разные аргументы

Я пробовал много вещей ...

создание экземпляра MyFrame со всеми аргументами создание экземпляра myFrame и всех, кроме аргументов по умолчанию
подпись метода конструктора со всеми аргументами
подпись метода конструктора со всеми, кроме аргументов по умолчанию
вызов метода родительского конструктора со всеми аргументами
вызов метода родительского конструктора со всеми, кроме аргументов по умолчанию

плюс учебник http://zetcode.com/wxpython/ упоминает метод, в котором количество аргументов по умолчанию и необязательных аргументов различаются! (какая разница?)

UDPATE:

"он имеет семь параметров. Первый параметр не имеет значения по умолчанию. Остальные шесть параметров имеют. Эти четыре параметра являются необязательными. Первые три являются обязательными." - http://zetcode.com/wxpython/firststeps/

ОБНОВЛЕНИЕ 2:

С исправлением точки с запятой я только что попробовал:

class MyFrame(wx.Frame):
    def __init__(self, parent, id, title, size, style):
        wx.Frame.__init__(self, parent, id, title, size, style)
  • Я говорю, какие аргументы идут (вторая строка)
  • Я звоню с аргументами, которые вошли (третья строка)

ОБНОВЛЕНИЕ 3:

полное сообщение об ошибке:

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.

Почему это не сработало?

Ответы [ 2 ]

1 голос
/ 20 августа 2010

Вы пропускаете pos из вашего Frame.__init__ звонка.Вот прототип из документов :

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

Таким образом, в основном ошибка говорит о том, что он ожидает, что size будет объектом с двумя кортежами или wxSize, а то, что вы передаваете, нене соответствует этому.Я предполагаю, что это закралось, когда вы удалили size= из конструктора здесь:

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

Редактировать: Любое из следующего будет хорошо

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

, но пропускаяключевые слова из аргументов, ваш вызов обрабатывается в порядке передачи, как

        wx.Frame.__init__(self, parent, id, title, pos=size, size=style)
1 голос
/ 20 августа 2010

Работает нормально для меня с одним твиком;после вашего подкласса wx.Frame вы пропустите двоеточие.

Один комментарий;если вы просто «передаете» аргументы родительскому инициализатору, используйте *args и / или **kwargs, чтобы сохранить некоторую типизацию.

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

Если вы хотите изменить или добавить определенные аргументы, выможет просто изменить словарь kwargs, например

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

При запуске файлов для разработки:

Запустить сценарии, над которыми вы работаете, в консоли, с помощью python,не pythonw.Последний просто выйдет, когда увидит ошибки и отправит их в lala-land.

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>

По аргументам ключевых слов:

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)

Когда вы передаете аргументы в качестве ключевых слов, напримерназвание, размер, стиль, их положение в функции, которая фактически их принимает, может быть совершенно другим.Первая строка там назначает «размер» какому-либо пятому аргументу в функции wx.Frame.__init__, который, вероятно, не является размером.Это может быть 100-й аргумент, но вы используете ключевое слово, чтобы указать ему, куда идти.

«Необязательно» несколько расплывчато; ключевые аргументы предоставляют значения по умолчанию, но значение по умолчанию может быть неуместным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...