IronPython / PythonNET - Propiedades de Formularios WinForms (Form)


Introducción


Vamos a explorar las principales propiedades de Form que podemos configurar en nuestras aplicaciones WinForms.

Empecemos creando una sencilla aplicación WinForms IronPython:

# -*- coding: utf-8 -*-

import clr

clr.AddReference('System.Windows.Forms')
clr.AddReference('System.Drawing')

from System.Windows.Forms import *
from System.Drawing import *

form = Form()

Application.EnableVisualStyles()
Application.Run(form)

Todos los elementos necesarios para crear apps WinForms se encuentran en System.Windows.Forms. No obstante, el valor de algunas propiedades de Form y otros controles debe ser algún objeto de alguna clase definida en System.Drawing.

Al ejecutar este script se muestra un formulario como el siguiente:

Form vacío

A continuación exploraremos las propiedades mas importantes de los Formularios WinForms.


Texto e Icono


Al crear un formulario, lo primero que solemos personalizar es su título e icono. Estos vienen definidos por las propiedades Text e Icon. Si en el directorio donde se encuentra el siguiente script existe un archivo mi_icono.ico:

# -*- coding: utf-8 -*-

import clr

clr.AddReference('System.Windows.Forms')
clr.AddReference('System.Drawing')

from System.Windows.Forms import *
from System.Drawing import *

form = Form()

form.Text = 'IronApp'
form.Icon = Icon('mi_icono.ico') # System.Drawing.Icon

Application.EnableVisualStyles()
Application.Run(form)

Al ejecutar este código verás algo así:

Form con texto e icono

Puedes utilizar System.Drawing.Icon.ExtractAssociatedIcon para obtener el icono asociado a un ejecutable. Por ejemplo, si estás ejecutando ironpython con ipy.exe puedes obtener su icono así:

# -*- coding: utf-8 -*-

import clr, sys # no olvides importar sys

clr.AddReference('System.Windows.Forms')
clr.AddReference('System.Drawing')

from System.Windows.Forms import *
from System.Drawing import *

form = Form()

form.Text = 'IronApp'
form.Icon = Icon.ExtractAssociatedIcon(sys.executable) # sys.executable es el path de ipy.exe

Application.EnableVisualStyles()
Application.Run(form)

De manera que el formulario presentará el icono de ironpython:

Form con icono ipy

NOTA: Si has creado un Proyecto en Visual Studio en el que has instalado IronPython vía NuGet, en lugar de sys.executable utiliza System.AppDomain.CurrentDomain.FriendlyName para obtener el icono asociado al ejecutable del proyecto. En este caso no olvides añadir a tu código clr.AddReference('System'); import System.

Si no tienes (o no quieres) un icono para tu aplicación puedes ocultarlo:

form.ShowIcon = False

En este caso verías algo así:

Form sin icono


Propiedades booleanas


El valor de las siguientes propiedades es True o False:


Dimensiones y Borde


Podemos asignar un ancho y alto personalizado al formulario asignando un int a sus propiedades Width y Height:

form.Width = 320
form.Height = 240

También puede hacerse modificando la propiedad Size:

form.Size = Size(320, 240) # System.Drawing.Size

Las propiedades Width, Height y Size definen el tamaño del formulario hasta su borde, incluyendo la caja de control, donde se encuentran los botones de maximizar, minimizar y cerrar el propio formulario, lo que significa que cuando añadas controles al formulario y necesites posicionarlos y darles tamaño no debes utilizar Size para obtener valores relativos al tamaño del formulario. Los controles se dibujan en un subárea definido por la propiedad ClientSize, que siempre es inferior a Size.

Por ejemplo, para añadir un botón que ocupe todo el formulario:

form.ClientSize = Size(320, 240)
button = Button()
button.Text = 'Soy el Botón'
button.Location = Point(0, 0)
button.Size = form.ClientSize # Si utilizas button.Size = form.Size el botón se saldrá de los limites de form.ClientSize
form.Controls.Add(button)

Formulario con Tamaño fijo

Aunque hemos asignado el ancho y alto del formulario, este puede redimensionarse. Si quieres que el tamaño del formulario no pueda ser modificado por el usuario podrías hacer lo siguiente:

form.MinimumSize = form.Size
form.MaximumSize = form.Size

Así, si el tamaño mínimo y máximo del formulario es igual al tamaño inicial, el usuario no podrá cambiar las dimensiones. Pero si se coloca el cursor en los límites del formulario con la intención de redimensionarlo, el cursor cambia y sugiere que el cambio de tamaño es posible:

Form Sizable

Una mejor opción es la siguiente:

form.FormBorderStyle = FormBorderStyle.FixedSingle

La propiedad FormBorderStyle define el tipo de borde del formulario. Puede tomar los siguientes valores:


Al cambiar el típo de borde del formulario a FormBorderStyle.FixedSingle, ya no se sugiere la posibilidad de redimensionar y de hecho no se puede redimensionar aun sin haber asignado un MinimumSize ni un MaximumSize:

Form no Sizable

Ya que el formulario ahora no se puede redimensionar, nos interesa deshabilitar el botón [ ] de la caja de control. Para ello puedes asignar el valor False a la propiedad MaximizeBox:

form.MaximizeBox = False

Form no Sizable MaximizeBox False

De igual manera puedes deshabilitar el botón minimizar si lo deseas: form.MinimizeBox = False


Estado y Posición Inicial


La propiedad WindowState define el estado inicial del formulario. Puede tomar los siguientes valores:

Por ejemplo, si quieres que el formulario esté minimizado al crearse:

form.WindowState = FormWindowState.Minimized

La propiedad StartPosition define la posición inicial del formulario. Puede tomar los siguientes valores:

Por ejemplo, si quieres que el formulario esté en el centro de la pantalla:

form.StartPosition = FormStartPosition.CenterScreen

Color, Opacidad e Imagen de fondo


Color de fondo y Color de texto

La propiedad BackColor define el color de fondo del formulario, y la propiedad ForeColor define el color del texto en el formulario.

Para apreciar el ForeColor vamos a añadir una etiqueta al formulario:

label = Label()
label.Text = 'Soy una Etiqueta'
label.TextAlign = ContentAlignment.MiddleCenter # System.Drawing.ContentAlignment.MiddleCenter (texto centrado vertical y horizontalmente)
label.Dock = DockStyle.Fill # el texto ocupa todo el espacio disponible
form.Controls.Add(label)

Por ejemplo, si quieres que el color de fondo sea rojo, y el del texto azul:

form.BackColor = Color.Red 		# System.Drawing.Color.Red
form.ForeColor = Color.Blue 	# System.Drawing.Color.Blue

Se puede hacer lo mismo utilizando System.Drawing.ColorTranslator.FromHtml:

form.BackColor = ColorTranslator.FromHtml('red')
form.ForeColor = ColorTranslator.FromHtml('blue')

La ventaja de ColorTranslator.FromHtml es que podemos indicar el color mediante código hexadecimal, lo que pone a nuestra disposición todo el espectro de colores:

form.BackColor = ColorTranslator.FromHtml('#8A2BE2') # BlueViolet
form.ForeColor = ColorTranslator.FromHtml('#7FFF00') # Chartreuse

Código completo de ejemplo:

# -*- coding: utf-8 -*-

import clr

clr.AddReference('System.Windows.Forms')
clr.AddReference('System.Drawing')

from System.Windows.Forms import *
from System.Drawing import *

form = Form()

label = Label()
label.Text = 'Soy una Etiqueta'
label.TextAlign = ContentAlignment.MiddleCenter # System.Drawing.ContentAlignment.MiddleCenter (texto centrado vertical y horizontalmente)
label.Dock = DockStyle.Fill # el texto ocupa todo el espacio disponible
form.Controls.Add(label)

form.BackColor = ColorTranslator.FromHtml('#8A2BE2') # BlueViolet
form.ForeColor = ColorTranslator.FromHtml('#7FFF00') # Chartreuse

Application.EnableVisualStyles()
Application.Run(form)

Form Colores


Opacidad

La propiedad Opacity define la opacidad del formulario. Su valor debe ser un 'float' entre 0.0 y 1.0. Por ejemplo, para que la opacidad sea del 50%:

form.Opacity = 0.5

Sobre fondo blanco se vería así:

Form Colores 0.5 Opacidad


Imagen de fondo

Por otra parte, la propiedad BackgroundImage permite definir una imagen de fondo para el formulario. Por ejemplo, si tenemos un archivo fondo.jpg:

form.BackgroundImage = Bitmap('fondo.jpg') # System.Drawing.Bitmap

Si utilizamos una imagen de fondo podemos definir la disposición de la imagen mediante la propiedad BackgroundImageLayout del formulario, que puede tomar los siguientes valores:

Por ejemplo:

form.BackgroundImage = Bitmap('fondo.jpg') # System.Drawing.Bitmap
form.BackgroundImageLayout = ImageLayout.Stretch

Fuente de Texto


La propiedad Font define la fuente de texto utilizada en el formulario. Su valor debe ser una instancia de System.Drawing.Font que recibe 3 parámetros de los siguientes tipos:

  1. System.Drawing.FontFamily - Familia de la fuente de texto.
  2. System.Double o float (en ironpython son lo mismo) - Tamaño de la fuente. En ironpython puede utilizarse un System.Int32 o un int (que son lo mismo), pero en pythonnet se arrojaría un error.
  3. System.Drawing.FontStyle - Texto normal, en negrita, cursiva, etc.

Ejemplo:

form.Font = Font(FontFamily('Consolas'), 18.0, FontStyle.Regular)

Si queremos que la fuente sea negrita:

form.Font = Font(FontFamily('Consolas'), 18.0, FontStyle.Bold)

Si queremos que la fuente sea italica:

form.Font = Font(FontFamily('Consolas'), 18.0, FontStyle.Italic)

Y si queremos que sea negrita e italica:

form.Font = Font(FontFamily('Consolas'), 18.0, FontStyle.Bold | FontStyle.Italic)

System.Drawing.Font recibe un 4º parámetro opcional en IronPython pero obligatorio en PythonNET siempre que se especifique el FontStyle, por lo que los ejemplos anteriores solamente son válidos para ironpython. Este 4º parámetro es un System.Drawing.GraphicsUnit, que especifica la unidad de medida:

form.Font = Font(FontFamily('Consolas'), 18.0, FontStyle.Bold | FontStyle.Italic, GraphicsUnit.Pixel)

Código completo de ejemplo:

# -*- coding: utf-8 -*-

import clr

clr.AddReference('System.Windows.Forms')
clr.AddReference('System.Drawing')

from System.Windows.Forms import *
from System.Drawing import *

form = Form()

label = Label()
label.Text = 'Soy una Etiqueta'
label.TextAlign = ContentAlignment.MiddleCenter
label.Dock = DockStyle.Fill
form.Controls.Add(label)

form.Font = Font(FontFamily('Consolas'), 18.0, FontStyle.Bold | FontStyle.Italic, GraphicsUnit.Pixel)

Application.EnableVisualStyles()
Application.Run(form)

Form Font Bold Italic


Tipo de Cursor


La propiedad Cursor define el aspecto del cursor al pasar por encima del formulario.

Puede tomar muchos valores diferentes e incluso se puede crear un cursor completamente personalizado a partir de una imagen.

Algunos de los valores posibles para esta propiedad son:

Forms - Cursors


Relleno (Padding)


La propiedad Padding define el espacio entre el borde del formulario y los controles en su interior.

Para ver como funciona vamos a añadir un botón al formulario:

# -*- coding: utf-8 -*-

import clr

clr.AddReference('System.Windows.Forms')
clr.AddReference('System.Drawing')

from System.Windows.Forms import *
from System.Drawing import *

form = Form()

form.ClientSize = Size(320, 240)

boton = Button()
boton.Text = 'Soy un Botón'
boton.Dock = DockStyle.Fill
form.Controls.Add(boton)

Application.EnableVisualStyles()
Application.Run(form)

Se vería así:

Form con Botón Dock

Como puedes observar, el botón ocupa todo el espacio disponible. Esto se debe a boton.Dock = DockStyle.Fill.

La propiedad Padding solamente funcionará para controles que tienen definida su propiedad Dock.

Ahora vamos a asignar un Padding de 20 pixels:

form.Padding = Padding(20)

Form con Botón Dock y Padding 20

Obtendrías el mismo resultado con el siguiente código:

padding = Padding()
padding.All = 20

form.Padding = padding

También puedes asignar un padding diferente para los límites superior, inferior, izquierdo y derecho:

padding = Padding()
padding.Top = 20
padding.Bottom = 10
padding.Left = 50
padding.Right = 30

form.Padding = padding

Form con Botón Dock y Padding Irregular