Dokumen Final Project Python
Dokumen Final Project Python
Penjualan Warnet
OLEH:
Nazar Bhakti
2015.201.00099
Executive 1
KATA PENGANTAR
Assalamualaikum warahmatullahi wabarakatuh.
Alhamdulillahirabbilalamin, banyak nikmat yang Allah berikan, tetapi
sedikit sekali yang kita ingat. Segala puji hanya layak untuk Allah atas segala
berkat, rahmat, taufik, serta hidayah-Nya yang tiada terkira besarnya,
sehingga saya dapat menyelesaikan tugas hasil laporan Final Project ini.
Dalam penyusunannya, saya mengucapkan terimakasih kepada Dosen
yang mengajar dan teman-teman seperjuangan saya di kelas yaitu Bapak
Yusuf Wibisono , Bapak Thami Rusdi Agus, Iwan Sutandi , Natanael , dan
seluruh Executive 1 yang telah memberikan dukungan, kasih, dan
kepercayaan yang begitu besar. Dari sanalah semua kesuksesan ini berawal,
semoga semua ini bisa memberikan sedikit kebahagiaan dan menuntun pada
langkah yang lebih baik lagi.
Meskipun saya berharap isi dari laporan program saya ini bebas dari
kekurangan dan kesalahan, namun selalu ada yang kurang. Oleh karena itu,
saya mengharapkan kritik dan saran yang membangun agar tugas makalah
praktikum kimia ini dapat lebih baik lagi.
Akhir kata saya mengucapkan terimakasih, semoga hasil laporan
praktikum saya ini bermanfaat.
Samarinda , 4 Januari 2016
DAFTAR ISI
KATA PENGANTAR...2
DAFTAR ISI3
BAB I PENDAHULUAN..4
A. LATAR BELAKANG4
B. TUJUAN & MANFAAT.4
C. RUANG LINGKUP.5
D. METODE PENELITIAN5
E. PERANGKAT YANG DIGUNAKAN.5
BAB II DOKUMENTASI TEKNIS..6
A. GAMBARAN PROSES..6
B. DATABASE YANG DIGUNAKAN.6
C. DOKUMENTASI PROGRAM.8
BAB III HASIL PROGRAM..7
A. MENU UTAMA.56
B. ENTRY DATA57
C. PROSES..60
D. LAPORAN..60
BAB I
PENDAHULUAN
A. Latar Belakang
Komputer
merupakan
suatu
alat
hasil
teknologi
hasil
pemilik warnet tersebut, karena semua kegiatan jual beli jasa warnet
akan tercatat pada Aplikasi ini.
C. Ruang Lingkup
Aplikasi yang saya buat ini masih dalam tahap penjualan,
pendaftaran member , data operator , ganti password, laporan penjualan.
Sedangkan dalam program warnet kita harus membuat sedetail mungkin
dimana pc client dan server itu berbeda program, penghitungan waktu
pemain saat menyewa sebuah computer.
D. Metode Penelitian
Metode
yang
saya
gunakan
untuk
membuat
program
ini
BAB II
DOKUMENTASI TEKNIS
A. Gambaran Proses
Awal membuka aplikasi yakni Invsplash , setelah itu langsung
keluar login untuk ke menu program. Login wajib memakai user operator
dan yang bisa login di form tersebut adalah operator dan owner warnet,
karena data login terhubung langsung ke database pegawai. Setelah
berhasil login langsung di tampilkan dengan MenuWarnet sederhana
program saya. Disana terdapat image button untuk memproses programprogram yang saya buat yaitu:
1. Pembelian Vocher
2. Data Member
3. Pendaftaran Member
4. Ganti Password Member
5. Penambahan Tarif
6. Penambahan Operator
7. Laporan Transaksi
8. Laporan Data Member
3. Pembelian_vocher
C. Dokumentasi Program
1. MenuWarnet
from tkinter import *
import tkinter.ttk as ttk
import tkinter.messagebox as mb
from FormPembelian import *
class MenuUtama():
def __init__(self, parent, title):
self.parent = parent
parent.title(title)
parent.geometry("+220+20")
parent.resizable(width=False, height=False)
parent.protocol('WM_DELETE_WINDOW', self.onPass)
self.aturKomponen()
def pembelianvocher(self):
root = Tk()
FormPembelian(root, "Pembelian Vocher")
root.mainloop()
def addmember(self):
root = Tk()
EntryMember(root, ":: DAFTAR MEMBER ::")
root.mainloop()
def addOP(self):
root = Tk()
EntryOperator(root, ":: TAMBAH OPERATOR ::")
root.mainloop()
def addtarif(self):
root = Tk()
EntryMember(root, "Tambah Tarif")
root.mainloop()
def datamember(self):
root = Tk()
TampilStock(root, "Data Member ONENET e-spot")
root.mainloop()
def gantipass(self):
root = Tk()
EditStock(root, "GANTI PASSWORD")
root.mainloop()
def onPass(self):
self.onClose()
pass
def aturKomponen(self):
# atur main frame
btnFrame = Frame(self.parent,bg='black')
btnFrame.pack(fill=BOTH, expand=YES)
MainFrame = Frame(self.parent,bg='black')
MainFrame.pack(fill=BOTH, expand=YES)
Label(btnFrame,
text='
',bg='black').grid(row=0,column=0,
pady=20)
#button image
self.imgTambah = PhotoImage(file='./icon/member.gif')
self.btnTambah
Button(btnFrame,
command=self.datamember
text='Member',
,bg='black',fg='white',
image=self.imgTambah,
compound='top', width=70)
self.btnTambah.grid(row=0, column=0)
self.imgBuy = PhotoImage(file='./icon/buy.gif')
self.btnTambah
Button(btnFrame,
command=self.pembelianvocher,
text='Buy',
bg='black',fg='white',
image=self.imgBuy,
compound='top', width=70)
self.btnTambah.grid(row=0, column=1)
self.imgReqmem = PhotoImage(file='./icon/addmem.gif')
self.btnTambah
text='AddMember',command=self.addmember,
Button(btnFrame,
bg='black',fg='white',
image=self.imgReqmem,
compound='top', width=70)
self.btnTambah.grid(row=0, column=2)
self.imgReqOP = PhotoImage(file='./icon/addoperator.gif')
self.btnTambah
Button(btnFrame,
text='AddOP',command=self.addOP,
bg='black',fg='white',
image=self.imgReqOP,
compound='top', width=70)
self.btnTambah.grid(row=0, column=3)
self.imgReqjam = PhotoImage(file='./icon/addjam.gif')
self.btnTambah
Button(btnFrame,
text='AddTarif',command=self.addtarif,
bg='black',fg='white',
image=self.imgReqjam,
compound='top', width=70)
self.btnTambah.grid(row=0, column=4)
self.imgPass = PhotoImage(file='./icon/Pass.gif')
self.btnTambah
Button(btnFrame,
text='Password',command=self.gantipass
,bg='black',fg='white',
image=self.imgPass,
compound='top', width=70)
self.btnTambah.grid(row=0, column=5)
self.imgTrs = PhotoImage(file='./icon/reportmember.gif')
self.btnTambah
text='ReportTrs',command=lap_Transaksi
Button(btnFrame,
,
bg='black',fg='white',
image=self.imgTrs,
compound='top', width=70)
self.btnTambah.grid(row=0, column=6)
self.imgRmember = PhotoImage(file='./icon/reportmem.gif')
self.btnTambah
text='ReportMem',command=lap_member,
Button(btnFrame,
bg='black',fg='white',
image=self.imgRmember,
compound='top', width=70)
self.btnTambah.grid(row=0, column=7)
self.mainMenu.add_cascade(label='Transaksi',
menu=self.transaksi, underline=0)
if __name__ == '__main__':
root = Tk()
root.mainloop()
2. FormPembelian
import tkinter
from tkinter import *
from tkinter import ttk
import datetime
import time
import pymysql
import random
judul_kolom = ("Menit","Harga")
class FormPembelian:
def __init__(self, parent, title):
self.parent = parent
self.parent.title(title)
self.parent.protocol("WM_DELETE_WINDOW",
self.onClose)
lebar = 600
tinggi = 600
setTengahX = (self.parent.winfo_screenwidth()-lebar)//2
setTengahY = (self.parent.winfo_screenheight()-tinggi)//2
self.parent.geometry("%ix%i+%i+%i"
%(lebar,tinggi,setTengahX,setTengahY))
self.parent.resizable(False, False)
self.parent['bg']='orange'
self.aturKomponen()
def aturKomponen(self):
labelFrame = Frame(self.parent,bg='orange')
labelFrame.pack(side=TOP)
notransFrame = Frame(self.parent,bg='orange')
notransFrame.pack(side=TOP)
mainFrame = Frame(self.parent,bg='orange')
mainFrame.pack(side=TOP)
btnFrame = Frame(self.parent,bg='orange')
btnFrame.pack(side=BOTTOM)
text='
',bg='orange').grid(row=1,column=0, pady=10)
Label(btnFrame, text=' ',bg='orange').grid(row=3,column=0)
labeltitle
Label(labelFrame,
text='ONENET
e-
Sport',bg='orange')
labeltitle.grid(row=1,column=0)
labeltitle
Label(labelFrame,
text='Pembelian
Vocher
Billing',bg='orange')
labeltitle.grid(row=2,column=0)
Label(notransFrame,
text='Tgl
Keluar
(dd-mm-yyyy)
',bg='orange').grid(row=1,\
column=0, sticky=W)
self.entTglKeluar = Entry(notransFrame, width=20)
self.entTglKeluar.grid(row=1, column=1, sticky=W)
tgl = time.strftime("%Y%m%d")
self.entTglKeluar.insert(0, tgl)
Label(notransFrame,
text='No
Transaksi',bg='orange').grid(row=2,\
column=0, sticky=W)
self.entNoTrans = Entry(notransFrame, width=20)
self.entNoTrans.grid(row=2, column=1, sticky=W)
Label(notransFrame,
text='Masukan
ID
Button(notransFrame,
text='Cek
Label(btnFrame,
text='Total
Pembayaran
',bg='orange').grid(row=0,\
column=0, sticky=W, pady=15)
self.entTtlPembayaran = Entry(btnFrame, width=23)
self.entTtlPembayaran.grid(row=0, column=1, sticky=E)
Label(btnFrame,
text='Total
Waktu
',bg='orange').grid(row=1,\
column=0, sticky=W)
self.entTtlWaktu = Entry(btnFrame, width=23)
self.entTtlWaktu.grid(row=1, column=1, sticky=E)
Label(btnFrame,
text='Operator',bg='orange').grid(row=2,column=0, sticky=W, pady=15)
con
pymysql.connect(db="onenet",
passwd="samarinda12",
user="warnet",
host="localhost",
port=3306,autocommit=True)
cur = con.cursor()
cur.execute("SELECT
Nama_Operator
FROM
data_operator")
data_Operator = cur.fetchall()
self.cbOperator
ttk.Combobox(btnFrame,values=data_Operator,
state='readonly',width=15)
self.cbOperator.grid(row=2,column=1,sticky=W,padx=10)
self.btnBeli
Button(btnFrame,
text='Beli',bg="blue",fg="white",width=20,command=self.onSave)
self.btnBeli.grid(row=3, column=1)
self.btnReset
Button(btnFrame,
text='Reset',bg="red",fg="white",width=10,command=self.onReset)
self.btnReset.grid(row=3, column=2,padx=10)
ttk.Treeview(self.fr_data,
columns=judul_kolom,show='headings')
self.trvTabel.bind("<Double-1>", self.OnDoubleClick)
sbVer
Scrollbar(self.fr_data,
orient='vertical',command=self.trvTabel.yview)
sbHor
Scrollbar(self.fr_data,
orient='horizontal',command=self.trvTabel.yview)
sbVer.pack(side=RIGHT, fill=Y)
sbHor.pack(side=BOTTOM, fill=X)
self.trvTabel.pack(side=TOP, fill=BOTH)
self.table()
def onCari(self):
con
pymysql.connect(db='onenet',
passwd='samarinda12', host='localhost',\
port=3306, autocommit=True)
cur = con.cursor()
user='warnet',
cKode = self.entCekID.get()
if len(cKode) == 0:
messagebox.showwarning(title="Peringatan",message="Nama
Member jangan kosong dong.")
self.entCekID.focus_set()
return
messagebox.showinfo(title="Informasi",\
message="Data Benar")
else:
messagebox.showinfo(title="Informasi",\
message="Data tidak ditemukan")
self.entKode.focus_set()
return
cur.close()
con.close()
self.entTtlWaktu.delete(0, END)
self.entTtlPembayaran.delete(0, END)
it = self.trvTabel.selection()[0]
ite = self.trvTabel.item(it)["values"]
self.entTtlWaktu.insert(END, ite[0])
self.entTtlPembayaran.insert(END, ite[1])
def table(self):
con
pymysql.connect(db="onenet",
passwd="samarinda12",
user="warnet",
host="localhost",
port=3306,autocommit=True)
cur = con.cursor()
cur.execute("SELECT * FROM tarif")
data_table = cur.fetchall()
self.trvTabel.column("Menit", width=110,anchor="n")
self.trvTabel.column("Harga", width=240,anchor="n")
i=0
for dat in data_table:
if(i%2):
baris="genap"
else:
baris="ganjil"
self.trvTabel.insert('','end', values=dat, tags=baris)
i+=1
self.trvTabel.tag_configure("ganjil", background="#FFFFFF")
self.trvTabel.tag_configure("genap",
background="whitesmoke")
cur.close()
con.close()
def onSave(self):
con
pymysql.connect(db='onenet',
user='warnet',
passwd='samarinda12',
host='127.0.0.1', port=3306,autocommit=True)
cur = con.cursor()
cTglKeluar = self.entTglKeluar.get()
cNoTrans = self.entNoTrans.get()
cCekID = self.entCekID.get()
cTtlWaktu = self.entTtlWaktu.get()
nTtlPembayaran = int(self.entTtlPembayaran.get())
cOperator = self.cbOperator.get()
sql = "INSERT INTO pembelian_vocher (No_Transaksi,
ID_Member, Tgl_Pembelian, Paket_Jam, Harga, Operator)"+\
"VALUES(%s,%s,%s,%s,%s,%s)"
cur.execute(sql,(cNoTrans,cCekID,cTglKeluar,cTtlWaktu,nTtlPembaya
ran,cOperator))
messagebox.showinfo(title="Informasi", \
message="Data sudah di tersimpan.")
self.onReset()
cur.close()
con.close()
def onReset(self):
self.entCekID.delete(0, END)
self.entTtlWaktu.delete(0, END)
self.entTtlWaktu.delete(0, END)
self.entTtlPembayaran.delete(0, END)
self.cbOperator.delete(0, END)
self.entCekID.focus_set()
##root = Tk()
##FormPembelian(root, "Pembelian Vocher")
##root.mainloop()
3. Data_Penyewa
import tkinter.ttk
from tkinter import *
import pymysql
judul_kolom
("NO
MEMBER","ID
MEMBER","PASSWORD","TANGGAL DAFTAR")
class TampilStock:
def __init__(self,parent,judul):
self.parent = parent
self.parent.title(judul)
lebar = 570
tinggi = 400
setTengahX = (self.parent.winfo_screenwidth()-lebar)//2
setTengahY = (self.parent.winfo_screenheight()-tinggi)//2
self.parent.geometry("%ix%i+%i+%i" %(lebar, tinggi, setTengahX,
setTengahY))
self.parent.protocol("WM_DELETE_WINDOW", self.Tutup)
self.parent.resizable(False,False)
self.parent['bg']='orange'
self.aturKomponen()
self.isiTabel()
def aturKomponen(self):
kodeFrame = Frame(self.parent,bg='orange')
kodeFrame.pack(side=TOP)
mainFrame = Frame(self.parent)
mainFrame.pack(fill=BOTH, expand=YES)
fr_data = Frame(mainFrame, bd=10)
fr_data.pack(fill=BOTH, expand=YES)
self.trvTabel
ttk.Treeview(fr_data,
columns=judul_kolom,show='headings')
sbVer
Scrollbar(fr_data,
orient='vertical',command=self.trvTabel.yview)
sbHor
Scrollbar(fr_data,
orient='horizontal',command=self.trvTabel.yview)
sbVer.pack(side=RIGHT, fill=Y)
sbHor.pack(side=BOTTOM, fill=X)
self.trvTabel.pack(side=LEFT, fill=BOTH)
Label(kodeFrame,
text='ONENET
e-
Sport',bg='orange').grid(row=0,column=1,sticky=N)
Label(kodeFrame,
text='
Data
Member
',bg='orange').grid(row=1,column=1,sticky=N)
def isiTabel(self):
con
pymysql.connect(db="onenet",
passwd="samarinda12",
user="warnet",
host="localhost",
port=3306,autocommit=True)
cur = con.cursor()
cur.execute("SELECT * FROM data_penyewa")
data_penyewa = cur.fetchall()
self.trvTabel.column("TANGGAL
DAFTAR",width=180,anchor="n")
i=0
for dat in data_penyewa:
if(i%2):
baris="genap"
else:
baris="ganjil"
self.trvTabel.insert('', 'end', values=dat, tags=baris)
i+=1
self.trvTabel.tag_configure("ganjil", background="#FFFFFF")
self.trvTabel.tag_configure("genap", background="whitesmoke")
cur.close()
con.close()
#root = Tk()
#TampilStock(root, "Data Member ONENET e-spot")
#root.mainloop()
4. Data_Member
import tkinter
from tkinter import *
import pymysql
import datetime
import time
class EntryMember:
def __init__(self, parent, title):
self.parent = parent
self.parent.title(title)
self.parent.protocol("WM_DELETE_WINDOWS",
self.onClose)
lebar = 500
tinggi = 220
setTengahX = (self.parent.winfo_screenwidth()-lebar)//2
setTengahY = (self.parent.winfo_screenheight()-tinggi)//2
self.parent.geometry("%ix%i+%i+%i"
%(lebar,
tinggi,setTengahX, setTengahY))
self.parent.resizable(False,False)
self.parent['bg']='orange'
self.aturKomponen()
def aturKomponen(self):
mainFrame = Frame(self.parent,bg='orange')
mainFrame.pack(side=TOP)
btnFrame = Frame(self.parent,bg='orange')
btnFrame.pack(side=BOTTOM)
Label(mainFrame,
text='ONENET
Sport',bg='orange').grid(row=0,column=1,sticky=N)
e-
Label(mainFrame,
text='Pendaftaran
Member',bg='orange').grid(row=1,column=1,sticky=N,pady=5)
Label(mainFrame,
text='ID
Button(mainFrame,
text='Cek
Member',bg='blue', fg='white',\
command=self.onCekMember, width=10)
self.btnCek.grid(row=2, column=2)
Label(mainFrame,
text="NO
Label(mainFrame, text="Password",bg='orange').grid(row=4,
column=0, sticky=W)
self.entPass = Entry(mainFrame, width=25)
self.entPass.grid(row=4, column=1,pady=5)
Label(mainFrame,
text="Tanggal
self.btnSave
Button(btnFrame,
text='Save',bg='blue',fg='white',\
command=self.onSave, width=10)
self.btnSave.grid(row=0, column=1, padx=5)
self.btnCancel
Button(btnFrame,
text='Clear',bg='red',fg='white',\
command=self.onCancel, width=10)
self.btnCancel.grid(row=0,column=2)
def onCancel(self):
self.entMember.delete(0, END)
self.entNomer.delete(0, END)
self.entPass.delete(0, END)
self.entMember.focus_set()
def onCekMember(self):
con
pymysql.connect(db='onenet',
user='warnet',
passwd='samarinda12',
host='127.0.0.1', port=3306, autocommit=True)
cur = con.cursor()
cKode = self.entMember.get()
if len(cKode) == 0:
tkinter.messagebox.showwarning(title="Peringatan",\
tkinter.messagebox.showwarning(title="Peringatan",\
message="ID MEMBER sudah
digunakan. Gunakan kode yang lain. "+\
"kode
terakhir
yang
telah
MEMBER
bisa
cur.close()
con.close()
def onSave(self):
con
pymysql.connect(db='onenet',
user='warnet',
passwd='samarinda12',
host='127.0.0.1', port=3306,autocommit=True)
cur = con.cursor()
cMember = self.entMember.get()
cNomer = self.entNomer.get()
cPass = self.entPass.get()
nTgl = int(self.entTgl.get())
sql
"INSERT
INTO
data_penyewa
(ID_Member,
cur.close()
con.close()
#root = Tk()
#EntryMember(root, ":: DAFTAR MEMBER ::")
#root.mainloop()
5. Add Op
import tkinter
from tkinter import *
import pymysql
class EntryOperator:
def __init__(self, parent, title):
self.parent = parent
self.parent.title(title)
self.parent.protocol("WM_DELETE_WINDOWS",
self.onClose)
lebar = 500
tinggi = 240
setTengahX = (self.parent.winfo_screenwidth()-lebar)//2
setTengahY = (self.parent.winfo_screenheight()-tinggi)//2
self.parent.geometry("%ix%i+%i+%i"
tinggi,setTengahX, setTengahY))
self.parent.resizable(False,False)
self.parent['bg']='orange'
self.aturKomponen()
def aturKomponen(self):
mainFrame = Frame(self.parent,bg='orange')
mainFrame.pack(side=TOP)
btnFrame = Frame(self.parent,bg='orange',pady=10)
btnFrame.pack(side=BOTTOM)
%(lebar,
Label(mainFrame,
text='ONENET
e-
Sport',bg='orange').grid(row=0,column=1,sticky=N)
Label(mainFrame,
text='Pendaftaran
Operator',bg='orange').grid(row=1,column=1,sticky=N,pady=5)
Label(mainFrame,
text='Nama
Button(mainFrame,
text='Cek',bg='blue',
fg='white',\
command=self.onCekMember, width=10)
self.btnCek.grid(row=2, column=2)
Label(mainFrame,
text="No
Label(mainFrame, text="Password",bg='orange').grid(row=4,
column=0, sticky=W)
self.entPass = Entry(mainFrame, width=25)
self.entPass.grid(row=4, column=1,pady=5)
Label(mainFrame,
text="Alamat",bg='orange').grid(row=5,
column=0, sticky=W)
self.entalamat = Entry(mainFrame, width=25,)
self.entalamat.grid(row=5, column=1,pady=5)
Label(mainFrame,
text="Waktu
self.btnSave
Button(btnFrame,
text='Save',bg='blue',fg='white',\
command=self.onSave, width=10)
self.btnSave.grid(row=0, column=1, padx=5)
self.btnCancel
Button(btnFrame,
text='Clear',bg='red',fg='white',\
command=self.onCancel, width=10)
self.btnCancel.grid(row=0,column=2)
def onCancel(self):
self.entOP.delete(0, END)
self.entNomer.delete(0, END)
self.entPass.delete(0, END)
self.entalamat.delete(0, END)
self.entjaga.delete(0, END)
self.entOP.focus_set()
def onCekMember(self):
con
pymysql.connect(db='onenet',
user='warnet',
passwd='samarinda12',
host='127.0.0.1', port=3306, autocommit=True)
cur = con.cursor()
cKode = self.entOP.get()
if len(cKode) == 0:
tkinter.messagebox.showwarning(title="Peringatan",\
message="Nama
Operator
tidak
boleh kosong.")
self.entOP.focus_set()
else:
sql = "SELECT No_Operator FROM data_operator
WHERE Nama_Operator = %s"
cur.execute(sql,cKode)
data = cur.fetchall()
pjg = len(data)
if pjg > 0:
curkode = con.cursor()
sqlkode = "SELECT max(Nama_Operator) FROM
data_operator"
curkode.execute(sqlkode)
maxkode = curkode.fetchone()
tkinter.messagebox.showwarning(title="Peringatan",\
message="Nama
Operator
terakhir
yang
telah
str(maxkode[0])+".")
self.entOP.focus_set()
self.entNomer.get()
else:
tkinter.messagebox.showinfo(title="Amam", \
message="ID
MEMBER
bisa
digunakan")
self.entNomer.focus_set()
cur.close()
con.close()
def onSave(self):
con
pymysql.connect(db='onenet',
user='warnet',
passwd='samarinda12',
host='127.0.0.1', port=3306,autocommit=True)
cur = con.cursor()
cOP = self.entOP.get()
cNomer = self.entNomer.get()
cPass = self.entPass.get()
calamat = self.entalamat.get()
cjaga = self.entjaga.get()
sql = "INSERT INTO data_operator (Nama_Operator,
No_Operator, Password, Alamat, Waktu_Jaga)"+\
"VALUES(%s,%s,%s,%s,%s)"
cur.execute(sql,(cOP,cNomer,cPass,calamat,cjaga))
messagebox.showinfo(title="Informasi", \
message="Data sudah di tersimpan.")
cur.close()
con.close()
#root = Tk()
#EntryOperator(root, ":: TAMBAH OPERATOR ::")
#root.mainloop()
6. Add Tarif
import tkinter
from tkinter import *
import pymysql
class EntryMember:
def __init__(self, parent, title):
self.parent = parent
self.parent.title(title)
self.parent.protocol("WM_DELETE_WINDOWS",
self.onClose)
lebar = 450
tinggi = 160
setTengahX = (self.parent.winfo_screenwidth()-lebar)//2
setTengahY = (self.parent.winfo_screenheight()-tinggi)//2
self.parent.geometry("%ix%i+%i+%i"
tinggi,setTengahX, setTengahY))
self.parent.resizable(False,False)
%(lebar,
self.parent['bg']='orange'
self.aturKomponen()
def aturKomponen(self):
mainFrame = Frame(self.parent,bg='orange')
mainFrame.pack(side=TOP)
btnFrame = Frame(self.parent,bg='orange')
btnFrame.pack(side=BOTTOM)
Label(mainFrame,
text='ONENET
e-
Sport',bg='orange').grid(row=0,column=1,sticky=N)
Label(mainFrame,
text='Penambahan
Tarif',bg='orange').grid(row=1,column=1,sticky=N)
Label(mainFrame,
text='Waktu
self.btnCek
Button(mainFrame,
text='Cek',bg='blue',
fg='white',\
command=self.onCekMember, width=10)
self.btnCek.grid(row=2, column=2,padx=5)
Label(mainFrame,
Harga",bg='orange').grid(row=3, column=0, sticky=W)
self.entHarga = Entry(mainFrame, width=25)
self.entHarga.grid(row=3, column=1)
text="Masukan
self.btnSave
Button(btnFrame,
text='Save',bg='blue',fg='white',\
command=self.onSave, width=10)
self.btnSave.grid(row=0, column=1)
self.btnCancel
Button(btnFrame,
text='Clear',bg='red',fg='white',\
command=self.onCancel, width=10)
self.btnCancel.grid(row=0,column=2)
def onCancel(self):
self.entWaktu.delete(0, END)
self.entHarga.delete(0, END)
self.entWaktu.focus_set()
def onCekMember(self):
con
pymysql.connect(db='onenet',
user='warnet',
passwd='samarinda12',
host='127.0.0.1', port=3306, autocommit=True)
cur = con.cursor()
cKode = self.entWaktu.get()
if len(cKode) == 0:
tkinter.messagebox.showwarning(title="Peringatan",\
message="Wajib Masukan Waktu
yang ingin di tambah.")
self.entWaktu.focus_set()
else:
sql = "SELECT Harga FROM tarif WHERE Menit = %s"
cur.execute(sql,cKode)
data = cur.fetchall()
pjg = len(data)
if pjg > 0:
curkode = con.cursor()
sqlkode = "SELECT max(Menit) FROM tarif"
curkode.execute(sqlkode)
maxkode = curkode.fetchone()
tkinter.messagebox.showwarning(title="Peringatan",\
message="Kode
sudah
terakhir
yang
cur.close()
telah
con.close()
def onSave(self):
con
pymysql.connect(db='onenet',
user='warnet',
passwd='samarinda12',
host='127.0.0.1', port=3306,autocommit=True)
cur = con.cursor()
cWaktu = self.entWaktu.get()
nHarga = int(self.entHarga.get())
sql = "INSERT INTO tarif (Menit, Harga)"+\
"VALUES(%s,%s)"
cur.execute(sql,(cWaktu,nHarga))
messagebox.showinfo(title="Informasi", \
message="Data sudah di tersimpan.")
self.onCancel()
cur.close()
con.close()
#root = Tk()
#EntryMember(root, "Tambah Tarif")
#root.mainloop()
7. Ganti_Pass
from tkinter import *
import pymysql
class EditStock:
def __init__(self, parent, title):
self.parent = parent
self.parent.title(title)
self.parent.protocol("WM_DELETE_WINDOW",
self.onClose)
lebar = 500
tinggi = 185
setTengahX = (self.parent.winfo_screenwidth()-lebar)//2
setTengahY = (self.parent.winfo_screenheight()-tinggi)//2
self.parent.geometry("%ix%i+%i+%i"
%(lebar,tinggi,setTengahX,setTengahY))
self.parent.resizable(False, False)
self.parent['bg']='orange'
self.aturKomponen()
def aturKomponen(self):
kodeFrame = Frame(self.parent,bg='orange')
kodeFrame.pack(side=TOP)
btnFrame = Frame(self.parent,bg='orange')
btnFrame.pack(side=BOTTOM)
Label(kodeFrame,
text='ONENET
e-
Sport',bg='orange').grid(row=0,column=1,sticky=N)
Label(kodeFrame,
text='Penggantian
Password
Member',bg='orange').grid(row=1,column=1,sticky=N,pady=15)
Label(kodeFrame,
text='Nama
Member',bg='orange').grid(row=2,column=0,sticky=E)
self.entMember = Entry(kodeFrame,width=20)
self.entMember.grid(row=2, column=1,sticky=N)
self.btnCari
Button(kodeFrame,
text='Cari',
command=self.onCari,width=8,bg="blue",fg="white")
self.btnCari.grid(row=2,column=3,sticky=E)
Label(kodeFrame,
text='Masukan
Password
Checkbutton(kodeFrame,
text='Sembunyikan Password',bg='orange',
variable=self.cek, command=self.LihatPassword)
self.btShowPass.grid(row=4, column=1, sticky=W)
self.btnSave
Button(btnFrame,
self.btnCancel
Button(btnFrame,
text='Clear',bg="red",fg="white",command=self.onClear, width=10)
self.btnCancel.grid(row=0, column=2)
self.btnDelete
Button(btnFrame,
def onClear(self):
self.entPass.delete(0, END)
if nilaiCek== 1:
self.entPass['show'] = '*'
else:
self.entPass['show'] = ''
def onCari(self):
con
pymysql.connect(db='onenet',
passwd='samarinda12', host='localhost',\
port=3306, autocommit=True)
cur = con.cursor()
cKode = self.entMember.get()
if len(cKode) == 0:
user='warnet',
messagebox.showwarning(title="Peringatan",message="Nama
Member jangan kosong dong.")
self.entMember.focus_set()
return
else:
messagebox.showinfo(title="Informasi",\
message="Data tidak ditemukan")
self.onClear()
self.entMember.focus_set()
return
cur.close()
con.close()
def onSave(self):
cKode = self.entMember.get()
cNama = self.entPass.get()
if len(cKode) == 0:
messagebox.showwarning(title="Peringatan",message="Kode barang
kosong.")
self.entMember.focus_set()
elif len(cNama) == 0 :
messagebox.showwarning(title="Peringatan",message="Kode barang
belum valid.")
self.btnCari.focus_set()
else:
con
pymysql.connect(db='onenet',
user='warnet',
passwd='samarinda12', host="localhost",\
port=3306, autocommit=True)
cur = con.cursor()
cKode = self.entMember.get()
cNama = self.entPass.get()
def onDelete(self):
con = pymysql.connect(db='onenet', user='warnet',\
passwd='samarinda12',
host="localhost",
port=3306,autocommit=True)
cur = con.cursor()
cKode = self.entMember.get()
sql = "DELETE FROM data_penyewa WHERE ID_Member
=%s"
cur.execute(sql,cKode)
messagebox.showinfo(title="Informasi", \
message="Data sudah di hapus.")
self.onClear()
cur.close()
con.close()
#root = Tk()
#EditStock(root, "GANTI PASSWORD")
#root.mainloop()
8. Invsplash
from invlogin import *
from tkinter import *
from PIL import Image, ImageTk
class DemoSplashScreen:
def __init__(self, parent):
self.parent = parent
self.aturSplash()
self.aturWindow()
def aturSplash(self):
self.gambar = Image.open('welcome.jpg')
self.imgSplash = ImageTk.PhotoImage(self.gambar)
def aturWindow(self):
lebar, tinggi = self.gambar.size
setengahLebar = (self.parent.winfo_screenwidth()-lebar)//2
setengahTinggi = (self.parent.winfo_screenheight()-tinggi)//2
self.parent.geometry("%ix%i+%i+%i" %(lebar, tinggi,
setengahLebar,setengahTinggi))
Label(self.parent, image=self.imgSplash).pack()
if __name__ == '__main__':
root = Tk()
root.overrideredirect(True)
app = DemoSplashScreen(root)
root.after(4000, root.destroy)
root.mainloop()
root = Tk()
root['bg']= "pink"
app = LoginInv(root, "Login Menu Warnet")
9. Invlogin
import subprocess
from tkinter import *
from tkinter import ttk
import pymysql
class LoginInv:
def __init__(self, parent, judul):
self.parent = parent
self.parent.title(judul)
self.parent.protocol("WM_DELETE_WINDOW", self.Tutup)
lebar = 310
tinggi = 160
setTengahX = (self.parent.winfo_screenwidth()-lebar)//2
setTengahY = (self.parent.winfo_screenheight()-tinggi)//2
self.parent.geometry("%ix%i+%i+%i" %(lebar, tinggi, setTengahX,
setTengahY))
self.parent.resizable(False, False)
bg='orange'
self.aturKomponen()
self.cbLogin.focus_set()
def aturKomponen(self):
frameUtama = Frame(self.parent, bg='orange',bd=10)
frameUtama.pack(fill=BOTH, expand=YES)
frData = Frame(frameUtama, bg='orange', bd=5)
frData.pack(fill=BOTH, expand=YES)
Label(frData, text='Nama Pengguna', bg='orange').grid(row=0,
column=0, sticky=W)
con
pymysql.connect(db="onenet",
passwd="samarinda12",
user="warnet",
host="localhost",
port=3306,autocommit=True)
cur = con.cursor()
cur.execute("SELECT Nama_Operator FROM data_operator")
data_Login = cur.fetchall()
self.cbLogin
ttk.Combobox(frData,values=data_Login,
state='readonly',width=18)
self.cbLogin.grid(row=0,column=1,sticky=W,pady=10)
Label(frData, text='Password', bg='orange',width=18).grid(row=1,
column=0, sticky=W)
self.entPass = Entry(frData, show='*')
self.entPass.grid(row=1, column=1)
self.cek = IntVar()
self.cbShowPass
Checkbutton(frData,
text='Tampilkan
Password', bg='orange',
variable=self.cek, command=self.lihatPassword)
self.cbShowPass.grid(row=2, column=1, sticky=E)
Button(frTombol,
text='Login',
bg='blue',
command=self.prosesLogin)
self.btnLogin.pack(side=LEFT, fill=BOTH, expand=YES)
self.btnBatal
Button(frTombol,
text='Batal',
bg='red',
command=self.Tutup)
self.btnBatal.pack(side=LEFT, fill=BOTH, expand=YES)
host='127.0.0.1',
if nmUser=='' or passUser=='':
tkinter.messagebox.showwarning('Warning',
'User
atau
Password
FROM
"SELECT
Nama_Operator,
if nilaiCek== 1:
self.entPass['show'] = ''
else:
self.entPass['show'] = '*'
self.cbLogin.focus_set()
10.Laporan
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
from reportlab.lib.colors import pink, black, red, blue, green, gray
import datetime
import pymysql
import subprocess
def lap_member():
con = pymysql.connect(db="onenet", user="warnet",
passwd="samarinda12", host="127.0.0.1",\
port=3306,autocommit=True)
cur = con.cursor()
cur.execute("SELECT * FROM data_penyewa")
data_member = cur.fetchall()
c = canvas.Canvas("Lap_Member.pdf", pagesize=letter)
c.setFont("Helvetica-Bold", 12)
c.setFillColor(blue)
c.drawString(72,750,"ONENET e-Sport")
c.drawString(72,735,"LAPORAN DATA MEMBER")
c.setFillColor(blue)
c.drawString(440,750,str(datetime.date.today()))
c.setFillColor(black)
c.line(72,715,515,715)
c.drawString(72,700,"NO MEMBER")
c.drawString(190,700,"ID MEMBER")
c.drawString(300,700,"PASSWORD")
c.drawString(400,700,"TANGGAL DAFTAR")
c.line(72,695,515,695)
c.setFont("Helvetica", 10)
j= 0
t= 0
for i in data_member:
nomember = i[0]
namamember = i[1]
password = i[2]
tgldaf = i[3]
j += 1
c.drawCentredString(100,695-j*12,nomember)
c.drawString(190,695-j*12,namamember)
c.drawString(300,695-j*12,password)
c.drawString(420,695-j*12,str(tgldaf))
c.line(72,701-(j+1)*12,515,701-(j+1)*12)
c.drawString(72,701-(j+2)*12,"Total Member = "+str(j)+"")
c.drawRightString(500,701-(j+2)*12,str(t))
c.save()
subprocess.Popen("Lap_Member.pdf",shell=True)
def lap_Transaksi():
con = pymysql.connect(db="onenet", user="warnet",
passwd="samarinda12", host="127.0.0.1",\
port=3306,autocommit=True)
cur = con.cursor()
cur.execute("SELECT * FROM pembelian_vocher")
data_masuk = cur.fetchall()
c = canvas.Canvas("Lap_Transaksi.pdf", pagesize=letter)
c.setFont("Helvetica-Bold", 12)
c.setFillColor(blue)
c.drawString(72,750,"ONENET e-Spot")
c.drawString(72,735,"LAPORAN PENJUALAN")
c.setFillColor(blue)
c.drawString(440,750,str(datetime.date.today()))
c.setFont("Helvetica-Bold", 10)
c.setFillColor(black)
c.line(72,712,500,712)
c.drawString(75,700,"NOTA")
c.drawString(145,700,"TANGGAL")
c.drawString(225,700,"ID MEMBER")
c.drawString(320,700,"PAKET")
c.drawString(383,700,"OPERATOR")
c.drawString(455,700,"HARGA")
c.line(72,695,500,695)
c.setFont("Helvetica-Bold", 10)
j=0
t=0
for i in data_masuk:
nota = i[0]
member = i[1]
tgl = i[2]
paket = i[3]
harga = i[4]
operator = i[5]
j+= 1
t+= harga
ctgl=tgl.strftime("%d-%m-%Y")
c.drawString(75,695-j*12,nota)
c.drawString(145,695-j*12,ctgl)
c.drawString(240,695-j*12,member)
c.drawString(315,695-j*12,paket)
c.drawString(395,695-j*12,operator)
c.drawRightString(500,695-j*12,str(harga))
c.line(72,701-(j+1)*12,500,701-(j+1)*12)
c.drawString(72,701-(j+2)*12,"Jumlah Pembelian = "+\
str(j)+"")
c.drawRightString(500,701-(j+2)*12,"Total = Rp." + str(t))
c.line(72,707-(j+3)*12,500,707-(j+3)*12)
c.save()
subprocess.Popen("Lap_Transaksi.pdf",shell=True)
BAB III
HASIL PROGRAM
A. Menu Utama
Inilah Menu Utama dalam program yang saya buat, menu utama yang saya buat ini
memakai image button.
B. Entry Data
Form Pembelian
Form ini berguna untuk Transaksi dalam program warnet, yang akan
masuk ke database pembelian_vocher seperti yang saya jelaskan
sebelumnya. Dan saya menggunakan double click untuk pemilihan waktu
penyewaan , apabila memilih di daftar tariff akan otomatis masuk ke
entry Total Pembayaran dan Total Waktu.
Daftar Member
Ganti Password
memakai
waktunya.
Form
ini
langsung
mengedit
database
data_penyewa Password.
Tambah Tarif
Laporan Member