1

I am trying to add UserControl to a WinForm using PythonNet but not having any luck. For testing, I added a button and that shows up but not the UserControl and I am not sure what I a doing wrong.

All the code can be placed into one py file. I broke into a few sections hoping it will be easier to read.

USER CONTROL

class Field(WinForms.UserControl):

    def __init__(self):
        self.InitializeComponents()
        pass

    def InitializeComponents(self):
        self.components = System.ComponentModel.Container()

        self.label = WinForms.Label()
        self.textBox = WinForms.Label()


        ## Label
        # self.label.Anchor = ((WinForms.AnchorStyles)(
        #     ((WinForms.AnchorStyles.Top | WinForms.AnchorStyles.Bottom)
        #      | WinForms.AnchorStyles.Left)))
        self.label.AutoSize = True
        self.label.Location = System.Drawing.Point(3, 7)
        self.label.Name = "label"
        self.label.Size = System.Drawing.Size(29, 13)
        self.label.TabIndex = 0
        self.label.Text = "label"


        ## TextBox
        # self.textBox.Anchor = ((WinForms.AnchorStyles)(
        #     (((WinForms.AnchorStyles.Top | WinForms.AnchorStyles.Bottom)
        #       | WinForms.AnchorStyles.Left)
        #      | WinForms.AnchorStyles.Right)))
        # self.textBox.Location = System.Drawing.Point(115, 3)
        self.textBox.Name = "textBox"
        self.textBox.Size = System.Drawing.Size(260, 20)
        self.textBox.TabIndex = 1


        ## Control
        self.AutoScaleMode = WinForms.AutoScaleMode.Font
        self.Controls.Add(self.textBox)
        self.Controls.Add(self.label)
        self.Name = "Field"
        self.Size = System.Drawing.Size(378, 26)
        # self.PerformLayout()

PARENT FORM

class ParentForm(WinForms.Form):

    def __init__(self):
        self.InitializeComponents()

    # region Form Design

    def InitializeComponents(self):
        self.components = System.ComponentModel.Container()
        self.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
        self.ClientSize = System.Drawing.Size(385, 180)
        self.Name = "ParentForm"
        self.Text = "Parent Form"


        self.field1 = Field()
        self.field1.Location = Point(13, 13)
        self.field1.Name = "field1"
        self.field1.Size = Size(378, 26)
        self.field1.TabIndex = 1
        self.Controls.Add(self.field1)


        self.button1 = WinForms.Button()
        self.button1.Location = Point(13, 50)
        self.button1.Size = Size(50, 20)
        self.button1.Text = "Button1"
        self.Controls.Add(self.button1)
        pass


    def Dispose(self):
        self.components.Dispose()
        WinForms.Form.Dispose(self)

ENTRY POINT AND IMPORTS

import clr
import System
import System.Windows.Forms as WinForms

from System.IO import File
from System.Text import Encoding
from System.Drawing import Color, Point, Size
from System.Threading import ApartmentState, Thread, ThreadStart



def appThread():
    app = ParentForm()
    WinForms.Application.Run(app)
    app.Dispose()


def appEntry():
    thread = Thread(ThreadStart(appThread))
    thread.SetApartmentState(ApartmentState.STA)
    thread.Start()
    thread.Join()


if __name__ == '__main__':
    appEntry()
denfromufa
  • 5,610
  • 13
  • 81
  • 138
Musa Biralo
  • 479
  • 1
  • 5
  • 16
  • you may need to define `__namespace__`: https://github.com/pythonnet/pythonnet/blob/master/src/tests/test_subclass.py – denfromufa Feb 07 '18 at 15:33

0 Answers0