Un frame ordinario en wxPython se puede construir de manera muy sencilla, heredando simplemente de wx.Frame.

import wx

class TestFrame(wx.Frame):
def __init__(self,parent,title):
wx.Frame.__init__(self,parent=parent,title=title,size=(400,300))
self.Show()

if __name__=='__main__':
app = wx.App()
fr = TestFrame(None, "Mi Frame")
app.MainLoop()



A continuación vamos a ver algunas cuestiones interesantes para crear frames personalizados.

Cambiando el color de fondo


Para cambiar el color de fondo de un Frame podemos utilizar el método SetBackgroundColour, al cual debemos pasarle como argumento un objeto de la clase wx.Colour o bien una cadena en notación hexadecimal para especificar el color.

import wx

class TestFrame(wx.Frame):
def __init__(self,parent,title):
wx.Frame.__init__(self,parent=parent,title=title,size=(400,300))
# Modificando el color de fondo
rojo = wx.Colour(255,0,0)
# rojo = "#ff0000" # Equivalente en notación hexadecimal
self.SetBackgroundColour(rojo)
self.Show()

if __name__=='__main__':
app = wx.App()
fr = TestFrame(None, "Mi Frame")
app.MainLoop()


Colocando un ícono


Para colocar un ícono en la barra superior de nuestro Frame utilizamos el método SetIcon, al cual debemos pasarle como argumento un objeto de la clase wx.Icon. Para instanciar un objeto de wx.Iconnecesitamos simplemente pasar como argumento la ruta de la imagen/ícono.

import wx

class TestFrame(wx.Frame):
def __init__(self,parent,title):
wx.Frame.__init__(self,parent=parent,title=title,size=(400,300))
# Colocando un ícono
icono = wx.Icon("icono.png")
self.SetIcon(icono)
# ...
self.Show()

if __name__=='__main__':
app = wx.App()
fr = TestFrame(None, "Mi Frame")
app.MainLoop()



Modificando estilos


Ventana no redimensionable

Si queremos tener una ventana con un tamaño fijo, podemos hacerlo modificando el estilo por defecto de nuestro Frame. Cuando creamos un Frame por defecto se toma el estilo wx.DEFAULT_FRAME_STYLE. Para modificarlo debemos pasar el keyword argument style con una lista de estilos determinados. Para nuestro caso de una ventana no redimensionable:

import wx

class TestFrame(wx.Frame):
def __init__(self,parent,title):
styles = (wx.CLOSE_BOX|wx.CAPTION)
wx.Frame.__init__(self,parent=parent,title=title,size=(400,300),
style=styles)
self.Show()

if __name__=='__main__':
app = wx.App()
fr = TestFrame(None, "Mi Frame")
app.MainLoop()



Ventana sin barra de título

Si queremos una ventana sin barra de título, podemos quitar el estilo wx.CAPTION:

import wx

class TestFrame(wx.Frame):
def __init__(self,parent,title):
styles = wx.DEFAULT_FRAME_STYLE & ~ (wx.CAPTION)
wx.Frame.__init__(self,parent=parent,title=title,size=(400,300),
style=styles)
self.SetBackgroundColour("#ff00ff")
self.Show()

if __name__=='__main__':
app = wx.App()
fr = TestFrame(None, "Mi Frame")
app.MainLoop()



El estilo wx.DEFAULT_FRAME_STYLE & ~ (wx.CAPTION) toma todos los estilos incluidos en wx.DEFAULT_FRAME_STYLE, exceptuando a wx.CAPTION, un poco de combinación de operaciones lógicas AND-NOT.