Вопрос

хорошо код:

#!/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.

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

Это было полезно?

Решение

Хорошо работает для меня с одним настройкой; Вы пропускаете толстую кишку после подклассного 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. Анкет Последний просто уйдет, когда увидит ошибки, и отправит их на Лала-Ланд.

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 -й аргумент, но вы используете ключевое слово, чтобы сказать ему, куда идти.

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

Другие советы

Вы упускаете 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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top