pythonnet自定义窗体的构造函数
问题描述:
我有一个从DevExpress.v17.1库扩展XtraForm的窗体自定义构造函数的问题(用C#创建的)。它有两个构造函数:pythonnet自定义窗体的构造函数
protected BaseForm()
{
InitializeComponent();
}
和
protected BaseForm(IClient client)
{
InitializeComponent();
... many code
}
哪里IClient是接口。 该表单具有很多依赖关系,并且它们都在库中编译。 当我向此表格,并试图通过代码来创建实例:
class TestApp(BaseForm):
def __init__(self):
self.Text = "Hello World From Python"
self.components = System.ComponentModel.Container()
self.AutoScaleBaseSize = Size(5, 13)
self.ClientSize = Size(392, 117)
h = WinForms.SystemInformation.CaptionHeight
self.MinimumSize = Size(392, (117 + h))
# Create the button
self.button = WinForms.Button()
self.button.Location = Point(160, 64)
self.button.Size = Size(150, 20)
self.button.TabIndex = 2
self.button.Text = "Click Me!"
# Register the event handler
self.button.Click += self.button_Click
# Create the text box
self.textbox = WinForms.TextBox()
self.textbox.Text = "Hello World"
self.textbox.TabIndex = 1
self.textbox.Size = Size(126, 40)
self.textbox.Location = Point(160, 24)
# Add the controls to the form
self.AcceptButton = self.button
self.Controls.Add(self.button)
self.Controls.Add(self.textbox)
def button_Click(self, sender, args):
"""Button click event handler"""
print ("Click")
WinForms.MessageBox.Show("Please do not press this button again.")
def run(self):
WinForms.Application.Run(self)
def Dispose(self):
self.components.Dispose()
WinForms.Form.Dispose(self)
运行初始化代码:
def main():
form = TestApp()
form.run()
form.Dispose()
if __name__ == '__main__':
main()
我有一个错误:
Traceback (most recent call last):
File "C:/Users/v.khvorostianyi/PycharmProjects/CSharp/Test.py", line 141, in <module>
main()
File "C:/Users/v.khvorostianyi/PycharmProjects/CSharp/Test.py", line 85, in main
form = TestApp()
TypeError: no constructor matches given arguments
的Python 3.6.2 = ,pythonnet = 2.3.0
.NET = 4.6.1
Pro ject需要进行自动化测试,这种形式对于工作过程是必需的。 为什么我有这样的错误?
答
BaseForm
中的构造函数被protected
访问修饰符隐藏,只能在BaseForm
及其派生类实例内部使用。因此,不能使用form = TestApp()
,因为具有空参数的构造函数是隐藏的。
至少有两种方法来解决这个问题:
0您可以使用public
访问修饰符在BaseForm
构造。
public BaseForm()
{
InitializeComponent();
}
public BaseForm(IClient client)
{
InitializeComponent();
//... many code
}
1.您可以尝试通过在派生类中使用__new__
方法重载.NET构造:即TestApp延长音素表示
def __new__(cls):
return BaseForm.__new__(cls)
在Python类TestApp(音素表示)meen。感谢您尝试帮助。 –