Sunday, March 29, 2015

[Python] Hitung nilai rata-rata dengan GUI Table(listctrl) wxPython

Selamat datang kembali di sharing-town,
Sudah 2 bulan lebih tidak posting di blog ini karena sedang menyusun materi dan rencana untuk kedepan nya :D . Oke langsung saja, script ini saya olah tahun kemarin, saat saya diminta tolong untuk menghitung jumlah dan nilai rata-rata siswa SD. Waktu itu kebetulan belum ada program office di laptop saya, karena malas download dan speed inet sedang lemot.
Jadi ya saya oprek saja script Python yang sudah ada, ini basic nya : Disini.
Saya oprek script tersebut dengan menambahkan fungsi editable, warna, dll. Sehingga sesuai dengan kebutuhan saya saat itu.
Ini dia hasilnya..


Github : https://github.com/aliyin/excel-like <- untuk file lainnya (ips.txt & nama_siswa.txt)
Jika ada kesalahan, mohon di koreksi, karena saya sendiri masih belajar :D
'''
Author      : Muhamad Aliyin Nur
Refference  : stackoverflow.com, daniweb.com, docs.python.org, google.com.
Notes       : The basic of this script is "individual lines coloured" which is coded by zoe. 
              Here : https://www.daniweb.com/software-development/python/threads/128350/starting-wxpython-gui-code/8#post1221367
'''
import wx,os,sys,ast,math
from decimal import *
from wx.lib.mixins.listctrl import ColumnSorterMixin
import wx.lib.mixins.listctrl  as  listmix
global data
#load data nilai dan nama siswa
dbs = "ips.txt"
nama_siswa = "nama_siswa.txt"

class EditableListCtrl(wx.ListCtrl, listmix.TextEditMixin):
    ''' TextEditMixin allows any column to be edited. ''' 
    #TextEditMixin memperbolehkan kolom untuk di edit  
    #----------------------------------------------------------------------
    def __init__(self, parent, ID=wx.ID_ANY, pos=wx.DefaultPosition,
                 size=wx.DefaultSize, style=0):
        """Constructor"""
        #inisialisasi gui ListCtrl
        wx.ListCtrl.__init__(self, parent, ID, pos, size, style)
        listmix.TextEditMixin.__init__(self)

class Core(wx.Frame):
    def __init__(self,parent,id):
        # mengatur tinggi dan lebar aplikasi
        APPWIDTH = 1200
        APPHEIGHT = 550
        w = wx.SystemSettings.GetMetric(wx.SYS_SCREEN_X)
        h = wx.SystemSettings.GetMetric(wx.SYS_SCREEN_Y)
        # Centre of the screen
        # mengambil titik tengah layar
        x = w / 2
        y = h / 2
        # Minus application offset
        # dikurangi tinggi dan lebar app , dibagi 2
        x -= (APPWIDTH / 2)
        y -= (APPHEIGHT / 2)
        # titik tengah
        center=(x, y)
        # inisialisasi Gui. judul, posisi, dll.
        wx.Frame.__init__(self,parent,id,'Shinichi{Nilai Rata-Rata}',pos=center,size = (1200,550),style = wx.DEFAULT_FRAME_STYLE & ~wx.MAXIMIZE_BOX ^ wx.RESIZE_BORDER)
        panel = wx.Panel(self)
        self.data = data
        self.nama_ = nama_
        # create the list control
        # membuat list control / list box
        self.lc = EditableListCtrl(panel, wx.ID_ANY,(1,22), size=(1192, 480),
        style=wx.LC_REPORT|wx.SUNKEN_BORDER|wx.LC_HRULES|wx.LB_SINGLE)
        # memanggil fungsi loadlist
        self.loadList()
        # setting label, tombol, dkk.
        set1text = wx.StaticText(panel, label = "SDN Majumundur - ",pos=(2,4))
        set2text = wx.StaticText(panel, label = "Kelas 100 - ",pos=(108,4))
        set3text = wx.StaticText(panel, label = "2030/2031 ",pos=(160,4))
        set4text = wx.StaticText(panel, label = "DAFTAR NILAI RAPORT",pos=(2,505))
        self.button1 = wx.Button(panel, label="HITUNG RATA-RATA",pos=(1053,0),size=(140,22))
        # mengkaitkan tombol hitung rata-rata dengan fungsi hitung_
        self.button1.Bind( wx.EVT_LEFT_DOWN, self.hitung_ )

    def loadList(self):
        # first the columns with header titles
        # setting kolom dan judulnya
        self.lc.InsertColumn(col=0,heading="Nama Siswa",width=170)
        self.lc.InsertColumn(col=1,heading="T.1",width=50,format=wx.LIST_FORMAT_CENTER)
        self.lc.InsertColumn(col=2,heading="T.2",format=wx.LIST_FORMAT_CENTER,width=50)
        self.lc.InsertColumn(col=3,heading="T.3",width=80,format=wx.LIST_FORMAT_CENTER)
        self.lc.InsertColumn(col=4,heading="T.4",width=80,format=wx.LIST_FORMAT_CENTER)
        self.lc.InsertColumn(col=5,heading="PAI",format=wx.LIST_FORMAT_CENTER,width=50)
        self.lc.InsertColumn(col=6,heading="Penjas",width=50,format=wx.LIST_FORMAT_CENTER)
        self.lc.InsertColumn(col=7,heading="SBDP",format=wx.LIST_FORMAT_CENTER,width=50)
        self.lc.InsertColumn(col=8,heading="Mulok Jaseng",width=90,format=wx.LIST_FORMAT_CENTER)
        self.lc.InsertColumn(col=9,heading="B.Indonesia",width=80,format=wx.LIST_FORMAT_CENTER)
        self.lc.InsertColumn(col=10,heading="B.Arab",format=wx.LIST_FORMAT_CENTER,width=80)
        self.lc.InsertColumn(col=11,heading="B.Jepang",width=60,format=wx.LIST_FORMAT_CENTER)
        self.lc.InsertColumn(col=12,heading="Jumlah",format=wx.LIST_FORMAT_CENTER,width=80)
        self.lc.InsertColumn(col=13,heading="Rata-Rata",width=200,format=wx.LIST_FORMAT_CENTER)
        #self.lc.InsertColumn(col=14,heading="4",width=40)
        #self.lc.InsertColumn(col=15,heading="R3",format=wx.LIST_FORMAT_CENTER,width=60)
        #self.lc.InsertColumn(col=16,heading="R",format=wx.LIST_FORMAT_CENTER,width=140)
        # now each data row
        # setting tiap baris/row
        indexes = 0
        # mendefinisikan variable indexes, dan nol
        nol = "0"
        # mengisi row dengan nama, dari file text yang sudah di load
        for keys, namas in self.nama_.items():
            # set max_rows, change if need be
            # set jumlah maksimum row
            max_rowss = 1000
            # also sets/updates row index starting at 0
            # mengisi row
            self.lc.InsertStringItem(max_rowss, namas.upper())
        self.lc.InsertStringItem(28, "JUMLAH")
        self.lc.InsertStringItem(29, "RATA - RATA")
        # mengisi row dengan nilai, dari file text yang sudah di load
        for key, val in self.data.items():
            index_ = -1
            # memberi warna pada tiap kolom, hijau dan putih
            if indexes % 2:
                self.lc.SetItemBackgroundColour(indexes, "white")
            else:
                self.lc.SetItemBackgroundColour(indexes, "green")
            # proses pengisian row dengan nilai, total 13 kolom
            # kolom 11 keatas di isi dengan nilai nol
            for x in range(1,14):
                if x < 13:
                    if index_ < 12:
                        index_ += 1
                        isi = val[index_]
                    else:
                        isi = nol
                self.lc.SetStringItem(indexes, x, isi)
            indexes += 1
#manual :   self.lc.SetStringItem(indexes, 1, val[0]), self.lc.SetStringItem(indexes, 2, val[1]), dst...


    def hitung_(self, event):
        #r1 = 5, r2 = 10, r3 = 15
        count = self.lc.GetItemCount()
        column = -1
        jumlah = 0
        semua = []
        halaman = -1
        jumlah_2 = 0
        semua_2 = []
        # proses menghitung 11 kolom yg terisi nilai
        # variable count berisi total seluruh baris/row (dari atas kebawah)
        for kolom in range(1,12):
            for row in range(count):
                # pengecualian baris 29 dan 30
                if row < 28:
                    item = self.lc.GetItem(itemId=row, col=kolom)
                    jumlah_2 += int(item.GetText())
                    #print item.GetText()
            semua_2.append(jumlah_2)
            jumlah_2 = 0
        #print semua_2
        # penjumlahan tiap kolom(dari kiri ke kanan)
        for rows in range(count):
            for row in range(count):
                column += 1
                item = self.lc.GetItem(itemId=rows, col=column)
                # hanya menjumlahkan tipe int, jika string(nama), lewat
                try:
                    if column < 12:
                        jumlah += int(item.GetText())
                except:
                    pass
                #print item.GetText()
            semua.append(jumlah)
            jumlah = 0
            column = -1
        #print semua
        # r1_ dan r2_ mengisi seluruh baris di kolom 12 dan 13
        # r1_ hasil jumlah, r2_ rata rata
        # anggap saja r1_ dan r2_ buku :D
        for r1_ in self.data.items():
            halaman += 1
            #print str(semua[halaman])
            self.lc.SetStringItem(halaman, 12, str(semua[halaman]))
        halaman = -1
        for r2_ in self.data.items():
            halaman += 1
            self.lc.SetStringItem(halaman, 13, str(Decimal(Decimal(semua[halaman])/Decimal(11)).quantize(Decimal('.01'), rounding=ROUND_DOWN)))
        # mengisi baris 28 dan 29, jumlah dan rata-rata
        # index semua_2 hanya ada 11 (dihitung dari 0)
        for xx in range(1,12):
            self.lc.SetStringItem(28, xx, str(semua_2[xx-1]))
            self.lc.SetStringItem(29, xx, str(Decimal(Decimal(semua_2[xx-1])/Decimal(28)).quantize(Decimal('.01'), rounding=ROUND_DOWN)))
            
        
    def onAction(self, event):
        print "tes"
    

def baca():
    global whip,nama_
    with open(dbs, "rb") as f:
        isi_lama = f.read()
        whip = ast.literal_eval("{"+isi_lama+"}")
    with open(nama_siswa, "rb") as f:
        isi_nama = f.read()
        nama_ = ast.literal_eval("{"+isi_nama+"}")


if __name__=='__main__':
    baca()
    data = whip
    app = wx.App(False)
    frame = Core(parent=None,id=-1)
    frame.Show()
    app.MainLoop()

0 comments:

Post a Comment

Komentar dengan menggunakan bahasa yang sopan ya gan :)