Leyendo un poquito la documentación, me tope con el método Update en wx.Panel
Código Python:
Ver original#coding: utf-8
import wx
from time import sleep
ID_GRILLA2 = 2
ID_GRILLA3 = 3
ID_GRILLA4 = 4
ID_GRILLA5 = 5
ID_GRILLA6 = 6
ID_GRILLA7 = 7
ID_UP = 10
ID_DOWN = 11
ID_LEFT = 12
ID_RIGHT = 13
ID_START = 14
class MyFrame(wx.Frame):
def __init__(self, *args, **kargs):
wx.Frame.__init__(self, *args, **kargs)
#Creamos un Panel dibujable y el MenuBar
self.Panel = DrawPanel(self)
menuBar = wx.MenuBar()
#Boton para empezar
self.StartButton = wx.Button(self, label="start")
#Instrucciones a seguir:
self.inst = [11, 13, 10]
#El sizer
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.Panel, 1, wx.EXPAND, 0)
sizer.Add(self.StartButton)
#Añadimos menus
filemenu = wx.Menu()
grillamenu = wx.Menu()
#Añadimos elementos a esos menus
filemenu.Append(wx.ID_EXIT, "&Close", "Close the program")
for i in range(2, 7 + 1):
grillamenu.Append(i, "%dx%d"%(i, i), "Crear grilla %dx%d" % (i, i), wx.ITEM_RADIO)
#Añadimos los menus a la barra de menus
menuBar.Append(filemenu, "&File")
menuBar.Append(grillamenu, "&Grill")
#Por ultimo ajustamos la barra de menu
self.SetMenuBar(menuBar)
#Ajutes del sizer
self.SetSizer(sizer)
self.Layout()
#Linkeamos los eventos a funciones con su respectiva ID
self.Bind(wx.EVT_MENU, self.OnExit, id=wx.ID_EXIT)
for i in range(2, 7 +1):
self.Bind(wx.EVT_MENU, self.SET_ID, id=i)
#Boton de inicio
self.StartButton.Bind(wx.EVT_BUTTON, self.MOVE_IMAGE)
def MOVE_IMAGE(self, event):
print "Move Image, Click in button start"
n = self.Panel.n
pos = self.Panel.pos
#10 -> UP
#11 -> DOWN
#12 -> LEFT
#13 -> RIGHT
for id in self.inst:
if id == 10 and pos[1] > 0:
pos[1] -= 1
elif id == 11 and pos[1] < n-1:
pos[1] += 1
elif id == 13 and pos[0] < n-1:
pos[0] += 1
elif id == 12 and pos[0] > 0:
pos[0] -= 1
sleep(1)
self.Panel.Refresh() #Con esto llamamos al evento OnPaint al terminar este evento
self.Panel.Update()
def SET_ID(self, event):
print "SET_ID"
#Ajustamos el numero de cuadritos a dibujar
self.Panel.n = event.GetId()
self.Panel.Refresh() #Importante redibuja todo el frame
def OnExit(self, event):
self.Close(True)
class DrawPanel(wx.Panel):
"""Draw a line to a panel."""
def __init__(self, *args, **kwargs):
wx.Panel.__init__(self, *args, **kwargs)
self.Bind(wx.EVT_PAINT, self.OnPaint)
#Por defecto son 2
self.n = 2
self.pos = [0, 0]
def OnPaint(self, event):
print "Painting"
dc = wx.PaintDC(self)
dc.SetPen(wx.Pen("BLACK", 4))
n = self.n #Acortamos el nombre
z = 30 #Tamaño de los cuadritos
for i in range(n):
for j in range(n):
dc.DrawRectangle(i * z, j * z, z, z)
dc.SetPen(wx.Pen("GREEN", 4))
dc.DrawRectangle(self.pos[0] * z, self.pos[1] * z, z, z)
app = wx.PySimpleApp(False)
frame = MyFrame(None, title="Draw on Panel!!!")
frame.SetSizeHints(640, 480)
frame.Show()
app.MainLoop()
Como puedes tienes un arreglo llamado inst (que contiene las instrucciones, en clase MyFrame).