#!/usr/bin/env python import sys import math from PyQt4 import QtCore, QtGui class ImageArea (QtGui.QWidget): def __init__(self, parent = None): QtGui.QWidget.__init__(self, parent) def point (self, x, y, r, fi) : fi = 2 * math.pi * fi / 360 return (x + r * math.cos (fi), y + r * math.sin (fi)) def drawSector (self, painter, x0, y0, r1, r2, start, stop) : path = QtGui.QPainterPath () (x, y) = self.point (x0, y0, r1, start) path.moveTo (x, y) (x, y) = self.point (x0, y0, r2, start) path.lineTo (x, y) # (x, y) = self.point (x0, y0, r2, stop) path.arcTo (x0-r2, y0-r2, 2*r2, 2*r2, -start, -(stop-start)) # path.lineTo (x, y) (x, y) = self.point (x0, y0, r1, stop) path.lineTo (x, y) path.arcTo (x0-r1, y0-r1, 2*r1, 2*r1, -stop, stop-start) path.closeSubpath () painter.setBrush (QtGui.QColor.fromHsvF (start*1.0/360, 1, 1)) painter.drawPath (path) def drawRing (self, painter, x0, y0, r1, r2, items) : # painter.drawEllipse (x0-r1, y0-r1, 2*r1, 2*r1) # painter.drawEllipse (x0-r2, y0-r2, 2*r2, 2*r2) start = 0 for item in items : stop = start + item self.drawSector (painter, x0, y0, r1, r2, start, stop) start = stop def paintEvent(self, event): painter = QtGui.QPainter () painter.begin (self) painter.fillRect (event.rect(), self.palette().base()) # painter.setPen(QtGui.QColor (0, 0, 255)) painter.setPen(QtGui.QColor (128, 128, 128)) self.drawRing (painter, 200, 200, 40, 100, (40, 50, 90, 45, 45)) self.drawRing (painter, 200, 200, 100, 160, (25, 15, 30, 20, 40, 25, 25, 25, 15, 5, 25, 20)) painter.end() def event(self, event): if event.type() == QtCore.QEvent.ToolTip: QtGui.QToolTip.showText (event.globalPos(), "my text") return QtGui.QWidget.event(self, event) class MainWindow(QtGui.QMainWindow): def __init__(self, parent=None): QtGui.QMainWindow.__init__(self, parent) self.imageArea = ImageArea() self.setCentralWidget(self.imageArea) self.setWindowTitle("Diagram") self.resize(640, 480) class Data : def __init__ (self, name) : self.name = name self.value = 0 self.subitems = { } def __repr__ (self) : return str(self.value) + "," + str (self.subitems) top = { } def add (name, value) : items = name.split ('/') # start with 'top' dictionary store = top for item in items : if not store.has_key (item) : store [item] = Data (item) actual = store [item] actual.value += value # continue with 'subitems' dictionary store = actual.subitems def setup () : add ("bin", 100) add ("etc", 100) add ("dev", 100) add ("usr/bin", 100) add ("usr/include", 200) add ("usr/lib", 300) add ("usr/share", 300) add ("var/cache", 100) add ("var/log", 100) print top if __name__ == "__main__": app = QtGui.QApplication (sys.argv) setup () window = MainWindow () window.show () code = app.exec_ ()