Here is the code to my first Python Form using ( SharpDevelop - www.icsharpcode.net/opensource/sd/ )
The code below runs from the EditPythonScript command
How do I get the input text from this Form and place it into a variable - after pressing the Submit button ?
thx Keith
import System.Drawing
import System.Windows.Forms
from System.Drawing import *
from System.Windows.Forms import *
class MainForm(Form):
def __init__(self):
self.InitializeComponent()
def InitializeComponent(self):
self._textBox1 = System.Windows.Forms.TextBox()
self._label1 = System.Windows.Forms.Label()
self._label2 = System.Windows.Forms.Label()
self._textBox2 = System.Windows.Forms.TextBox()
self._button1 = System.Windows.Forms.Button()
self.SuspendLayout()
#
# label1
#
self._label1.Location = System.Drawing.Point(40, 39)
self._label1.Name = "label1"
self._label1.Size = System.Drawing.Size(100, 20)
self._label1.TabIndex = 4
self._label1.Text = "label1"
#
# label2
#
self._label2.Location = System.Drawing.Point(40, 88)
self._label2.Name = "label2"
self._label2.Size = System.Drawing.Size(100, 20)
self._label2.TabIndex = 3
self._label2.Text = "label2"
#
# textBox1
#
self._textBox1.Location = System.Drawing.Point(154, 39)
self._textBox1.Name = "textBox1"
self._textBox1.Size = System.Drawing.Size(100, 20)
self._textBox1.TabIndex = 0
#
# textBox2
#
self._textBox2.Location = System.Drawing.Point(154, 88)
self._textBox2.Name = "textBox2"
self._textBox2.Size = System.Drawing.Size(100, 20)
self._textBox2.TabIndex = 1
#
# button1
#
self._button1.Location = System.Drawing.Point(154, 138)
self._button1.Name = "button1"
self._button1.Size = System.Drawing.Size(100, 23)
self._button1.TabIndex = 2
self._button1.Text = "Submit"
self._button1.UseVisualStyleBackColor = True
self._button1.Click += self.Button1Click
#
# MainForm
#
self.ClientSize = System.Drawing.Size(284, 207)
self.Controls.Add(self._button1)
self.Controls.Add(self._label2)
self.Controls.Add(self._textBox2)
self.Controls.Add(self._label1)
self.Controls.Add(self._textBox1)
self.Name = "MainForm"
self.Text = "pythontest"
self.ResumeLayout(False)
self.PerformLayout()
def Button1Click(self, sender, e):
self.Close()
if __name__ == "__main__":
form = MainForm()
form.ShowDialog()
Hi Keith,
just some notes to make this work. Currently the form (the submit button) just returns Cancel. To change this you might add this to your button1 section:
# button1
self._button1.DialogResult = System.Windows.Forms.DialogResult.OK
This will make your form return OK only when the submit button is pressed. Together with the dialog result added to your submit button, you can call your form like this and retrieve its textbox values from your form object if the result OK is returned:
if __name__ == "__main__":
form = MainForm()
if (form.ShowDialog()) == System.Windows.Forms.DialogResult.OK:
print(form._textBox1.Text)
print(form._textBox2.Text)
Btw. some note: the underscore in front indicates usually a class “internal use”, which is now not fully correct anymore
One handy thing to consider is that when you enter something into your form, the entered content is still “there” even after you have closed and reopened the form. This is true as long as your form object is not disposed using form.Dispose()
btw. you might also define some default text for your textBox… fields using this syntax:
self._textBox1.Text = "rhino"
self._textBox2.Text = "rocks"
c.
1 Like
Thanks for all your help Clement - will this Form also work on a Mac ?
Here is the now-working code as reference:
import System.Drawing
import System.Windows.Forms
from System.Drawing import *
from System.Windows.Forms import *
class MainForm(Form):
def __init__(self):
self.InitializeComponent()
def InitializeComponent(self):
self._textBox1 = System.Windows.Forms.TextBox()
self._label1 = System.Windows.Forms.Label()
self._label2 = System.Windows.Forms.Label()
self._textBox2 = System.Windows.Forms.TextBox()
self._button1 = System.Windows.Forms.Button()
self.SuspendLayout()
#
# label1
#
self._label1.Location = System.Drawing.Point(40, 39)
self._label1.Name = "label1"
self._label1.Size = System.Drawing.Size(100, 20)
self._label1.TabIndex = 4
self._label1.Text = "label1"
#
# label2
#
self._label2.Location = System.Drawing.Point(40, 88)
self._label2.Name = "label2"
self._label2.Size = System.Drawing.Size(100, 20)
self._label2.TabIndex = 3
self._label2.Text = "label2"
#
# textBox1
#
self._textBox1.Location = System.Drawing.Point(154, 39)
self._textBox1.Name = "textBox1"
self._textBox1.Size = System.Drawing.Size(100, 20)
self._textBox1.TabIndex = 0
#
# textBox2
#
self._textBox2.Location = System.Drawing.Point(154, 88)
self._textBox2.Name = "textBox2"
self._textBox2.Size = System.Drawing.Size(100, 20)
self._textBox2.TabIndex = 1
#
# button1
#
self._button1.Location = System.Drawing.Point(154, 138)
self._button1.Name = "button1"
self._button1.Size = System.Drawing.Size(100, 23)
self._button1.TabIndex = 2
self._button1.Text = "Submit"
self._button1.UseVisualStyleBackColor = True
self._button1.Click += self.Button1Click
self._button1.DialogResult = System.Windows.Forms.DialogResult.OK
#
# MainForm
#
self.ClientSize = System.Drawing.Size(284, 207)
self.Controls.Add(self._button1)
self.Controls.Add(self._label2)
self.Controls.Add(self._textBox2)
self.Controls.Add(self._label1)
self.Controls.Add(self._textBox1)
self.Name = "MainForm"
self.Text = "pythontest"
self.ResumeLayout(False)
self.PerformLayout()
def save():
key = self._textBox1.Text()
def Button1Click(self, sender, e):
self.Close()
if __name__ == "__main__":
form = MainForm()
if (form.ShowDialog()) == System.Windows.Forms.DialogResult.OK:
print(form._textBox1.Text)
print(form._textBox2.Text)
not shure, someone else owning a Mac may have to try out and report here…
c.
I think virtually none of the WindowsForms stuff will work on Mac Rhino. You’ll have to wait until they implement ETO …
eric.bunn
(Eric Bunn)
February 10, 2020, 11:23am
6
How does one download and install a copy of SmartDevelop through GitHub? I see the files for SharpDevelop but no executable to launch the software.
Eric
djordje
February 10, 2020, 1:01pm
7
Hi Eric,
Download SharpDevelop for free. A free IDE for C#, VB.NET, & Boo projects on Microsoft's .NET platform. SharpDevelop is the open-source IDE for the .NET platform. Write applications in languages including C#, VB.NET, F#, IronPython and IronRuby,...
eric.bunn
(Eric Bunn)
February 10, 2020, 2:34pm
9
Djordje,
Just installed and worked perfectly. Thank you again.
Eric
1 Like
Make sure you download version 4 not 5, as 5 only supports C# not IronPython.
On that subject, @piac how plausible would it be to add ETO support for SharpDevelop gui designer, it’s open-source project?
Currently it can detect WinForms inside any DLL and add it to the toolbox, but it doesn’t detect any forms inside ETO dll.
(feel free to split this into another thread if it requires a dedicated attention. :))
eric.bunn
(Eric Bunn)
February 10, 2020, 5:38pm
12
I downloaded version 4. I did read that 5 was for C+ only thank you.
eric.bunn
(Eric Bunn)
February 14, 2020, 3:31am
13
How does one run a sharpdevelop user form from outside of the module. I don’t want to have to paste all that code Into my main module. I’d like to keep it remote and access it from the outside.
The generated code is a class. You can call it from another script, but you do need to add some code in there to call your module.
eric.bunn
(Eric Bunn)
February 14, 2020, 11:28am
15
Thank you Ivelin. So obvious and staring me right in the face. I posted this code into another module and it called the form:
#import the Userform Class
from UserForm_MB2 import GetUFData
form = GetUFData()
if form.ShowDialog() == System.Windows.Forms.DialogResult.Cancel:
print(form._num_Ply)
print(form._num_Length)
print(form._num_Width)
print(form._num_Height)
print(form._num_HingeOff)
print(form._num_ClampOff)
print(form._num_NumTog)
print(form._num_NumHinges)
print(form._cmb_HoleType)
print(form._num_HoleD)