الفرق بين الوسيطات الافتراضية والاختيارية
-
30-09-2019 - |
سؤال
كود حسنا:
#!/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)