Adattare Codice da C# a Py

ho questo codice che debbo adattare da C# a Py:

var label = new Label { Text = "Hello" };
var drawable = new Drawable { Content = myLabel };
drawable.Paint += (sender, e) => e.Graphics.DrawRectangle(Colors.Blue, new Rectangle(drawable.Size));

questo sarebbe il codice dove sto provando la modifica:

import Rhino
import System
import scriptcontext

import Rhino.UI
import Eto.Forms
import Eto.Drawing

class MyForms(Eto.Forms.Dialog[bool]):
    
    def __init__(self):
        
        self.m_lbl = Eto.Forms.Label(Text = 'Label')
        
        self.m_dwb = Eto.Forms.Drawable(Content = self.m_lbl)
        
        ### Eto.Forms.Drawable.Paint += (sender, e) => e.Graphics.DrawRectangle(System.Drawing.Color.Red, Eto.Drawing.Rectangle(Eto.Forms.Drawable.Size));
        
        layout = Eto.Forms.DynamicLayout()
        
        layout.AddRow(self.m_dwb)
        
        self.Content = layout

def RunCommand():
    MyForms().ShowModal(ui.RhinoEtoApp.MainWindow)

RunCommand()

mi ricorda qualcosa di cui si parlava in questo post:

in questo caso però si usava il Display.DrawLine. . .

qualche idea? sto da ieri :exploding_head: :exploding_head:

E cosa centra???
Il codice che hai riportato disegna un rettangolo nel contesto grafico
della label. Non centra nulla con le geometrie di rhino. Sono operazioni
di disegno eseguite nelle finestre e all’interno dei controlli (pulsanti, etichette,
liste ecc.) a livello di sistema operativo.

mi sarò sbagliato anche questa volta, per questo non sono riuscito. . .
(credevo che anche in questo caso avrei dovuto usare la classe per poi utilizzare il metodo)

esatto è quello che vorrei ottenere in Python.

drawable.Paint è l’evento che viene invocato quando il controllo label è visibile a schermo.
Dovrai scrivere una cosa del tipo

drawable.Paint += self.functPaint

E di seguito definisci la funzione (def?)

Def functPaint (self, sender, e):
e.graphics.DrawRect…

ok grazie Sergio per il suggerimento,
quindi non c’era bisogno di una classe ma di un evento.

provo a fare ciò che mi hai consigliato e poi ti faccio sapere :+1:

class Classe(Eto.Drawing.Graphics):
    def DrawRectangle(self, sender, e):
        e.Graphics.DrawRectangle(System.Drawing.Color.Red, Eto.Drawing.Rectangle(Eto.Forms.Drawable.Size))

io prima di postare la domanda avevo scritto queste righe
(non so se ci ero andato vicino, oppure ero completamente fuori strada)

No, nessuna classe aggiuntiva: la cosa è molto più semplice.
All’interno di init_ avrai definito dei controlli. Per ogni
controllo puoi attivare uno o più eventi associando ad ognuno
di loro una funzione. Tali funzioni devono essere definite
all’interno della classe come un metodo.

Segui la guida

ho posto la tua domanda a cha-gtp:
ho questo codice che debbo adattare da C# a Py:

ChatGPT

Certamente! Sono qui per aiutarti. Puoi fornirmi il codice in C# che desideri adattare a Python? Sarà un piacere assisterti nella traduzione del codice.

!(data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2738%27%20height=%2738%27/%3e)User

import Rhino import System import scriptcontext import Rhino.UI import Eto.Forms import Eto.Drawing class MyForms(Eto.Forms.Dialog[bool]): def init(self): self.m_lbl = Eto.Forms.Label(Text = ‘Label’) self.m_dwb = Eto.Forms.Drawable(Content = self.m_lbl) ### Eto.Forms.Drawable.Paint += (sender, e) => e.Graphics.DrawRectangle(System.Drawing.Color.Red, Eto.Drawing.Rectangle(Eto.Forms.Drawable.Size)); layout = Eto.Forms.DynamicLayout() layout.AddRow(self.m_dwb) self.Content = layout def RunCommand(): MyForms().ShowModal(ui.RhinoEtoApp.MainWindow) RunCommand()

ChatGPT

Ecco il codice Python equivalente al codice C# che hai fornito:

pythonCopy code

import Rhino
import scriptcontext

import Rhino.UI
import Eto.Forms
import Eto.Drawing

class MyForms(Eto.Forms.Dialog[bool]):
    def __init__(self):
        self.m_lbl = Eto.Forms.Label(Text='Label')
        self.m_dwb = Eto.Forms.Drawable(Content=self.m_lbl)
        
        # Eto.Forms.Drawable.Paint += (sender, e) => e.Graphics.DrawRectangle(System.Drawing.Color.Red, Eto.Drawing.Rectangle(Eto.Forms.Drawable.Size));
        
        layout = Eto.Forms.DynamicLayout()
        layout.AddRow(self.m_dwb)
        self.Content = layout

def RunCommand():
    MyForms().ShowModal(scriptcontext.RhinoEtoApp.MainWindow)

RunCommand()

In Python, ci sono alcune differenze rispetto a C#. Ad esempio, non è necessario importare il modulo System e la classe Rhino.UI viene importata direttamente. Inoltre, l’oggetto ui nel metodo RunCommand() non è stato definito nel codice C#, quindi ho rimosso il prefisso ui. dalla chiamata a RhinoEtoApp.MainWindow.

Tieni presente che se stai utilizzando Rhino Python, potrebbe essere necessario apportare ulteriori modifiche al codice per adattarlo all’ambiente di Rhino.

Ha saltato la parte più importante…

Mi scuso per aver saltato la parte più importante. Ecco il codice tradotto in Python:
import Rhino
import scriptcontext

import Rhino.UI
import Eto.Forms
import Eto.Drawing

class MyForms(Eto.Forms.Dialog[bool]):

def __init__(self):
    
    self.m_lbl = Eto.Forms.Label(Text = 'Etichetta')
    
    self.m_dwb = Eto.Forms.Drawable(Content = self.m_lbl)
    
    # Eto.Forms.Drawable.Paint += (sender, e) => e.Graphics.DrawRectangle(System.Drawing.Color.Red, Eto.Drawing.Rectangle(Eto.Forms.Drawable.Size));
    
    layout = Eto.Forms.DynamicLayout()
    
    layout.AddRow(self.m_dwb)
    
    self.Content = layout

def RunCommand():
MyForms().ShowModal(Rhino.UI.RhinoEtoApp.MainWindow)

RunCommand()
mi da solo questo