{"id":631,"date":"2016-05-31T11:27:23","date_gmt":"2016-05-31T09:27:23","guid":{"rendered":"https:\/\/blogs.autodesk.com\/dalbiminpoi\/?p=631"},"modified":"2024-09-04T12:34:50","modified_gmt":"2024-09-04T10:34:50","slug":"python-windows-form","status":"publish","type":"post","link":"https:\/\/blogs.autodesk.com\/dalbiminpoi\/2016\/05\/31\/python-windows-form\/","title":{"rendered":"Python + Windows = Data Entry in Dynamo"},"content":{"rendered":"<p>Come ogni anno maggio \u00e8 il mese non solo in cui fioriscono le rose ma anche i rilasci di software Autodesk e di conseguenza i training sulle nuove versioni.<\/p>\n<p>Nell&#8217;ambito di questi training ho pensato bene di fare qualcosa che fosse, oltre che utile ai discenti, anche divertente per me che dovevo preparare le lezioni.<\/p>\n<p>Inutile dire che in questo momento mi diverte molto sperimentare con il linguaggio Python all&#8217;interno di Dynamo per cercare di estendere le potenzialit\u00e0 dell&#8217;ambiente di programmazione grafico e fornire una alternativa al DesignScript (che devo dire non mi piace molto) come linguaggio di programmazione.<\/p>\n<p>Ho colto quindi l&#8217;occasione di una chiacchierata con una collega per dimostrare una interessante tecnica di interfaccia tra Dynamo e le API di Windows attraverso Python.<\/p>\n<p>Il problema era quello di avere una maniera per selezionare interattivamente un elemento di una lista, per esempio un codice da un elenco di identificativi di parti.<\/p>\n<p>La soluzione che avevano trovato i colleghi era scrivere un nodo in C#: trovate le informazioni su questo approccio <a href=\"http:\/\/blog.nupis.de\/autodesk-dynamo-benutzerdefinierte-bloecke-mit-dropdown-menue\/\" target=\"_blank\" rel=\"noopener\">qui<\/a> (il post \u00e8 in tedesco ma per chi come me non conosce questa lingua ci sono sempre i traduttori online).<\/p>\n<p>L&#8217;approccio funziona ma \u00e8 troppo complicato e soprattutto costringe a ricompilare il codice se cambia la lista: allora mi son detto &#8220;Proviamo a rifarlo con Python!&#8221; e nell&#8217;immagine che segue trovate il risultato di meno di 30 righe di codice.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-634 aligncenter\" src=\"https:\/\/blogs.autodesk.com\/dalbiminpoi\/wp-content\/uploads\/sites\/68\/2016\/05\/Screenshot-31_05_2016-10_45_05-300x225.png\" alt=\"Screenshot - 31_05_2016 , 10_45_05\" width=\"451\" height=\"338\" srcset=\"https:\/\/blogs.autodesk.com\/dalbiminpoi\/wp-content\/uploads\/sites\/68\/2016\/05\/Screenshot-31_05_2016-10_45_05-300x225.png 300w, https:\/\/blogs.autodesk.com\/dalbiminpoi\/wp-content\/uploads\/sites\/68\/2016\/05\/Screenshot-31_05_2016-10_45_05.png 751w\" sizes=\"auto, (max-width: 451px) 100vw, 451px\" \/><\/p>\n<p>Per ottenere questo risultato ho sfruttato le caratteristiche dell&#8217;implementazione di Python presente in Dynamo (Studio) e cio\u00e8 di IronPyton: questa implementazione \u00e8 molto ben integrata con la piattaforma Windows e .Net e questo rende possibile sfruttare quanto gi\u00e0 disponibile per creare la &#8220;form&#8221; che ci serve.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-637 aligncenter\" src=\"https:\/\/blogs.autodesk.com\/dalbiminpoi\/wp-content\/uploads\/sites\/68\/2016\/05\/Screenshot-31_05_2016-10_51_20-300x279.png\" alt=\"Screenshot - 31_05_2016 , 10_51_20\" width=\"500\" height=\"465\" srcset=\"https:\/\/blogs.autodesk.com\/dalbiminpoi\/wp-content\/uploads\/sites\/68\/2016\/05\/Screenshot-31_05_2016-10_51_20-300x279.png 300w, https:\/\/blogs.autodesk.com\/dalbiminpoi\/wp-content\/uploads\/sites\/68\/2016\/05\/Screenshot-31_05_2016-10_51_20.png 750w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/p>\n<p>Nell&#8217;immagine precedente il codice per creare la form:<\/p>\n<ul>\n<li>Righe 2-6: riferimenti alle DLL di sistema Windows<\/li>\n<li>Righe 8-9: creazione della maschera (form)<\/li>\n<li>Righe 11-16: creazione della etichetta (label) ed aggiunta alla form<\/li>\n<li>Righe 18-25: creazione dell&#8217;elenco a discesa (terribile traduzione di combo-box) ed aggiunta alla form<\/li>\n<li>Righe 22-23: popolamento della combo-box con gli elementi provenienti dalla lista in ingresso<\/li>\n<li>Riga 27: la form viene mostrata ed il programma aspetta finch\u00e9 la form rimane aperta<\/li>\n<li>Riga 29: in uscita ho l&#8217;elemento selezionato della lista<\/li>\n<\/ul>\n<p>Ovviamente \u00e8 solo un primo abbozzo (ci starebbe bene un pulsante per chiudere la form, provateci voi) ma per dare una idea di cosa si pu\u00f2 fare \u00e8 un buon inizio.<\/p>\n<p>Buon divertimento con Dynamo &amp; Python!<\/p>\n<p>PS: ovviamente attraverso le API di Windows si possono fare tante altre cose molto interessanti quali ad esempio ricavare il nome dell&#8217;utente connesso o del PC utilizzato o altro ancora<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Come ogni anno maggio \u00e8 il mese non solo in cui fioriscono le rose ma anche i rilasci di software Autodesk e di conseguenza i training sulle nuove versioni.<\/p>\n<p>Nell&#8217;ambito di questi training ho pensato bene di fare qualcosa che fosse, oltre che utile ai discenti, anche divertente per me che dovevo preparare le lezioni.<\/p>\n","protected":false},"author":320,"featured_media":634,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[381],"tags":[164,64,384,67,73,70],"class_list":["post-631","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-generale","tag-akn_include","tag-dynamo","tag-hands-on","tag-python","tag-software-development","tag-sviluppo-software"],"acf":[],"_links":{"self":[{"href":"https:\/\/blogs.autodesk.com\/dalbiminpoi\/wp-json\/wp\/v2\/posts\/631","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.autodesk.com\/dalbiminpoi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.autodesk.com\/dalbiminpoi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.autodesk.com\/dalbiminpoi\/wp-json\/wp\/v2\/users\/320"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.autodesk.com\/dalbiminpoi\/wp-json\/wp\/v2\/comments?post=631"}],"version-history":[{"count":0,"href":"https:\/\/blogs.autodesk.com\/dalbiminpoi\/wp-json\/wp\/v2\/posts\/631\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blogs.autodesk.com\/dalbiminpoi\/wp-json\/wp\/v2\/media\/634"}],"wp:attachment":[{"href":"https:\/\/blogs.autodesk.com\/dalbiminpoi\/wp-json\/wp\/v2\/media?parent=631"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.autodesk.com\/dalbiminpoi\/wp-json\/wp\/v2\/categories?post=631"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.autodesk.com\/dalbiminpoi\/wp-json\/wp\/v2\/tags?post=631"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}