سؤال

كود حسنا:

#!/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 بيان.

تعليق واحد؛ إذا كنت فقط "تمر عبر" الحجج إلى الوالد initalizer ، فاستخدم *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__ الوظيفة ، والتي ربما ليست الحجم. قد تكون الوسيطة المائة ، لكنك تستخدم الكلمة الرئيسية لإخبارها أين تذهب.

"اختياري" غامض إلى حد ما. وسيطات الكلمات الرئيسية التوريد الافتراضي ، ولكن قد يكون الافتراضي غير مناسب.

نصائح أخرى

أنت تفتقد 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