[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 :)