Skip to content

pythonnet overloads difference between v2.5.2 and v3.0.1 #2197

Open
@stranger0612

Description

@stranger0612

Environment

  • Pythonnet version: 3.0.1
  • Python version: 3.9
  • Operating System: Win10
  • .NET Runtime: 4.0.30319.42000

Details

Currently i am porting a module that uses pythonnet 2.5.2 with python 3.8. One part of that module creates a new font, for .net objects, such as Labels...

In my past approach (pythonnet 2.5.2; python 3.8) i had to use the following overload to perform this action

new_font = Font.Overloads[String, Single, FontStyle](font_type, font_size, font_style)

The overload was needed, because in some combinations of the font_style, i got the following exception (for a combination that will trigger this exception, see the example at the end of the question):

new_font = Font(font_type, font_size, int(font_style))
System.ArgumentException: Ungültiger Parameter.
   bei System.Drawing.Font.CreateNativeFont()

   bei System.Drawing.Font.Initialize(FontFamily family, Single emSize, FontStyle style, GraphicsUnit unit, Byte gdiCharSet, Boolean gdiVerticalFont)

   bei System.Drawing.Font..ctor(String familyName, Single emSize, GraphicsUnit unit)

So far so good. If i use the same overload approach with pythonnet 3.0.1 and python 3.9, it wont work due the following exception.

new_font = Font.Overloads[String, Single, FontStyle](font_type, font_size, font_style)     
TypeError: No method matches given arguments for Font..ctor: (<class 'float'>, <class 'System.Drawing.FontStyle'>)

But if i skip the overload, it seems to work now? So my questions is, which approach is the "right one" to implement a robust font setter with the current pythonnet version?

For better understanding, here a minimal example to reproduce my issue

import clr
clr.AddReference("System")
clr.AddReference("System.Drawing")
from System.Drawing import Font                         
from System.Drawing import FontStyle                  
from System import String     
from System import Single

font_type = "Arial"
font_size = 12.0
font_style = FontStyle.Regular | FontStyle.Bold

# fails with pythonnet 3.0.1; works with pythonnet 2.5.2
new_font = Font.Overloads[String, Single, FontStyle](font_type, font_size, font_style)     

# works with pythonnet 3.0.1, but fails with pythonnet 2.5.2
new_font = Font(font_type, font_size, font_style)

I also created a question here in stackoverflow https://stackoverflow.com/questions/76668946/pythonnet-overloads-difference-between-v2-5-2-and-v3-0-1 (actually I copied my question and added it here)

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions