Home / Programmazione / Python / wxPython Grid JSON
Mattepuffo

wxPython Grid JSON

wxPython Grid JSON

Negli articoli precedenti abbiamo visto come ottenere dati in formato JSON da un web service, e come creare una wxPython Grid.

Partendo da quegli articoli vediamo come riempire una Grid perndendo in dati in formato JSON.

Partiamo dalla classe che interroga il web service:

import httplib
import json

class Service(object):

    conn = None

    def __init__(self):
        self.conn = httplib.HTTPConnection("www.miosito.it")
        
    def listLogFile(self):
        self.conn.request(method = "GET", url = "/service/log.php", headers = { "Content-Type": "application/json" })
        res = self.conn.getresponse()
        data = json.loads(res.read())
        tabella = []
        for i in data:
            list = []
            list.append(i["nome"])
            list.append(i["data"])
            tabella.append(list)
        self.conn.close()
        return tabella
       

Fino a qua nulla di nuovo.

Vediamo adesso il Frame con la Grid:

import wx
import wx.grid as gl
from Service import *
from FrameDetail import *

class MainFrame(wx.Frame):
    
    s = Service()

    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, title = "Cimoda Log", size = (800, 800), style = wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER)
        panel = wx.Panel(self, wx.ID_ANY)
        randomId = wx.NewId()
        self.Bind(wx.EVT_MENU, self.closeProgram, id = randomId)
        closeAccelTbl = wx.AcceleratorTable([(wx.ACCEL_CTRL, ord('Q'), randomId)])
        self.SetAcceleratorTable(closeAccelTbl)
        
        data = self.s.listLogFile()
        cols = 3

        self.gl = gl.Grid(panel, pos = (30, 20))
        self.riempiGrid(data, cols)
        
        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.sizer.Add(self.gl, 2, wx.EXPAND)
        panel.SetSizer(self.sizer)

    def riempiGrid(self, data, cols):
        colLabels = [ "Nome", "Data", "Elimina" ]
        listNomi, listData = zip(*data)
        self.gl.CreateGrid(len(data), cols)
        self.gl.SetColSize(0, 300)
        self.gl.SetColSize(1, 300)
        self.Bind(gl.EVT_GRID_CELL_RIGHT_DCLICK, self.gridDoubleClick)
        self.Bind(gl.EVT_GRID_CELL_LEFT_DCLICK, self.gridDoubleClick)
        for col in range(cols):
            self.gl.SetColLabelValue(col, colLabels[col])
            self.gl.AutoSizeColumn(2)
        for row in range(len(data)):
            self.gl.SetCellValue(row, 0, listNomi[row])
            self.gl.SetCellValue(row, 1, listData[row])
            #self.gl.SetCellValue(row, 3, wx.CheckBox(self.gl))
            self.gl.SetReadOnly(row, 0, True)
            self.gl.SetReadOnly(row, 1, True)
        
    def closeProgram(self, event):
        self.Close()
        
app = wx.App()
f = MainFrame()
f.Show()
f.Center()
app.MainLoop()

Il tutto sta nel metodo riempiGrid, al quale passiamo i dati e le colonne.

I dati che ci arrivano dal metodo listLogFile sono già praticamente intabellati, quindi ce la caviamo con poco.

Ciao!