from wxPython.wx import *
import random

class MiaDialog(wxDialog):
    def __init__(self):
        wxDialog.__init__(self, None, -1,
                          "Prova di disegno con wxMemoryDC",
                          size=(350, 250))
        # E` possibile scegliere se usare un wxMemoryDC o no.
        self.radio_box =wxRadioBox(self, -1, "Usare un wxMemoryDC?",
                                   (10, 160), (150, 40),
                                   choices=["No", "Sì"])
        # Il pulsante permette di ridisegnare la finestra.
        BTN_ID = wxNewId()
        btn = wxButton(self, BTN_ID, "Ridisegna",
                       (170, 160), (-1, 40))
        EVT_BUTTON(self, BTN_ID, self.OnButtonDown)

    def OnButtonDown(self, event):
        # Il pulsante è stato premuto, ridisegna la
        # finestra, se è selezionato "No" viene ritornato 0
        # da GetSelection perché "No" è il primo controllo,
        # altrimenti viene ritornato "1" perché il radiobutton
        # "Sì" è il secondo pulsante del radiobox. (?)
        usa_memory_dc = self.radio_box.GetSelection()
        self.Ridisegna(usa_memory_dc)

    def Ridisegna(self, usa_memory_dc):
        # Crea un wxClientDC ed inizia le operazioni di disegno.
        client_dc = wxClientDC(self)
        client_dc.BeginDrawing()
        # Larghezza ed altezza del rettangolo in cui avvengono le
        # operazioni di disegno.
        larghezza = 300
        altezza = 150
        # Le operazioni di disegno avvengono su dest_dc che si
        # riferisce a diversi wxDC in base a usa_memory_dc
        if usa_memory_dc:
            # Se usa_memory_dc è 1 allora dest_dc è un wxMemoryDC.
            dest_dc = wxMemoryDC()
            # Viene creata una bitmap che viene poi selezionata
            # nel wxMemoryDC.
            bmp = wxEmptyBitmap(larghezza, altezza)
            dest_dc.SelectObject(bmp)
            dest_dc.BeginDrawing()
        else:
            # Se usa_memory_dc è 0 allora viene usato client_dc.
            dest_dc = client_dc
        # Lista dei possibili colori fra cui scegliere per
        # disegnare i cerchi.
        lista_colori = ("BLUE",
                        "BLUE VIOLET",
                        "BROWN",
                        "CYAN",
                        "DARK GREY",
                        "DARK GREEN",
                        "GOLD",
                        "GREY",
                        "GREEN",
                        "MAGENTA",
                        "NAVY",
                        "PINK",
                        "RED",
                        "SKY BLUE",
                        "VIOLET",
                        "YELLOW",
                        "PALE GREEN")
        # Disegna 1000 cerchi di colore, dimensione e posizione casuale
        for i in range(1000):
            # Il colore è estratto fra la lista dei possibili colori,
            # random.randrange(min, max) ritorna un numero casuale
            # compreso fra min e max.
            n_colore = random.randrange(0, len(lista_colori))
            colore = lista_colori[n_colore]
            # Vengono creati e selezionati nel wxDC i pennelli e le penne
            # di colore casuale.
            penna = wxPen(colore, 1, wxSOLID)
            dest_dc.SetPen(penna)
            pennello = wxBrush(colore, wxSOLID)
            dest_dc.SetBrush(pennello)
            # Diametro del cerchio.
            dim = random.randrange(5, 30)
            # Posizione in cui disegnare il cerchio, viene usato
            # "- dim" perxhé altrimenti le operazioni di disegno
            # potrebbero avvenire fuori dal rettangolo scelto.
            pos_x = random.randrange(0, larghezza - dim)
            pos_y = random.randrange(0, altezza - dim)
            # Disegna il cerchio.
            dest_dc.DrawEllipse(pos_x, pos_y, dim, dim)
        if usa_memory_dc:
            # I 500 cerchi sono stati disegnati sul wxMemporyDC,
            # adesso devono essere ricopiati su client_dc.
            client_dc.Blit(0, 0, larghezza, altezza, dest_dc, 0, 0)
            dest_dc.EndDrawing()
        client_dc.EndDrawing()

class MiaApp(wxApp):
    def OnInit(self):
        dlg = MiaDialog()
        dlg.ShowModal()
        dlg.Destroy()
        return 1

app = MiaApp()
app.MainLoop()