Python
Python
PEMROGRAMAN
DESKTOP DATABASE
PYTHON-MYSQL
dengan
BOA CONSTRUCTOR
Pemrograman Desktop Database Python-MySQL
Penerbit
(…………………….)
Desain Sampul:
(Ahmad Qomari )
2
KATA PENGANTAR
Penulis
3
DAFTAR ISI
Kata Pengantar 3
2.1 Pendahuluan 18
2.4.2 Editor 26
2.4.3 Inspector 32
3.1 Pendahuluan 34
4
Memulai Project Baru: Membaca dan 35
Menampilkan Nama………………….
5.2 RadioButton 71
5.3 CheckBox 74
6.1 wx.ComboBox 78
5
6.2 wx.ListBox 86
6.3 wx.ListCtrl 91
6
9.2 Membuat Menu dengan Fasilitas Boa 167
Constructor (Drag and Drop)
7
dan Menampilkan Gambar
8
DAFTAR PUSTAKA 400
9
BAB I
10
Pemrograman desktop di Python bisa
menggunakan berbagai library, seperti PyGTK,
wxPython, dan sebagainya. Library yang dibahas
dalam buku ini adalah wxPython.
p = input("Panjang: ")
l = input("Lebar : ")
11
Luas = p*l
import java.util.Scanner;
int p, l, Luas;
System.out.print(“Panjang :”);
p = masukan.nextInt();
System.out.print(“Lebar :”);
l = masukan.nextInt();
Luas = p*l;
}}
12
penulisan hurufnya dari ujung kiri layar. Jika terdapat
blok baru, seperti pada pencabangan (if), perulangan
(while dan for), atau fungsi tertentu (dimulai dengan
def), maka blok tersebut harus diketikkan lebih
menjorok ke dalam. Baris-baris kode yang berada
dalam satu blok harus memiliki indentasi yang sama.
Permulaan huruf kode pada suatu baris dengan
baris di bawahnya yang berada dalam satu blok
harus memiliki kesamaan jarak dengan ujung kiri
layar.
CATATAN
p = input("Panjang: ")
l = input("Lebar : ")
13
Contoh Indentation Error pada Python:
p = input("Panjang: ")
l = input("Lebar : ")
Atau…
p = input("Panjang: ")
l = input("Lebar : ")
14
Contoh Kesalahan Kode Akibat Case Sensitive
p = input("Panjang: ")
l = input("Lebar : ")
luas = p*l
2. WxPython
Software ini sebagai library GUI. Versi yang
digunakan adalah 2.8 yang compatible dengan
IDLE Python 2.5. Nama filenya: wxPython2.8-
15
win32-ansi-2.8.10.1-py25. WxPython tidak bisa
berjalan tanpa IDLE Python Interpreter.
3. Boa Constructor
Boa Constructor adalah salah satu IDE
(Integrated Development Environment) atau
lingkungan pemrograman terintegrasi untuk
membangun aplikasi berbasis GUI dengan
library wxPython.
4. MySQL Server.
Lebih praktis jika kita menginstal database
MySQL Server yang sudah dikemas jadi satu
dengan PHP dan Apache dalam XAMPP. Kita
bisa melakukan administrasi database:
menciptakan database, membuat tabel dan
16
strukturnya, melakukan query langsung ke
database, dan semisalnya dengan phpmyadmin.
17
BAB II
2.1 Pendahuluan
18
2. Ketikkan : import wx kemudian tekan tombol
enter. Jika tidak ada pesan error, berarti
wxpython sudah terinstal dengan baik.
19
menjalankan file Boa.py. Paket ini selain bisa
dijalankan pada Windows juga bisa diterapkan pada
Linux.
20
4. Tampil 3 window:
a. Zope Editor
b. Inspector
c. Editor
21
2.4 Penjelasan Tiga Window
1. New
2. Containers/ Layout
3. Basic Controls
22
4. Buttons
5. List Controls
6. Library
7. User
8. Utilities (Data)
9. Zope
Containers/Layout
23
Gambar 2.7 Icon wx.Panel
Catatan Penting:
Basic Controls
24
wx.CheckBox Pilihan yang bisa lebih
dari satu, contoh: Hoby
Buttons
List Controls
25
Gambar 2.10 Tab List Controls
Utilities(Data)
2.4.2 Editor
26
Editor adalah window pengontrol utama Boa
Constructor. Beberapa fungsinya adalah mengatur :
1. Shell.
2. Explorer.
27
Gambar 2.15 Editor – Explorer Boa Constructor
1. File
28
Gambar 2.17 Membuat File Baru dengan Boa
29
Selanjutnya, klik icon Frame Designer yang terletak
di bawah tulisan Pertolongan. Gambar icon Frame
Designer ditunjukkan pada icon 2.17.
2. Edit
30
Gambar 2.21 Menu Edit Boa Constructor
3. Windows
31
Gambar 2.22 Menu Windows Boa Constructor
2.4.3 Inspector
32
Gambar 2.24 Inspector
1. Constr
2. Props
3. Evts
4. Objs
CATATAN
33
BAB III
PADA FRAME
3.1 Pendahuluan
34
Wx.App dan wx.Frame yang berkaitan harus
diletakkan pada folder yang sama.
35
Gambar 3.1 Aplikasi Membaca dan Menampilkan Nama
36
Gambar 3.3 Tercipta App1 dan Frame1
37
4. Settinglah nilai Inspector pada Frame1 sesuai
tabel 3.1.
TAB Properties Nilai
Constr Title Latihan Menampilkan Nama
Props BackgroundColour 255,255,255,255 (putih)
Tabel 3.1 Setting Inspector Frame1
38
Gambar 3.7 Save As App1
39
saat menyimpan App1. Anda boleh memberikan
nama terserah sebagai pengganti App1 dan Frame1.
40
Gambar 3.11 Meletakkan wx.Panel pada Frame1
41
Pilihlah wx.StaticText (ujung kiri) icon bertuliskan
ABC, kemudian letakkan ke dalam Frame1.
Letakkan 2 wx.StaticText ke Frame1. Atur
Inspectornya sebagai berikut:
Object Tab Setting Nilai
wx.Statictext Constr Label ‘Masukkan Nama’
wx.Statictext Constr Label ‘Namanya adalah’
Hasil perubahan pada Frame1 seperti ditunjukkan
Gambar 3.14
42
Gambar 3.15 Icon wx.TextCtrl
43
9. Pada Palette/ Zope Editor, pindah ke tab
Buttons
44
Nama
Object Tab Setting Nilai
Label Proses
wx.Button Constr Name 'tmbProses'
10. Buatlah Event pada wx.Button yang sudah ada.
45
Klik pada ButtonEvent sehingga muncul tulisan
wx.EVT_BUTTON di sebelah kanannya
46
Gambar 3.23 Tanda Post pada Inspector
47
Arahkan ke Source Code (Kode Python) paling
bawah. Terdapat baris kode sebagai berikut:
def OnTmbProsesButton(self, event):
event.Skip()
nama = self.txt_Nama1.GetValue()
self.txt_Nama2.SetValue(nama)
Baris pertama :
nama = self.txt_Nama1.GetValue()
48
Baris kedua:
self.txt_Nama2.SetValue(nama)
self.txt_Nama2.SetValue(self.txt_Nama1.GetValue())
Catatan Penting :
49
Secara umum, sebuah aplikasi minimal terdiri dari 2
file (jika nama file tidak diubah), yaitu:
1. App1.py
2. Frame1.py
KODE App1.py
#!/usr/bin/env python
#Boa:App:BoaApp
import wx
import Frame1
class BoaApp(wx.App):
def OnInit(self):
self.main = Frame1.create(None)
self.main.Show()
self.SetTopWindow(self.main)
return True
50
def main():
application = BoaApp(0)
application.MainLoop()
if __name__ == '__main__':
main()
KODE Frame1.py
#Boa:Frame:Frame1
import wx
def create(parent):
return Frame1(parent)
[wxID_FRAME1, wxID_FRAME1PANEL1,
wxID_FRAME1STATICTEXT1,
wxID_FRAME1STATICTEXT2, wxID_FRAME1TMBPROSES,
wxID_FRAME1TXT_NAMA1,
wxID_FRAME1TXT_NAMA2,
51
class Frame1(wx.Frame):
style=wx.DEFAULT_FRAME_STYLE, title='Latihan
Menampilkan Nama')
self.SetClientSize(wx.Size(384, 203))
self.panel1 = wx.Panel(id=wxID_FRAME1PANEL1,
name='panel1', parent=self,
style=wx.TAB_TRAVERSAL)
self.staticText1 =
wx.StaticText(id=wxID_FRAME1STATICTEXT1,
self.staticText2 =
wx.StaticText(id=wxID_FRAME1STATICTEXT2,
52
label='Namanya adalah', name='staticText2',
parent=self.panel1,
self.txt_Nama1 =
wx.TextCtrl(id=wxID_FRAME1TXT_NAMA1,
name='txt_Nama1',
style=0, value='')
self.txt_Nama2 =
wx.TextCtrl(id=wxID_FRAME1TXT_NAMA2,
name='txt_Nama2',
style=0, value='')
self.tmbProses =
wx.Button(id=wxID_FRAME1TMBPROSES, label='Proses',
name='tmbProses', parent=self.panel1,
pos=wx.Point(272, 40),
self.tmbProses.Bind(wx.EVT_BUTTON,
self.OnTmbProsesButton,
id=wxID_FRAME1TMBPROSES)
53
def __init__(self, parent):
self._init_ctrls(parent)
nama = self.txt_Nama1.GetValue()
self.txt_Nama2.SetValue(nama)
54
BAB IV
55
Gambar 4.1 Tampilan Aplikasi Menghitung Luas
Persegi
56
Evts Button Event wx.EVT_BUTTON
Tabel 4.1 Setting Inspector Aplikasi Hitung Luas
Persegi
p = int(self.txt_panjang.GetValue())
l = int(self.txt_lebar.GetValue())
luas = p * l
self.txt_luas.SetValue(str(luas))
Penjelasan :
p = int(self.txt_panjang.GetValue())
57
artinya : membaca input data di txt_panjang,
kemudian dikonversikan ke integer, dan disimpan ke
variable p.
luas = p * l
self.txt_luas.SetValue(str(luas))
58
Usia = Tahun_sekarang – tahun_lahir.
59
Label
wx.StaticText Props Tahun Lahir
Label
(TEKAN ENTER)
Foreground
wx.StaticText Props
Colour (255,0,0,255)
wx.StaticText Props Label Usia
Name th_lahir
Constr Value (dikosongkan)
Wx.TextCtrl wx.TE_PROCESS_
Style ENTER
TextCtrlEve Wx.EVT_TEXT_EN
Evts
nt TER
Name txt_usia
wx.TextCtrl Constr
Value (dikosongkan)
Tabel 4.2 Setting Inspector Hitung Usia
Kode Inti :
self.txt_usia.SetValue(str(Usia))
60
2. Settinglah pada Inspector nilai Style (tab Constr)
wx.TextCtrl dibuat menjadi :
wx.TE_PROCESS_ENTER
61
Gambar 4.4 wx.TextCtrl Terpilih (Aktif)
62
Gambar 4.6 Klik 2x pada wx.EVT_TEXT_ENTER
event.Skip()
63
BAB V
Contoh:
64
penggunaan wx.MessageDialog untuk menampilkan
pesan.
CATATAN :
65
apapun), maka tekanlah tombol Refresh di Toolbar Editor
atau tekan Ctrl-R.
KODE INTI :
self.txt_usia.SetValue(str(Usia))
if Usia > 17 :
self.pesan = wx.MessageDialog(self,\
"SUDAH DEWASA","KATEGORI",wx.OK)
self.pesan.ShowModal()
else :
self.pesan = wx.MessageDialog(self,\
"BELUM DEWASA","KATEGORI",wx.OK)
self.pesan.ShowModal()
KETERANGAN:
66
if (kondisi) :
<statement 1>
else :
<statement 2>
1. Setting pesan
2. Menampilkan pesan
self.pesan = wx.MessageDialog(self,\
"SUDAH DEWASA","KATEGORI",wx.OK)
67
self.pesan.ShowModal()
Usia Kategori
0 – 5 tahun BALITA
6 – 12 tahun ANAK-ANAK
13 – 17 tahun REMAJA
18 - 50 tahun DEWASA
if (kondisi 1) :
<statement1>
elif (kondisi2) :
<statement2>
elif (kondisi3) :
68
<statement3>
…..
<statement ke n-1>
else :
<statement ke n>
KODE INTI :
self.txt_usia.SetValue(str(Usia))
if Usia > 50 :
self.pesan = wx.MessageDialog(self,\
"LANSIA","KATEGORI",wx.OK)
self.pesan = wx.MessageDialog(self,\
"DEWASA","KATEGORI",wx.OK)
self.pesan = wx.MessageDialog(self,\
"REMAJA","KATEGORI",wx.OK)
69
self.pesan = wx.MessageDialog(self,\
"ANAK-ANAK","KATEGORI",wx.OK)
else :
self.pesan = wx.MessageDialog(self,\
"BALITA","KATEGORI",wx.OK)
self.pesan.ShowModal()
KETERANGAN
self.pesan = wx.MessageDialog(self,\
"BALITA","KATEGORI",wx.OK)
self.pesan = wx.MessageDialog(self,\
"ANAK-ANAK","KATEGORI",wx.OK)
self.pesan = wx.MessageDialog(self,\
70
"REMAJA","KATEGORI",wx.OK)
self.pesan = wx.MessageDialog(self,\
"DEWASA","KATEGORI",wx.OK)
else :
self.pesan = wx.MessageDialog(self,\
"LANSIA","KATEGORI",wx.OK)
self.pesan.ShowModal()
5.2 RADIOBUTTON
71
kelamin serta menampilkan hasil inputan tersebut
dalam MessageDialog.
72
KODE TOMBOL PROSES
nama = self.txt_nama.GetValue()
if self.rPria.GetValue()==True :
jk = "Pria"
else :
jk ="Wanita"
self.pesan = wx.MessageDialog(self,\
a,"PESAN",wx.OK)
self.pesan.ShowModal()
PENJELASAN
73
penjelasan nama dan jenis kelamin sesuai inputan
user pada wx.TextCtrl dan wx.RadioButton.
CATATAN
self.rWanita.SetValue(True)
5.3 CHECKBOX
74
Gambar 5.6 Biodata dengan CheckBox
nama = self.txt_nama.GetValue()
if self.cOlahraga.GetValue()== True :
olahraga = "Ya"
else :
olahraga ="Tidak"
if self.cMembaca.GetValue()==True :
membaca = "Ya"
else :
75
membaca = "Tidak"
if self.cMenulis.GetValue()==True :
menulis ="Ya"
else :
menulis ="Tidak"
+ "Hobby : "+"\n"\
+ "Olahraga : "+olahraga\
self.pesan = wx.MessageDialog(self,\
pesan1,"PESAN",wx.OK)
self.pesan.ShowModal()
Contoh:
if self.cOlahraga.GetValue()==True :
76
Contoh :
self.cOlahraga.SetValue(True)
77
BAB VI
6.1 WX.COMBOBOX
1. Append()
Contoh:
self.cmbPendidikan.Append(“S1”)
2. GetStringSelection()
Contoh:
self.cmbPendidikan.GetStringSelection()
3. SetStringSelection()
Contoh:
78
self.cmbPendidikan.SetStringSelection(“S1”)
79
Contoh:
Choices : [„SD‟,‟SMP‟,‟SMA‟,‟S1‟]
self._init_ctrls(parent)
self._init_ctrls(parent)
self.cmbPendidikan.Append("SD")
self.cmbPendidikan.Append("SMP")
self.cmbPendidikan.Append("SMA")
self.cmbPendidikan.Append("S1")
80
KODE TOMBOL PROSES
nama = self.txt_nama.GetValue()
pnd = self.cmbPendidikan.GetStringSelection()
self.pesan = wx.MessageDialog(self,\
a,"PESAN",wx.OK)
self.pesan.ShowModal()
EVENT wx.EVT_COMBOBOX
81
Kelas Tarif
EXECUTIVE 650000
STANDARD 350000
FAMILY 250000
82
Gambar 6.3 Pengisian Pilihan Combo Melalui Inspector
83
Gambar 6.5 Tab Evts Inspector untuk ComboBox
3. Klik ComboEvent
84
4. Klik 2 kali pada wx.EVT_COMBOBOX sehingga
menghasilkan OnCmbKelasCombobox
event.Skip()
pil = self.cmbKelas.GetStringSelection()
if pil=="EXECUTIVE" :
self.txt_tarif.SetValue("650000")
85
elif pil=="STANDARD" :
self.txt_tarif.SetValue("350000")
else :
self.txt_tarif.SetValue("250000")
6.2 WX.LISTBOX
1. Append()
Contoh :
self.listBox1.Append(“Ahmad”)
2. Clear()
Contoh :
86
self.listBox1.Clear()
3. GetStringSelection()
Contoh :
self.listBox1.GetStringSelection()
87
Gambar 6.9 Aplikasi Demo ListBox
ListBox list_kota
TextCtrl txt_kota
Button Button1
(„Bersihkan
ListBox‟)
KODE INTI
def OnList_kotaListbox(self, event):
self.txt_kota.SetValue\
(self.list_kota.GetStringSelection())
88
def OnButton1Button(self, event):
self.list_kota.Clear()
self.list_kota.Clear()
self.list_kota.Append('Bandung')
self.list_kota.Append('Medan')
self.list_kota.Append('Solo')
self.list_kota.Append('Surabaya')
self.list_kota.Append('Jakarta')
89
Gambar 6.10 Event wx.EVT_LISTBOX
event.Skip()
self.txt_kota.SetValue\
(self.list_kota.GetStringSelection())
90
6.3 wx.ListCtrl
Sifat wx.ListCtrl :
91
FUNGSI – FUNGSI YANG SERING DIGUNAKAN
Method : GetItemCount()
jml_baris = self.lc.GetItemCount()
Method : DeleteAllItems()
self.lc.DeleteAllItems()
92
Tambahkan event pada wx.ListCtrl agar bisa
mengeksekusi kode pada saat diklik. Event tersebut
adalah:ListEvent>wx.EVT_LIST_ITEM_SELECTED
APLIKASI DEMO WX.LISTCTRL
Contoh aplikasi berikut akan menunjukkan cara kerja
wx.ListCtrl. Ada 2 buah textctrl untuk menerima
inputan nama dan alamat. Selanjutnya, jika ditekan
tombol Tambah, maka data nama dan alamat
tersebut akan berpindah ke wx.ListCtrl. Jika data
pada wx.ListCtrl di-klik, maka data tersebut akan
ditampilkan pada textctrl nama dan alamat.
PERANCANGAN LISTCTRL
93
Tahap perancangan ListCtrl meliputi setting
Inspector dan pengaturan kolom (Heading/ judul dan
lebarnya).
94
PENGATURAN JUMLAH DAN LEBAR KOLOM
95
Kolom yang akan dirancang adalah 2 buah. Satu
berjudul „Nama Lengkap‟ dan satunya lagi „Alamat.
96
Gambar 6.18 Penambahan Kolom ‘Alamat’
jml_baris =self.lc.GetItemCount()
self.lc.InsertStringItem(jml_baris,\
self.txt_nama.GetValue())
self.lc.SetStringItem(jml_baris,1,\
self.txt_alamat.GetValue())
jml_baris = jml_baris + 1
97
# Bersihkan Isian TextCtrl
self.txt_nama.SetValue("")
self.txt_alamat.SetValue("")
self.txt_nama.SetFocus()
no_baris = event.m_itemIndex
nama = self.lc.GetItem(no_baris,0).GetText()
alamat = self.lc.GetItem(no_baris,1).GetText()
self.txt_nama.SetValue(nama)
self.txt_alamat.SetValue(alamat)
98
BAB VII
PERULANGAN
1. while
while <kondisi> :
<pernyataan>
2. for
<pernyataan>
99
ListBox untuk mengisikan daftar angka dari angka
awal sampai akhir.
Nama-nama Object
Jenis Nama
Object
TextCtrl txt_awal
TextCtrl txt_akhir
Button tmbIsi_ListBox
ListBox Lb
100
def OnTmbIsi_ListBoxButton(self, event):
awal = int(self.txt_awal.GetValue())
akhir = int(self.txt_akhir.GetValue())
self.lb.Append(str(awal))
awal = awal + 1
awal = int(self.txt_awal.GetValue())
akhir = int(self.txt_akhir.GetValue())
i = awal
self.lb.Append(str(i))
CATATAN
101
Penggunaan fungsi range pada for
for i in range (awal,akhir+1) :
awal = awal + 1
102
BAB VIII
import MySQLdb
103
Gambar 8.1 Pengecekan Modul MySQLdb (berjalan
sukses)
1. Mengimport MySQLdb
import MySQLdb
2. Buat Koneksi
Contoh Syntax :
conn=MySQLdb.connect(host="localhost",user="root",\
passwd="",db="LatPython")
104
3. Buat Cursor.
Contoh Syntax :
sql = “ insert into mhs (nim,nama) values
(„%s‟,‟%s‟)”%(txt_nim,txt_nama)
Contoh Syntax:
105
cur.execute(sql)
Contoh Syntax :
conn.commit()
Mengimport
MySQLdb import MySQLdb
conn=MySQLdb.connect\
Membuat
Koneksi (host="localhost",\
user="root",passwd="",db="LatPython"
Membuat
Cursor cur = conn.cursor()
sql = “ insert into mhs \
Membuat
Variable (nim,nama) values („%s‟,‟%s‟)”%\
Perintah SQL (txt_nim,txt_nama)
Mengeksekusi
Perintah SQL cur.execute(sql)
106
TAHAPAN CONTOH SYNTAX
Commit pada
Database conn.commit()
Database : Akademik
Tabel : mhs
nim VarChar 8
nama VarChar 25
107
terinstal pada C:\xampp. Klik 2 kali pada icon
XAMPP Control.
108
Gambar 8.4 Tampilan Awal phpmyadmin
109
Gambar 8.6 Database Akademik Telah Tercipta
Name : mhs
Number of fields : 2
110
Berikutnya, atur field nim dan nama seperti pada
Gambar 8.8 kemudian tekan tombol Save.
111
MENGISIKAN RECORD BARU
112
Gambar 8.12 Dua Record Baru Ditambahkan
113
Bagian yang pertama (Mencari Data 1 Record), user
menginputkan NIM yang akan dicari, selanjutnya jika
ditekan tombol Cari akan menampilkan nama
berdasarkan NIM tersebut jika ada dalam database.
Jika tidak ada akan ditampilkan pesan bahwa data
dengan NIM tersebut tidak ada.
LISTING KODE
#Boa:Frame:Frame1
conn=MySQLdb.connect(host="localhost",user="root",p
asswd="",db="Akademik")
cur = conn.cursor()
def create(parent):
114
return Frame1(parent)
[wxID_FRAME1, wxID_FRAME1PANEL1,
wxID_FRAME1STATICTEXT1,
wxID_FRAME1STATICTEXT2, wxID_FRAME1TMBCARI,
wxID_FRAME1TXT_NAMA,
wxID_FRAME1TXT_NIM,
class Frame1(wx.Frame):
style=wx.DEFAULT_FRAME_STYLE, title='Cari
Data Mahasiswa')
self.SetClientSize(wx.Size(384, 143))
self.panel1 = wx.Panel(id=wxID_FRAME1PANEL1,
name='panel1', parent=self,
style=wx.TAB_TRAVERSAL)
115
self.panel1.SetBackgroundColour(wx.Colour(211,
211, 211))
self.staticText1 =
wx.StaticText(id=wxID_FRAME1STATICTEXT1,
label='NIM',
name='staticText1', parent=self.panel1,
pos=wx.Point(32, 32),
self.txt_nim =
wx.TextCtrl(id=wxID_FRAME1TXT_NIM, name='txt_nim',
style=0, value='')
self.staticText2 =
wx.StaticText(id=wxID_FRAME1STATICTEXT2,
label='Nama', name='staticText2',
parent=self.panel1,
self.txt_nama =
wx.TextCtrl(id=wxID_FRAME1TXT_NAMA,
name='txt_nama',
116
parent=self.panel1, pos=wx.Point(128, 80),
size=wx.Size(192, 21),
style=0, value='')
self.tmbCari =
wx.Button(id=wxID_FRAME1TMBCARI, label='Cari',
name='tmbCari', parent=self.panel1,
pos=wx.Point(248, 32),
self.tmbCari.Bind(wx.EVT_BUTTON,
self.OnTmbCariButton,
id=wxID_FRAME1TMBCARI)
self._init_ctrls(parent)
cur.execute(sql)
hasil= cur.fetchone()
if cur.rowcount > 0 :
self.txt_nama.SetValue(hasil[1])
117
else :
self.pesan = wx.MessageDialog(self,"Data
Tidak Ada","Konfirmasi",wx.OK)
self.pesan.ShowModal()
PENJELASAN KODE
118
def create(parent):
return Frame1(parent)
…. dan seterusnya……………
self._init_ctrls(parent)
cur.execute(sql)
hasil= cur.fetchone()
119
if cur.rowcount > 0 :
self.txt_nama.SetValue(hasil[1])
else :
self.pesan.ShowModal()
120
Jika ada, tampilkan pada textCtrl txt_nama. Isikan
ke textCtrl tersebut data pada indeks ke-1 yang
berisi data nama. Perintahnya adalah:
self.txt_nama.SetValue(hasil[1])
self.pesan.ShowModal()
121
Gambar 8.15 Menampilkan Data Seluruh Mahasiswa
PERANCANGAN WX.LISTCTRL
122
Selanjutnya, aturlah Column-nya (tab Props) agar
memiliki 2 kolom dengan judul (Heading): NIM dan
Nama.
Heading Width
NIM 100
Nama 240
123
Gambar 8.17 Kode Import, Koneksi, Cursor
self._init_ctrls(parent)
self._init_ctrls(parent)
cur.execute(sql)
hasil= cur.fetchall()
k =self.lc.GetItemCount()
for i in hasil :
self.lc.InsertStringItem(k,"%s"%i[0])
self.lc.SetStringItem(k,1,"%s"%i[1])
124
k=k+1
125
Selanjutnya, isikan ke kolom pertama dengan
perintah :
self.lc.InsertStringItem(k,"%s"%i[0])
Syntaxnya adalah:
SetStringItem(nomor_baris,nomor_kolom,isi)
#Boa:Frame:Frame1
conn=MySQLdb.connect(host="localhost",\
user="root",passwd="",db="Akademik")
126
cur = conn.cursor()
def create(parent):
return Frame1(parent)
[wxID_FRAME1, wxID_FRAME1LC,
wxID_FRAME1PANEL1,
class Frame1(wx.Frame):
parent.InsertColumn(col=0,
format=wx.LIST_FORMAT_LEFT, heading='NIM',
width=100)
parent.InsertColumn(col=1,
format=wx.LIST_FORMAT_LEFT, heading='Nama',
width=240)
127
wx.Frame.__init__(self, id=wxID_FRAME1, name='',
parent=prnt,
style=wx.DEFAULT_FRAME_STYLE,
title='Menampilkan Data Mahasiswa')
self.SetClientSize(wx.Size(384, 298))
self.panel1 = wx.Panel(id=wxID_FRAME1PANEL1,
name='panel1', parent=self,
style=wx.TAB_TRAVERSAL)
self.panel1.SetBackgroundColour(wx.Colour(201,
201, 201))
self._init_coll_lc_Columns(self.lc)
self._init_ctrls(parent)
cur.execute(sql)
128
hasil= cur.fetchall()
k =self.lc.GetItemCount()
for i in hasil :
self.lc.InsertStringItem(k,"%s"%i[0])
self.lc.SetStringItem(k,1,"%s"%i[1])
k=k+1
129
def OnTmbSimpanButton(self, event):
('%s','%s')" %(self.txt_nim.GetValue(),\
self.txt_nama.GetValue())
cur.execute(sql)
conn.commit()
self.txt_nim.SetValue("")
self.txt_nama.SetValue("")
self.txt_nim.SetFocus()
self.txt_nama.SetValue("")
130
#Boa:Frame:Frame1
conn=MySQLdb.connect(host="localhost",user="root",p
asswd="",db="Akademik")
cur = conn.cursor()
def create(parent):
return Frame1(parent)
[wxID_FRAME1, wxID_FRAME1PANEL1,
wxID_FRAME1STATICTEXT1,
wxID_FRAME1STATICTEXT2,
wxID_FRAME1TMBSIMPAN, wxID_FRAME1TXT_NAMA,
wxID_FRAME1TXT_NIM,
class Frame1(wx.Frame):
131
pos=wx.Point(493, 238), size=wx.Size(400, 218),
style=wx.DEFAULT_FRAME_STYLE,
title='Menyimpan Data Mahasiswa')
self.SetClientSize(wx.Size(384, 180))
self.panel1 = wx.Panel(id=wxID_FRAME1PANEL1,
name='panel1', parent=self,
style=wx.TAB_TRAVERSAL)
self.panel1.SetBackgroundColour(wx.Colour(214,
214, 214))
self.staticText1 =
wx.StaticText(id=wxID_FRAME1STATICTEXT1,
label='NIM',
name='staticText1', parent=self.panel1,
pos=wx.Point(32, 32),
self.txt_nim =
wx.TextCtrl(id=wxID_FRAME1TXT_NIM, name='txt_nim',
style=0, value='')
132
self.staticText2 =
wx.StaticText(id=wxID_FRAME1STATICTEXT2,
label='Nama', name='staticText2',
parent=self.panel1,
self.txt_nama =
wx.TextCtrl(id=wxID_FRAME1TXT_NAMA,
name='txt_nama',
style=0, value='')
self.tmbSimpan =
wx.Button(id=wxID_FRAME1TMBSIMPAN, label='Simpan',
name='tmbSimpan', parent=self.panel1,
pos=wx.Point(32, 136),
self.tmbSimpan.Bind(wx.EVT_BUTTON,
self.OnTmbSimpanButton,
id=wxID_FRAME1TMBSIMPAN)
self._init_ctrls(parent)
133
def OnTmbSimpanButton(self, event):
('%s','%s')" %(self.txt_nim.GetValue(),\
self.txt_nama.GetValue())
cur.execute(sql)
conn.commit()
self.txt_nim.SetValue("")
self.txt_nama.SetValue("")
self.txt_nim.SetFocus()
134
2. Mengecek apakah NIM yang diketikkan ada
dalam database atau tidak. Kalau tidak ada,
akan ditampilkan pesan.
135
1. Frame harus diberi dasar object Panel terlebih
dahulu sebelum object yang lain diletakkan. Jika
tidak, perpindahan antar object dengan
menekan tombol Enter tidak akan berjalan.
136
Gambar 8.21 wx.EVT_TEXT_ENTER pada txt_nim
if self.txt_nim.GetValue()=="" :
self.pesan = wx.MessageDialog\
self.pesan.ShowModal()
= '%s'" % (self.txt_nim.GetValue())
cur.execute(sql)
137
hasil= cur.fetchone()
if cur.rowcount>0 :
tanya = wx.MessageDialog(self,\
"Nama "+self.txt_nama.GetValue()\
,style = wx.YES_NO)
if tanya.ShowModal()==wx.ID_YES:
= '%s'" % (self.txt_nim.GetValue())
cur.execute(sql)
else :
self.pesan = wx.MessageDialog(self,\
di database","Konfirmasi",wx.OK)
self.pesan.ShowModal()
self.txt_nim.SetValue("")
self.txt_nama.SetValue("")
self.txt_nim.SetFocus()
PENJELASAN KODE
138
Pengecekan apakah textctrl txt_nim sudah terisi
atau belum menggunakan perintah :
if self.txt_nim.GetValue()=="" :
self.pesan.ShowModal()
"Nama "+self.txt_nama.GetValue()\
,style = wx.YES_NO)
Kodenya:
if tanya.ShowModal()==wx.ID_YES:
139
sql = "delete from mhs where nim \
= '%s'" % (self.txt_nim.GetValue())
cur.execute(sql)
#Boa:Frame:Frame1
conn=MySQLdb.connect(host="localhost",user="root",p
asswd="",db="Akademik")
cur = conn.cursor()
def create(parent):
return Frame1(parent)
[wxID_FRAME1, wxID_FRAME1PANEL1,
wxID_FRAME1STATICTEXT1,
wxID_FRAME1STATICTEXT2,
wxID_FRAME1STATICTEXT3, wxID_FRAME1TMBHAPUS,
wxID_FRAME1TXT_NAMA, wxID_FRAME1TXT_NIM,
140
class Frame1(wx.Frame):
style=wx.DEFAULT_FRAME_STYLE,
title='Menghapus Data Mahasiswa')
self.SetClientSize(wx.Size(384, 189))
self.panel1 = wx.Panel(id=wxID_FRAME1PANEL1,
name='panel1', parent=self,
style=wx.TAB_TRAVERSAL)
self.staticText1 =
wx.StaticText(id=wxID_FRAME1STATICTEXT1,
label='NIM',
name='staticText1', parent=self.panel1,
pos=wx.Point(48, 32),
141
self.txt_nim =
wx.TextCtrl(id=wxID_FRAME1TXT_NIM, name='txt_nim',
style=wx.TE_PROCESS_ENTER, value='')
self.txt_nim.Bind(wx.EVT_TEXT_ENTER,
self.OnTxt_nimTextEnter,
id=wxID_FRAME1TXT_NIM)
self.staticText2 =
wx.StaticText(id=wxID_FRAME1STATICTEXT2,
label='Nama', name='staticText2',
parent=self.panel1,
self.txt_nama =
wx.TextCtrl(id=wxID_FRAME1TXT_NAMA,
name='txt_nama',
style=0, value='')
self.staticText3 =
wx.StaticText(id=wxID_FRAME1STATICTEXT3,
142
label='(Tekan ENTER)', name='staticText3',
parent=self.panel1,
self.staticText3.SetBackgroundColour(wx.Colour(255,
255, 255))
self.staticText3.SetForegroundColour(wx.Colour(255,
0, 0))
self.staticText3.SetFont(wx.Font(8, wx.SWISS,
wx.NORMAL, wx.BOLD, False,
'Tahoma'))
self.tmbHapus =
wx.Button(id=wxID_FRAME1TMBHAPUS, label='Hapus',
name='tmbHapus', parent=self.panel1,
pos=wx.Point(48, 136),
self.tmbHapus.Bind(wx.EVT_BUTTON,
self.OnTmbHapusButton,
id=wxID_FRAME1TMBHAPUS)
self._init_ctrls(parent)
143
if self.txt_nim.GetValue()=="" :
self.pesan = wx.MessageDialog\
self.pesan.ShowModal()
event.Skip()
= '%s'" % (self.txt_nim.GetValue())
cur.execute(sql)
hasil= cur.fetchone()
if cur.rowcount>0 :
tanya = wx.MessageDialog(self,\
"Nama "+self.txt_nama.GetValue()\
,style = wx.YES_NO)
if tanya.ShowModal()==wx.ID_YES:
= '%s'" % (self.txt_nim.GetValue())
cur.execute(sql)
else :
144
self.pesan = wx.MessageDialog(self,\
di database","Konfirmasi",wx.OK)
self.pesan.ShowModal()
self.txt_nim.SetValue("")
self.txt_nama.SetValue("")
self.txt_nim.SetFocus()
= '%s'" %(self.txt_nim.GetValue())
cur.execute(sql)
hasil= cur.fetchone()
if cur.rowcount > 0 :
self.txt_nama.SetValue(hasil[1])
else :
self.pesan = wx.MessageDialog(self,\
self.pesan.ShowModal()
145
Aplikasi terakhir yang berkaitan dengan akses ke
database adalah edit/ update data. User
memasukkan NIM yang akan diedit, kemudian
sistem akan menampilkan nama yang sesuai
dengan NIM tersebut. Selanjutnya, nama tersebut
diedit dan perubahannya disimpan dalam database
dengan menekan tombol Edit.
146
KODE TOMBOL EDIT
def OnTmbEditButton(self, event):
'%s'"%(self.txt_nama.GetValue(),\
self.txt_nim.GetValue())
cur.execute(sql)
conn.commit()
self.txt_nim.SetValue("")
self.txt_nama.SetValue("")
self.txt_nim.SetFocus()
'%s'"%(self.txt_nama.GetValue(),\
self.txt_nim.GetValue())
147
import wx, MySQLdb
conn=MySQLdb.connect(host="localhost",user="root",p
asswd="",db="Akademik")
cur = conn.cursor()
def create(parent):
return Frame1(parent)
[wxID_FRAME1, wxID_FRAME1PANEL1,
wxID_FRAME1STATICTEXT1,
wxID_FRAME1STATICTEXT2,
wxID_FRAME1STATICTEXT3, wxID_FRAME1TMBEDIT,
wxID_FRAME1TXT_NAMA, wxID_FRAME1TXT_NIM,
class Frame1(wx.Frame):
148
style=wx.DEFAULT_FRAME_STYLE,
title='Mengedit Data Mahasiswa')
self.SetClientSize(wx.Size(384, 189))
self.panel1 = wx.Panel(id=wxID_FRAME1PANEL1,
name='panel1', parent=self,
style=wx.TAB_TRAVERSAL)
self.staticText1 =
wx.StaticText(id=wxID_FRAME1STATICTEXT1,
label='NIM',
name='staticText1', parent=self.panel1,
pos=wx.Point(48, 32),
self.txt_nim =
wx.TextCtrl(id=wxID_FRAME1TXT_NIM, name='txt_nim',
style=wx.TE_PROCESS_ENTER, value='')
self.txt_nim.Bind(wx.EVT_TEXT_ENTER,
self.OnTxt_nimTextEnter,
id=wxID_FRAME1TXT_NIM)
149
self.staticText2 =
wx.StaticText(id=wxID_FRAME1STATICTEXT2,
label='Nama', name='staticText2',
parent=self.panel1,
self.txt_nama =
wx.TextCtrl(id=wxID_FRAME1TXT_NAMA,
name='txt_nama',
style=0, value='')
self.staticText3 =
wx.StaticText(id=wxID_FRAME1STATICTEXT3,
self.staticText3.SetBackgroundColour(wx.Colour(255,
255, 255))
self.staticText3.SetForegroundColour(wx.Colour(255,
0, 0))
self.staticText3.SetFont(wx.Font(8, wx.SWISS,
wx.NORMAL, wx.BOLD, False,
'Tahoma'))
150
self.tmbEdit =
wx.Button(id=wxID_FRAME1TMBEDIT, label='Edit',
name='tmbEdit', parent=self.panel1,
pos=wx.Point(56, 120),
self.tmbEdit.Bind(wx.EVT_BUTTON,
self.OnTmbEditButton,
id=wxID_FRAME1TMBEDIT)
self._init_ctrls(parent)
= '%s'" %(self.txt_nim.GetValue())
cur.execute(sql)
hasil= cur.fetchone()
if cur.rowcount > 0 :
self.txt_nama.SetValue(hasil[1])
else :
self.pesan = wx.MessageDialog(self,\
151
"Data Tidak Ada","Konfirmasi",wx.OK)
self.pesan.ShowModal()
'%s'"%(self.txt_nama.GetValue(),\
self.txt_nim.GetValue())
cur.execute(sql)
conn.commit()
self.txt_nim.SetValue("")
self.txt_nama.SetValue("")
self.txt_nim.SetFocus()
152
Bersih, untuk membersihkan semua textctrl dan
memfocuskan kursor mouse ke textctrl txt_nim.
153
def Bersih(self) :
self.txt_nim.SetValue("")
self.txt_nama.SetValue("")
self.txt_nim.SetFocus()
= '%s'" %(self.txt_nim.GetValue())
cur.execute(sql)
hasil= cur.fetchone()
if cur.rowcount > 0 :
154
'%s' where nim ='%s'"%\
(self.txt_nama.GetValue(),\
self.txt_nim.GetValue())
else :
values ('%s','%s')"%(self.txt_nim.GetValue(),\
self.txt_nama.GetValue())
cur.execute(sql)
self.Bersih()
#Boa:Frame:Frame1
conn=MySQLdb.connect(host="localhost",user="root",p
asswd="",db="Akademik")
cur = conn.cursor()
def create(parent):
return Frame1(parent)
155
[wxID_FRAME1, wxID_FRAME1PANEL1,
wxID_FRAME1STATICTEXT1,
wxID_FRAME1STATICTEXT2,
wxID_FRAME1STATICTEXT3, wxID_FRAME1TMBBERSIH,
wxID_FRAME1TMBHAPUS, wxID_FRAME1TMSIMPAN,
wxID_FRAME1TXT_NAMA,
wxID_FRAME1TXT_NIM,
class Frame1(wx.Frame):
style=wx.DEFAULT_FRAME_STYLE, title='Input
Data Mahasiswa')
self.SetClientSize(wx.Size(415, 189))
self.panel1 = wx.Panel(id=wxID_FRAME1PANEL1,
name='panel1', parent=self,
style=wx.TAB_TRAVERSAL)
156
self.staticText1 =
wx.StaticText(id=wxID_FRAME1STATICTEXT1,
label='NIM',
name='staticText1', parent=self.panel1,
pos=wx.Point(48, 32),
self.txt_nim =
wx.TextCtrl(id=wxID_FRAME1TXT_NIM, name='txt_nim',
style=wx.TE_PROCESS_ENTER, value='')
self.txt_nim.Bind(wx.EVT_TEXT_ENTER,
self.OnTxt_nimTextEnter,
id=wxID_FRAME1TXT_NIM)
self.staticText2 =
wx.StaticText(id=wxID_FRAME1STATICTEXT2,
label='Nama', name='staticText2',
parent=self.panel1,
157
self.txt_nama =
wx.TextCtrl(id=wxID_FRAME1TXT_NAMA,
name='txt_nama',
style=0, value='')
self.staticText3 =
wx.StaticText(id=wxID_FRAME1STATICTEXT3,
self.staticText3.SetBackgroundColour(wx.Colour(255,
255, 255))
self.staticText3.SetForegroundColour(wx.Colour(255,
0, 0))
self.staticText3.SetFont(wx.Font(8, wx.SWISS,
wx.NORMAL, wx.BOLD, False,
'Tahoma'))
self.tmbHapus =
wx.Button(id=wxID_FRAME1TMBHAPUS, label='Hapus',
name='tmbHapus', parent=self.panel1,
pos=wx.Point(248, 128),
158
self.tmbHapus.Bind(wx.EVT_BUTTON,
self.OnTmbHapusButton,
id=wxID_FRAME1TMBHAPUS)
self.tmSimpan =
wx.Button(id=wxID_FRAME1TMSIMPAN, label='Simpan',
name='tmSimpan', parent=self.panel1,
pos=wx.Point(48, 128),
self.tmSimpan.Bind(wx.EVT_BUTTON,
self.OnTmSimpanButton,
id=wxID_FRAME1TMSIMPAN)
self.tmbBersih =
wx.Button(id=wxID_FRAME1TMBBERSIH, label='Bersih',
name='tmbBersih', parent=self.panel1,
pos=wx.Point(152, 128),
self.tmbBersih.Bind(wx.EVT_BUTTON,
self.OnTmbBersihButton,
id=wxID_FRAME1TMBBERSIH)
self._init_ctrls(parent)
159
def Bersih(self) :
self.txt_nim.SetValue("")
self.txt_nama.SetValue("")
self.txt_nim.SetFocus()
if self.txt_nim.GetValue()=="" :
self.pesan = wx.MessageDialog\
self.pesan.ShowModal()
event.Skip()
= '%s'" % (self.txt_nim.GetValue())
cur.execute(sql)
hasil= cur.fetchone()
if cur.rowcount>0 :
tanya = wx.MessageDialog(self,\
"Nama "+self.txt_nama.GetValue()\
160
,style = wx.YES_NO)
if tanya.ShowModal()==wx.ID_YES:
= '%s'" % (self.txt_nim.GetValue())
cur.execute(sql)
else :
self.pesan = wx.MessageDialog(self,\
di database","Konfirmasi",wx.OK)
self.pesan.ShowModal()
self.txt_nim.SetValue("")
self.txt_nama.SetValue("")
self.txt_nim.SetFocus()
= '%s'" %(self.txt_nim.GetValue())
cur.execute(sql)
hasil= cur.fetchone()
if cur.rowcount > 0 :
self.txt_nama.SetValue(hasil[1])
161
else :
self.pesan = wx.MessageDialog(self,\
self.pesan.ShowModal()
= '%s'" %(self.txt_nim.GetValue())
cur.execute(sql)
hasil= cur.fetchone()
if cur.rowcount > 0 :
(self.txt_nama.GetValue(),\
self.txt_nim.GetValue())
else :
values ('%s','%s')"%(self.txt_nim.GetValue(),\
self.txt_nama.GetValue())
cur.execute(sql)
self.Bersih()
162
def OnTmbBersihButton(self, event):
self.Bersih()
163
BAB IX
PEMBUATAN MENU
9.1 PENDAHULUAN
164
Kita akan menggunakan contoh-contoh Frame yang
sudah dibuat pada BAB VIII untuk menunjukkan cara
kerja menu. Pada Bab VIII sebelumnya, Frame yang
sudah dibuat adalah :
165
Gambar 9.2 Hierarki Menu yang Dirancang
1. MenuBar
2. Menu
3. MenuItem
166
Gambar 9.3 Hierarki Menu Secara Umum
- FrCariData.py
- FrEdit.py
- FrGabungan.py
- FrHapus.py
- FrLihatData.py
167
- FrSimpan.py
168
Gambar 9.6 menuBar1 telah diletakkan pada
Frame
169
Gambar 9.8 Tiga wx.Menu Telah Diletakkan pada
Frame
170
Gambar 9.10 Name ketiga Menu Telah Diubah
171
Klik Menus, sehingga muncul tombol kecil tiga titik
(...), kemudian klik tombol tersebut untuk
menampilkan jendel menuBar1.Menus
172
Selanjutnya, tambahkan tulisan baru dengan
mengklik icon „Tambah‟, sehingga muncul tulisan
baru:Menus1
173
Buatlah tulisan baru, ganti title-nya menjadi
Gabungan, dan Menu = self.menuGabungan
174
Klik pada bagian Items sehingga muncul tombol
bertitik tiga (...), kemudian klik tombol kecil tersebut
sehingga muncul jendela menuTampil.Items
175
Buatlah yang semisal dengan itu untuk Menu yang
lain, dengan ketentuan sebagai berikut:
Menu Setting Nilai
ItemId Tampil1
Tampilkan Data 1
Tampilkan Text Record
Data
ItemId Tampil_Semua
Text Tampilkan Semua Data
ItemId Simpan
Text Simpan Data
ItemId Edit
Ubah Data
Text Edit Data
ItemId Hapus
Text Hapus Data
ItemId Gabungan
Gabungan
Text Frame Gabungan
8. Aturlah Inspector untuk Frame (tab Props) agar
MenuBar-nya adalah self.menuBar1.
176
9. Buat Event pada setiap MenuItem
event.Skip()
177
Ubahlah kode pada method baru tersebut untuk
memanggil Frame yang diinginkan. Misalnya, kode
untuk memanggil Frame „Tampil Data 1 Record‟
(FrCariData.py) adalah :
def OnMenuTampilTampil1Menu(self, event):
self.main = FrCariData.create(None)
self.main.Show()
self.main = FrCariData.create(None)
self.main.Show()
self.main = FrLihatData.create(None)
self.main.Show()
self.main = FrSimpan.create(None)
self.main.Show()
self.main = FrEdit.create(None)
self.main.Show()
178
def OnMenuUbahHapusMenu(self, event):
self.main = FrHapus.create(None)
self.main.Show()
self.main = FrGabungan.create(None)
self.main.Show()
179
Jangan lupa klik icon Post.
180
MEMBUAT SEPARATOR (GARIS PEMISAH
ANTAR MENUITEM)
181
Gambar 9.28 Tanda Separator Ditambahkan
182
Gambar 9.29 Menambahkan MenuItem ‘Exit’
183
Kode yang otomatis dihasilkan setelah pembuatan
event :
def OnMenuTampilExitMenu(self, event):
event.Skip()
def create(parent):
return Frame1(parent)
[wxID_FRAME1MENUTAMPILEXIT,
wxID_FRAME1MENUTAMPILTAMPIL1,
wxID_FRAME1MENUTAMPILTAMPIL_SEMUA,
184
[wxID_FRAME1MENUUBAHEDIT,
wxID_FRAME1MENUUBAHHAPUS,
wxID_FRAME1MENUUBAHSIMPAN,
[wxID_FRAME1MENUGABUNGANGABUNGAN] =
[wx.NewId() for _init_coll_menuGabungan_Items in
range(1)]
class Frame1(wx.Frame):
parent.Append(help='',
id=wxID_FRAME1MENUUBAHSIMPAN,
parent.Append(help='',
id=wxID_FRAME1MENUUBAHEDIT,
kind=wx.ITEM_NORMAL,
text='Edit Data')
parent.Append(help='',
id=wxID_FRAME1MENUUBAHHAPUS,
kind=wx.ITEM_NORMAL,
text='Hapus Data')
self.Bind(wx.EVT_MENU,
self.OnMenuUbahSimpanMenu,
185
id=wxID_FRAME1MENUUBAHSIMPAN)
self.Bind(wx.EVT_MENU,
self.OnMenuUbahEditMenu,
id=wxID_FRAME1MENUUBAHEDIT)
self.Bind(wx.EVT_MENU,
self.OnMenuUbahHapusMenu,
id=wxID_FRAME1MENUUBAHHAPUS)
parent.Append(help='',
id=wxID_FRAME1MENUTAMPILTAMPIL1,
parent.Append(help='',
id=wxID_FRAME1MENUTAMPILTAMPIL_SEMUA,
kind=wx.ITEM_NORMAL, text='Tampilkan
Semua Data')
parent.AppendSeparator()
parent.Append(help='',
id=wxID_FRAME1MENUTAMPILEXIT,
kind=wx.ITEM_NORMAL, text='Exit')
self.Bind(wx.EVT_MENU,
self.OnMenuTampilTampil1Menu,
186
id=wxID_FRAME1MENUTAMPILTAMPIL1)
self.Bind(wx.EVT_MENU,
self.OnMenuTampilTampil_semuaMenu,
id=wxID_FRAME1MENUTAMPILTAMPIL_SEMUA)
self.Bind(wx.EVT_MENU,
self.OnMenuTampilExitMenu,
id=wxID_FRAME1MENUTAMPILEXIT)
parent.Append(menu=self.menuTampil,
title='Tampilkan Data')
parent.Append(menu=self.menuUbah, title='Ubah
Data')
parent.Append(menu=self.menuGabungan,
title='Gabungan')
parent.Append(help='',
id=wxID_FRAME1MENUGABUNGANGABUNGAN,
187
kind=wx.ITEM_NORMAL, text='Frame
Gabungan')
self.Bind(wx.EVT_MENU,
self.OnMenuGabunganGabunganMenu,
id=wxID_FRAME1MENUGABUNGANGABUNGAN)
def _init_utils(self):
self.menuTampil = wx.Menu(title='')
self.menuUbah = wx.Menu(title='')
self.menuGabungan = wx.Menu(title='')
self.menuBar1 = wx.MenuBar()
self.menuBar1.SetClientSize(wx.Size(77368304,
27135440))
self._init_coll_menuTampil_Items(self.menuTampil)
self._init_coll_menuUbah_Items(self.menuUbah)
self._init_coll_menuGabungan_Items(self.menuGabungan)
188
self._init_coll_menuBar1_Menus(self.menuBar1)
style=wx.DEFAULT_FRAME_STYLE, title='Menu
Utama')
self._init_utils()
self.SetClientSize(wx.Size(1366, 706))
self.Enable(True)
self.SetMenuBar(self.menuBar1)
self._init_ctrls(parent)
self.main = FrCariData.create(None)
self.main.Show()
189
self.main = FrLihatData.create(None)
self.main.Show()
self.main = FrSimpan.create(None)
self.main.Show()
self.main = FrEdit.create(None)
self.main.Show()
self.main = FrHapus.create(None)
self.main.Show()
self.main = FrGabungan.create(None)
self.main.Show()
self.Close()
190
9.3 MEMBUAT MENU DENGAN KODE
2. Buat wx.Menu()
menuTampil_Data = wx.Menu()
Syntax :
nama_menu.Append(nomor_akses,tulisan)
menuTampil_Data.Append(1, "Tampilkan Data 1 Record")
menuTampil_Data.Append(3, "Exit")
191
5. Membuat wx.MenuBar
menuBar = wx.MenuBar()
Syntax :
nama_menuBar.Append(nama_wx.Menu,tulisan_yg
_ditampilkan)
menuBar.Append(menuTampil_Data, "Tampilkan Data")
menuBar.Append(menuGabungan,"Gabungan")
self.CreateStatusBar()
Syntax :
self.Bind(wx.EVT_MENU,self.nama_Event, id=no_akses)
192
no_akses harus sama dengan no_akses yang dibuat
pada poin ke-3 (Menambahkan MenuItem pada
wx.Menu yang sudah dibuat)
Contoh kode :
self.Bind(wx.EVT_MENU, self.OnTampil1, id=1)
Contoh kode :
def OnTampil1(self, event):
self.main = FrCariData.create(None)
self.main.Show()
self.main = FrLihatData.create(None)
self.main.Show()
self.Close()
CATATAN PENTING :
193
self._init_ctrls(parent)
def create(parent):
return Frame1(parent)
class Frame1(wx.Frame):
194
style=wx.DEFAULT_FRAME_STYLE, title='Menu
Utama')
self.SetClientSize(wx.Size(1366, 706))
self._init_ctrls(parent)
menuTampil_Data = wx.Menu()
menuTampil_Data.AppendSeparator()
menuTampil_Data.Append(3, "Exit")
menuUbah_Data = wx.Menu()
menuGabungan = wx.Menu()
menuBar = wx.MenuBar()
menuBar.Append(menuTampil_Data, "Tampilkan
Data")
195
menuBar.Append(menuGabungan, "Gabungan")
self.SetMenuBar(menuBar)
#Membuat StatusBar
self.CreateStatusBar()
self.Bind(wx.EVT_MENU, self.OnTampil_Semua,
id=2)
self.Bind(wx.EVT_MENU, self.OnSimpan_Data,
id=4)
self.Bind(wx.EVT_MENU, self.OnHapus_Data,
id=5)
self.main = FrCariData.create(None)
self.main.Show()
self.main = FrLihatData.create(None)
196
self.main.Show()
self.Close()
self.main = FrSimpan.create(None)
self.main.Show()
self.main = FrHapus.create(None)
self.main.Show()
self.main = FrEdit.create(None)
self.main.Show()
self.main = FrGabungan.create(None)
self.main.Show()
197
BAB X
10.1 PENDAHULUAN
198
ditunjukkan penggunaan RadioButton yang terkait
dengan akses ke Database.
nim Varchar 8
nama Varchar 25
jns_klm Varchar 1
199
(Secara detail, cara pembuatan database dan tabel
bisa dilihat kembali pada bab VIII)
DESAIN FRAME
200
kelamin. Data jenis kelamin hanya ada 2
kemungkinan yaitu “L” untuk Laki-laki dan “P”
untuk Perempuan. Proses ini ada dalam event
OnTxt_nimTextEnter.
3. Membersihkan RadioButton.
= '%s'" %(self.txt_nim.GetValue())
cur.execute(sql)
hasil= cur.fetchone()
if cur.rowcount > 0 :
self.txt_nama.SetValue(hasil[1])
if hasil[2]=="L" :
self.rLaki.SetValue(True)
else :
self.rWanita.SetValue(True)
201
else :
self.pesan = wx.MessageDialog(self,\
self.pesan.ShowModal()
PENJELASAN
self.rLaki.SetValue(True)
else :
self.rWanita.SetValue(True)
= '%s'" %(self.txt_nim.GetValue())
cur.execute(sql)
202
hasil= cur.fetchone()
if self.rLaki.GetValue()== True :
jkl = "L"
else :
jkl = "P"
if cur.rowcount > 0 :
(self.txt_nama.GetValue(),\
jkl,self.txt_nim.GetValue())
else :
jns_klm) \
values ('%s','%s','%s')"%(self.txt_nim.GetValue(),\
self.txt_nama.GetValue(),jkl)
cur.execute(sql)
self.Bersih()
PENJELASAN
203
atau rWanita. Hasil pengecekan tersebut disimpan
dalam variabel jkl. Kodenya sebagai berikut:
if self.rLaki.GetValue()== True :
jkl = "L"
else :
jkl = "P"
(self.txt_nama.GetValue(),\
jkl,self.txt_nim.GetValue())
values ('%s','%s','%s')"%(self.txt_nim.GetValue(),\
self.txt_nama.GetValue(),jkl)
self.txt_nim.SetValue("")
self.txt_nama.SetValue("")
self.rLaki.SetValue(False)
204
self.rWanita.SetValue(False)
self.txt_nim.SetFocus()
PENJELASAN
self.rWanita.SetValue(False) mengosongkan
pilihan pada RadioButton rWanita.
conn=MySQLdb.connect(host="localhost",user="root",p
asswd="",db="akses_database")
cur = conn.cursor()
def create(parent):
return Frame1(parent)
205
[wxID_FRAME1, wxID_FRAME1PANEL1,
wxID_FRAME1RLAKI, wxID_FRAME1RWANITA,
wxID_FRAME1STATICTEXT1,
wxID_FRAME1STATICTEXT2,
wxID_FRAME1STATICTEXT3,
wxID_FRAME1STATICTEXT4,
wxID_FRAME1TMB_BERSIH, wxID_FRAME1TMB_HAPUS,
wxID_FRAME1TMB_SIMPAN, wxID_FRAME1TXT_NAMA,
wxID_FRAME1TXT_NIM,
class Frame1(wx.Frame):
style=wx.DEFAULT_FRAME_STYLE,
self.SetClientSize(wx.Size(384, 299))
self.panel1 = wx.Panel(id=wxID_FRAME1PANEL1,
name='panel1', parent=self,
206
style=wx.TAB_TRAVERSAL)
self.panel1.SetBackgroundColour(wx.Colour(192,
192, 192))
self.staticText1 =
wx.StaticText(id=wxID_FRAME1STATICTEXT1,
label='NIM',
name='staticText1', parent=self.panel1,
pos=wx.Point(24, 40),
self.txt_nim =
wx.TextCtrl(id=wxID_FRAME1TXT_NIM, name='txt_nim',
style=wx.TE_PROCESS_ENTER, value='')
self.txt_nim.Bind(wx.EVT_TEXT_ENTER,
self.OnTxt_nimTextEnter,
id=wxID_FRAME1TXT_NIM)
self.staticText2 =
wx.StaticText(id=wxID_FRAME1STATICTEXT2,
label='Nama', name='staticText2',
parent=self.panel1,
207
self.txt_nama =
wx.TextCtrl(id=wxID_FRAME1TXT_NAMA,
name='txt_nama',
style=0, value='')
self.staticText3 =
wx.StaticText(id=wxID_FRAME1STATICTEXT3,
self.rLaki = wx.RadioButton(id=wxID_FRAME1RLAKI,
label='Laki-laki',
name='rLaki', parent=self.panel1,
pos=wx.Point(112, 168),
self.rLaki.SetValue(True)
self.rWanita =
wx.RadioButton(id=wxID_FRAME1RWANITA,
label='Wanita',
208
name='rWanita', parent=self.panel1,
pos=wx.Point(232, 168),
self.rWanita.SetValue(False)
self.tmb_Simpan =
wx.Button(id=wxID_FRAME1TMB_SIMPAN,
label='Simpan',
name='tmb_Simpan', parent=self.panel1,
pos=wx.Point(24, 216),
self.tmb_Simpan.Bind(wx.EVT_BUTTON,
self.OnTmb_SimpanButton,
id=wxID_FRAME1TMB_SIMPAN)
self.tmb_Bersih =
wx.Button(id=wxID_FRAME1TMB_BERSIH, label='Bersih',
name='tmb_Bersih', parent=self.panel1,
pos=wx.Point(144, 216),
self.tmb_Bersih.Bind(wx.EVT_BUTTON,
self.OnTmb_BersihButton,
id=wxID_FRAME1TMB_BERSIH)
209
self.tmb_Hapus =
wx.Button(id=wxID_FRAME1TMB_HAPUS, label='Hapus',
name='tmb_Hapus', parent=self.panel1,
pos=wx.Point(248, 216),
self.tmb_Hapus.Bind(wx.EVT_BUTTON,
self.OnTmb_HapusButton,
id=wxID_FRAME1TMB_HAPUS)
self.staticText4 =
wx.StaticText(id=wxID_FRAME1STATICTEXT4,
label='(ENTER)', name='staticText4',
parent=self.panel1,
self.staticText4.SetForegroundColour(wx.Colour(255,
0, 0))
self.staticText4.SetFont(wx.Font(8, wx.SWISS,
wx.NORMAL, wx.BOLD, False,
'Tahoma'))
self._init_ctrls(parent)
def Bersih(self) :
self.txt_nim.SetValue("")
210
self.txt_nama.SetValue("")
self.rLaki.SetValue(False)
self.rWanita.SetValue(False)
self.txt_nim.SetFocus()
= '%s'" %(self.txt_nim.GetValue())
cur.execute(sql)
hasil= cur.fetchone()
if cur.rowcount > 0 :
self.txt_nama.SetValue(hasil[1])
if hasil[2]=="L" :
self.rLaki.SetValue(True)
else :
self.rWanita.SetValue(True)
else :
self.pesan = wx.MessageDialog(self,\
self.pesan.ShowModal()
211
def OnTmb_SimpanButton(self, event):
= '%s'" %(self.txt_nim.GetValue())
cur.execute(sql)
hasil= cur.fetchone()
if self.rLaki.GetValue()== True :
jkl = "L"
else :
jkl = "P"
if cur.rowcount > 0 :
(self.txt_nama.GetValue(),\
jkl,self.txt_nim.GetValue())
else :
values ('%s','%s','%s')"%(self.txt_nim.GetValue(),\
self.txt_nama.GetValue(),jkl)
cur.execute(sql)
212
self.Bersih()
self.Bersih()
if self.txt_nim.GetValue()=="" :
self.pesan = wx.MessageDialog\
self.pesan.ShowModal()
event.Skip()
= '%s'" % (self.txt_nim.GetValue())
cur.execute(sql)
hasil= cur.fetchone()
if cur.rowcount>0 :
tanya = wx.MessageDialog(self,\
213
"Nama "+self.txt_nama.GetValue()\
,style = wx.YES_NO)
if tanya.ShowModal()==wx.ID_YES:
where nim \
= '%s'" % (self.txt_nim.GetValue())
cur.execute(sql)
else :
self.pesan = wx.MessageDialog(self,\
di database","Konfirmasi",wx.OK)
self.pesan.ShowModal()
214
Field Tipe Lebar
benua VarChar 25
negara VarChar 25
Benua Negara
ASIA INDONESIA
AFRIKA NIGERIA
EROPA ALBANIA
AUSTRALIA SELANDIA
BARU
AMERIKA SURINAME
ASIA JEPANG
215
untuk mengambil data yang unik pada kolom (field)
tertentu. Klik event pada ComboBox juga akan
ditunjukkan, sehingga kode pengisian cmb_negara
akan dieksekusi saat cmb_benua dipilih.
216
KODE INTI :
def Isi_Combo_Negara(self) :
self.cmb_negara.Clear()
benua = self.cmb_benua.GetStringSelection()
benua_negara where \
cur.execute(sql)
hasil= cur.fetchall()
if cur.rowcount > 0 :
for k in hasil:
self.cmb_negara.Append(k[0])
self.Isi_Combo_Negara()
217
#Boa:Frame:Frame1
conn=MySQLdb.connect(host="localhost",user="root",p
asswd="",db="akses_database")
cur = conn.cursor()
def create(parent):
return Frame1(parent)
[wxID_FRAME1, wxID_FRAME1CMB_BENUA,
wxID_FRAME1CMB_NEGARA, wxID_FRAME1PANEL1,
wxID_FRAME1STATICTEXT1,
wxID_FRAME1STATICTEXT2,
class Frame1(wx.Frame):
218
style=wx.DEFAULT_FRAME_STYLE, title='Pilihan
Benua dan Negara')
self.SetClientSize(wx.Size(313, 162))
self.panel1 = wx.Panel(id=wxID_FRAME1PANEL1,
name='panel1', parent=self,
style=wx.TAB_TRAVERSAL)
self.panel1.SetBackgroundColour(wx.Colour(192,
192, 192))
self.staticText1 =
wx.StaticText(id=wxID_FRAME1STATICTEXT1,
label='Benua', name='staticText1',
parent=self.panel1,
self.cmb_benua = wx.ComboBox(choices=[],
id=wxID_FRAME1CMB_BENUA,
name='cmb_benua', parent=self.panel1,
pos=wx.Point(136, 24),
self.cmb_benua.SetLabel('')
219
self.cmb_benua.Bind(wx.EVT_COMBOBOX,
self.OnCmb_benuaCombobox,
id=wxID_FRAME1CMB_BENUA)
self.staticText2 =
wx.StaticText(id=wxID_FRAME1STATICTEXT2,
label='Negara', name='staticText2',
parent=self.panel1,
self.cmb_negara = wx.ComboBox(choices=[],
id=wxID_FRAME1CMB_NEGARA,
name='cmb_negara', parent=self.panel1,
pos=wx.Point(136, 80),
self.cmb_negara.SetLabel('')
self._init_ctrls(parent)
self.Isi_Combo_Benua()
self.cmb_benua.Clear
220
benua_negara "
cur.execute(sql)
hasil= cur.fetchall()
if cur.rowcount > 0 :
for k in hasil:
self.cmb_benua.Append(k[0])
def Isi_Combo_Negara(self) :
self.cmb_negara.Clear()
benua = self.cmb_benua.GetStringSelection()
benua_negara where \
cur.execute(sql)
hasil= cur.fetchall()
if cur.rowcount > 0 :
for k in hasil:
self.cmb_negara.Append(k[0])
self.Isi_Combo_Negara()
221
10.4 Pencarian LIKE (Pencarian Judul Buku yang
mengandung kata tertentu)
222
Gambar 10.6 Menampilkan Data Buku yang Judulnya
Mengandung Kata ‘PYHTON’
wx.TextCtrl txtcari_judul
wx.Button tmb_Cari
wx.ListCtrl lc
kd_buku Varchar 5
223
judul Varchar 40
penulis Varchar 25
penerbit Varchar 25
self.lc.DeleteAllItems()
cur.execute(sql)
hasil= cur.fetchall()
k =self.lc.GetItemCount()
for i in hasil :
self.lc.InsertStringItem(k,"%s"%i[0])
self.lc.SetStringItem(k,1,"%s"%i[1])
self.lc.SetStringItem(k,2,"%s"%i[2])
self.lc.SetStringItem(k,3,"%s"%i[3])
k=k+1
self.Isi_List()
224
#Boa:Frame:Frame1
conn=MySQLdb.connect(host="localhost",user="root",p
asswd="",db="akses_database")
cur = conn.cursor()
def create(parent):
return Frame1(parent)
[wxID_FRAME1, wxID_FRAME1LC,
wxID_FRAME1PANEL1, wxID_FRAME1STATICTEXT1,
wxID_FRAME1TMB_CARI,
wxID_FRAME1TXTCARI_JUDUL,
class Frame1(wx.Frame):
parent.InsertColumn(col=0,
format=wx.LIST_FORMAT_LEFT,
225
heading='Kode Buku', width=85)
parent.InsertColumn(col=1,
format=wx.LIST_FORMAT_LEFT, heading='Judul',
width=232)
parent.InsertColumn(col=2,
format=wx.LIST_FORMAT_LEFT,
heading='Penulis', width=114)
parent.InsertColumn(col=3,
format=wx.LIST_FORMAT_LEFT,
heading='Penerbit', width=101)
style=wx.DEFAULT_FRAME_STYLE,
self.SetClientSize(wx.Size(595, 329))
self.panel1 = wx.Panel(id=wxID_FRAME1PANEL1,
name='panel1', parent=self,
226
style=wx.TAB_TRAVERSAL)
self.staticText1 =
wx.StaticText(id=wxID_FRAME1STATICTEXT1,
self.txtcari_judul =
wx.TextCtrl(id=wxID_FRAME1TXTCARI_JUDUL,
name='txtcari_judul', parent=self.panel1,
pos=wx.Point(118, 19),
self.tmb_Cari =
wx.Button(id=wxID_FRAME1TMB_CARI, label='Cari',
name='tmb_Cari', parent=self.panel1,
pos=wx.Point(448, 16),
self.tmb_Cari.Bind(wx.EVT_BUTTON,
self.OnTmb_CariButton,
id=wxID_FRAME1TMB_CARI)
227
self.lc = wx.ListCtrl(id=wxID_FRAME1LC, name='lc',
parent=self.panel1,
self._init_coll_lc_Columns(self.lc)
self._init_ctrls(parent)
self.lc.DeleteAllItems()
LIKE '%%%s%%'"%(self.txtcari_judul.GetValue())
cur.execute(sql)
hasil= cur.fetchall()
k =self.lc.GetItemCount()
for i in hasil :
self.lc.InsertStringItem(k,"%s"%i[0])
self.lc.SetStringItem(k,1,"%s"%i[1])
self.lc.SetStringItem(k,2,"%s"%i[2])
self.lc.SetStringItem(k,3,"%s"%i[3])
k=k+1
228
def OnTmb_CariButton(self, event):
self.Isi_List()
229
Gambar 10.8 Aplikasi Operasi Data Tanggal
wx.TextCtrl txt_nama
wx.TextCtrl tgl_daftar
wx.DatePickerCtrl tgl_lahir
wx.Button tmb_simpan
wx.Button tmb_bersih
wx.Button tmb_hapus
230
Nama Field Tipe Lebar
Nama VarChar 25
tgl_lahir Date
tgl_daftar Date
import datetime
skrg = datetime.date.today()
# Ambil Hari
day = skrg.day
# Ambil Bulan
month = skrg.month
# Ambil Tahun
year = skrg.year
231
Sekumpulan baris ini diletakkan di bagian atas
sebelum masuk ke dalam method-method
(def….). Tujuannya agar kode-kode tersebut
bersifat global, dikenal di semua method.
self._init_ctrls(parent)
month_lahir = selected.Month + 1
day_lahir = selected.Day
year_lahir = selected.Year
232
2. Mempersiapkan variabel bertipe Date bernama
tgl_lahir1 sebagai bahan baku untuk
menyimpan ke database
tgl_lahir1 = \
datetime.date(year_lahir,month_lahir,day_lahir)
(„%s‟) “%(tgl_lahir1)
day = python_birthdate.day
233
month = python_birthdate.month
year = python_birthdate.year
#Boa:Frame:Frame1
import datetime
conn=MySQLdb.connect(host="localhost",\
user="root",passwd="",db="akses_database")
cur = conn.cursor()
234
# Ambil Tanggal Hari ini
skrg = datetime.date.today()
# Ambil Hari
day = skrg.day
# Ambil Bulan
month = skrg.month
# Ambil Tahun
year = skrg.year
def create(parent):
return Frame1(parent)
[wxID_FRAME1, wxID_FRAME1PANEL1,
wxID_FRAME1STATICTEXT1,
wxID_FRAME1STATICTEXT2,
wxID_FRAME1STATICTEXT3,
wxID_FRAME1TGL_DAFTAR,
wxID_FRAME1TGL_LAHIR, wxID_FRAME1TMB_BERSIH,
wxID_FRAME1TMB_HAPUS,
wxID_FRAME1TMB_SIMPAN, wxID_FRAME1TXT_NAMA,
235
class Frame1(wx.Frame):
style=wx.DEFAULT_FRAME_STYLE,
title='Operasi Data Tanggal')
self.SetClientSize(wx.Size(384, 210))
self.panel1 = wx.Panel(id=wxID_FRAME1PANEL1,
name='panel1', parent=self,
style=wx.TAB_TRAVERSAL)
self.staticText1 =
wx.StaticText(id=wxID_FRAME1STATICTEXT1,
label='Nama', name='staticText1',
parent=self.panel1,
self.txt_nama =
wx.TextCtrl(id=wxID_FRAME1TXT_NAMA,
name='txt_nama',
236
parent=self.panel1, pos=wx.Point(144, 24),
size=wx.Size(100, 21),
style=wx.TE_PROCESS_ENTER, value='')
self.txt_nama.Bind(wx.EVT_TEXT_ENTER,
self.OnTxt_namaTextEnter,
id=wxID_FRAME1TXT_NAMA)
self.staticText2 =
wx.StaticText(id=wxID_FRAME1STATICTEXT2,
self.tgl_lahir =
wx.DatePickerCtrl(id=wxID_FRAME1TGL_LAHIR,
name='tgl_lahir', parent=self.panel1,
pos=wx.Point(144, 56),
size=wx.Size(96, 21),
style=wx.DP_SHOWCENTURY)
self.tgl_lahir.SetLabel('')
self.tgl_lahir.SetValue(wx.DateTimeFromDMY(24, 2,
2012, 0, 0, 0))
self.tgl_lahir.SetHelpText('')
237
self.tmb_simpan =
wx.Button(id=wxID_FRAME1TMB_SIMPAN,
label='Simpan',
name='tmb_simpan', parent=self.panel1,
pos=wx.Point(40, 152),
self.tmb_simpan.Bind(wx.EVT_BUTTON,
self.OnTmb_simpanButton,
id=wxID_FRAME1TMB_SIMPAN)
self.tmb_bersih =
wx.Button(id=wxID_FRAME1TMB_BERSIH, label='Bersih',
name='tmb_bersih', parent=self.panel1,
pos=wx.Point(152, 152),
self.tmb_bersih.Bind(wx.EVT_BUTTON,
self.OnTmb_bersihButton,
id=wxID_FRAME1TMB_BERSIH)
self.tmb_hapus =
wx.Button(id=wxID_FRAME1TMB_HAPUS, label='Hapus',
name='tmb_hapus', parent=self.panel1,
pos=wx.Point(272, 152),
self.tmb_hapus.Bind(wx.EVT_BUTTON,
self.OnTmb_hapusButton,
238
id=wxID_FRAME1TMB_HAPUS)
self.staticText3 =
wx.StaticText(id=wxID_FRAME1STATICTEXT3,
self.tgl_daftar =
wx.TextCtrl(id=wxID_FRAME1TGL_DAFTAR,
name='tgl_daftar', parent=self.panel1,
pos=wx.Point(144, 96),
self._init_ctrls(parent)
self.tgl_daftar.SetValue("%02d/%02d/%4d"%(day,
month, year))
def Bersih(self) :
self.txt_nama.SetValue("")
239
self.tgl_lahir.SetValue("%02d/%02d/%4d" % (day,
month, year))
= '%s'" %(self.txt_nama.GetValue())
cur.execute(sql)
hasil= cur.fetchone()
selected = self.tgl_lahir.GetValue()
month_lahir = selected.Month + 1
day_lahir = selected.Day
year_lahir = selected.Year
tgl_lahir1 =
datetime.date(year_lahir,month_lahir,day_lahir)
tgl_daftar1 = datetime.date(year,month,day)
if cur.rowcount > 0 :
(tgl_lahir1,\
240
tgl_daftar1,self.txt_nama.GetValue())
else :
values
('%s','%s','%s')"%(self.txt_nama.GetValue(),\
tgl_lahir1,tgl_daftar1)
cur.execute(sql)
self.Bersih()
self.Bersih()
if self.txt_nama.GetValue()=="" :
self.pesan = wx.MessageDialog\
self.pesan.ShowModal()
event.Skip()
= '%s'" % (self.txt_nama.GetValue())
241
cur.execute(sql)
hasil= cur.fetchone()
if cur.rowcount>0 :
tanya = wx.MessageDialog(self,\
+" "+self.txt_nama.GetValue()\
,style = wx.YES_NO)
if tanya.ShowModal()==wx.ID_YES:
= '%s'" % (self.txt_nama.GetValue())
cur.execute(sql)
else :
self.pesan = wx.MessageDialog(self,\
di database","Konfirmasi",wx.OK)
self.pesan.ShowModal()
242
= '%s'" %(self.txt_nama.GetValue())
cur.execute(sql)
hasil= cur.fetchone()
if cur.rowcount > 0 :
python_birthdate = hasil[1]
day = python_birthdate.day
month = python_birthdate.month
year = python_birthdate.year
displayed_birthday =
wx.DateTimeFromDMY(day,month-1,year)
self.tgl_lahir.SetValue(displayed_birthday)
tgl_daftar1 = hasil[2]
day1 = tgl_daftar1.day
month1 = tgl_daftar1.month
year1 = tgl_daftar1.year
displayed_birthday1 =
wx.DateTimeFromDMY(day1,month1-1,year1)
self.tgl_daftar.SetValue(displayed_birthday1)
else :
self.pesan = wx.MessageDialog(self,\
self.pesan.ShowModal()
243
10.6 Pengolahan Data Gambar (Image)
244
4. Menampilkan gambar dari database ke Frame
txt_kd_buku
txt_judul
wx.TextCtrl
txt_penulis
txt_penerbit
txt_path
wx.StaticBitmap gambar
tmb_Simpan
tmb_Bersih
wx.Button
tmb_Hapus
tmb_Browse
kd_buku VarChar 3
245
judul VarChar 25
penulis VarChar 25
penerbit VarChar 25
gambar VarChar 60
wx.StaticBitmap
2. Setting wx.Image
246
img = wx.Image(filepath, wx.BITMAP_TYPE_ANY)
wildcard=wildcard,
style=wx.OPEN)
247
Gambar 10.11 File Dialog setelah tombol Browse
ditekan
self.txt_path.SetValue(dialog.GetPath())
filepath = filepath.replace("\\",'\\\\')
248
C:\\Gambar\\noimage.jpg
self.gambar.SetBitmap(wx.BitmapFromImage(img))
(„%s‟)”%(gambar1)
249
filepath = hasil[4]
#Boa:Frame:Frame1
cur = conn.cursor()
def create(parent):
return Frame1(parent)
250
[wxID_FRAME1, wxID_FRAME1GAMBAR,
wxID_FRAME1PANEL1, wxID_FRAME1STATICTEXT1,
wxID_FRAME1STATICTEXT2,
wxID_FRAME1STATICTEXT3,
wxID_FRAME1STATICTEXT4,
wxID_FRAME1STATICTEXT5,
wxID_FRAME1TMB_BERSIH,
wxID_FRAME1TMB_BROWSE,
wxID_FRAME1TMB_HAPUS,
wxID_FRAME1TMB_SIMPAN, wxID_FRAME1TXT_JUDUL,
wxID_FRAME1TXT_KD_BUKU, wxID_FRAME1TXT_PATH,
wxID_FRAME1TXT_PENERBIT,
wxID_FRAME1TXT_PENULIS,
class Frame1(wx.Frame):
style=wx.DEFAULT_FRAME_STYLE,
title='Penggunaan Gambar')
self.SetClientSize(wx.Size(457, 270))
251
self.panel1 = wx.Panel(id=wxID_FRAME1PANEL1,
name='panel1', parent=self,
style=wx.TAB_TRAVERSAL)
self.staticText1 =
wx.StaticText(id=wxID_FRAME1STATICTEXT1,
self.txt_kd_buku =
wx.TextCtrl(id=wxID_FRAME1TXT_KD_BUKU,
name='txt_kd_buku', parent=self.panel1,
pos=wx.Point(112, 32),
size=wx.Size(100, 21),
style=wx.TE_PROCESS_ENTER, value='')
self.txt_kd_buku.Bind(wx.EVT_TEXT_ENTER,
self.OnTxt_kd_bukuTextEnter,
id=wxID_FRAME1TXT_KD_BUKU)
self.staticText2 =
wx.StaticText(id=wxID_FRAME1STATICTEXT2,
252
label='Judul', name='staticText2',
parent=self.panel1,
self.txt_judul =
wx.TextCtrl(id=wxID_FRAME1TXT_JUDUL,
name='txt_judul',
style=0, value='')
self.staticText3 =
wx.StaticText(id=wxID_FRAME1STATICTEXT3,
label='Penulis', name='staticText3',
parent=self.panel1,
self.txt_penulis =
wx.TextCtrl(id=wxID_FRAME1TXT_PENULIS,
name='txt_penulis', parent=self.panel1,
pos=wx.Point(112, 136),
253
self.staticText4 =
wx.StaticText(id=wxID_FRAME1STATICTEXT4,
label='Penerbit', name='staticText4',
parent=self.panel1,
self.txt_penerbit =
wx.TextCtrl(id=wxID_FRAME1TXT_PENERBIT,
name='txt_penerbit', parent=self.panel1,
pos=wx.Point(116, 184),
self.gambar =
wx.StaticBitmap(bitmap=wx.NullBitmap,
id=wxID_FRAME1GAMBAR, name='gambar',
parent=self.panel1,
self.tmb_Simpan =
wx.Button(id=wxID_FRAME1TMB_SIMPAN,
label='Simpan',
name='tmb_Simpan', parent=self.panel1,
pos=wx.Point(24, 232),
254
self.tmb_Simpan.Bind(wx.EVT_BUTTON,
self.OnTmb_SimpanButton,
id=wxID_FRAME1TMB_SIMPAN)
self.tmb_Bersih =
wx.Button(id=wxID_FRAME1TMB_BERSIH, label='Bersih',
name='tmb_Bersih', parent=self.panel1,
pos=wx.Point(152, 232),
self.tmb_Bersih.Bind(wx.EVT_BUTTON,
self.OnTmb_BersihButton,
id=wxID_FRAME1TMB_BERSIH)
self.tmb_Hapus =
wx.Button(id=wxID_FRAME1TMB_HAPUS, label='Hapus',
name='tmb_Hapus', parent=self.panel1,
pos=wx.Point(288, 232),
self.tmb_Hapus.Bind(wx.EVT_BUTTON,
self.OnTmb_HapusButton,
id=wxID_FRAME1TMB_HAPUS)
self.tmb_Browse =
wx.Button(id=wxID_FRAME1TMB_BROWSE,
label='Browse',
255
name='tmb_Browse', parent=self.panel1,
pos=wx.Point(320, 160),
self.tmb_Browse.Bind(wx.EVT_BUTTON,
self.OnTmb_BrowseButton,
id=wxID_FRAME1TMB_BROWSE)
self.txt_path =
wx.TextCtrl(id=wxID_FRAME1TXT_PATH, name='txt_path',
style=0, value='')
self.staticText5 =
wx.StaticText(id=wxID_FRAME1STATICTEXT5,
label='(Enter)', name='staticText5',
parent=self.panel1,
self.staticText5.SetForegroundColour(wx.Colour(255,
0, 0))
self.staticText5.SetFont(wx.Font(8, wx.SWISS,
wx.NORMAL, wx.BOLD, False,
'Tahoma'))
256
def __init__(self, parent):
self._init_ctrls(parent)
filepath = 'C:\\Gambar\\noimage.jpg'
self.gambar.SetBitmap\
(wx.BitmapFromImage(img))
def Isi_Object(self) :
%(self.txt_kd_buku.GetValue())
cur.execute(sql)
if cur.rowcount > 0 :
hasil = cur.fetchone()
self.txt_judul.SetValue(hasil[1])
self.txt_penulis.SetValue(hasil[2])
self.txt_penerbit.SetValue(hasil[3])
filepath = hasil[4]
filepath = filepath.replace("\\",'\\\\')
self.txt_path.SetValue(filepath)
img = wx.Image\
257
(filepath, wx.BITMAP_TYPE_ANY)
self.gambar.SetBitmap(wx.BitmapFromImage(img))
def Awal(self) :
self.txt_kd_buku.SetValue("")
self.txt_judul.SetValue("")
self.txt_penulis.SetValue("")
self.txt_penerbit.SetValue("")
self.txt_path.SetValue("")
self.txt_kd_buku.SetFocus()
filepath = 'C:\\Gambar\\noimage.jpg'
self.gambar.SetBitmap\
(wx.BitmapFromImage(img))
self.Isi_Object()
258
sql = "select * from buku_gambar where
kd_buku='%s' "%\
(self.txt_kd_buku.GetValue())
cur.execute(sql)
judul1 = self.txt_judul.GetValue()
penulis1 = self.txt_penulis.GetValue()
penerbit1= self.txt_penerbit.GetValue()
kd_buku1 =self.txt_kd_buku.GetValue()
gambar1= self.txt_path.GetValue()
if cur.rowcount > 0 :
kd_buku ='%s'
"%(judul1,penulis1,penerbit1,gambar1,kd_buku1)
else :
(kd_buku1,judul1,penulis1,penerbit1,gambar1)
259
cur.execute(sql)
conn.commit()
self.Awal()
self.Awal()
if self.txt_kd_buku.GetValue()=="" :
self.pesan = wx.MessageDialog\
self.pesan.ShowModal()
event.Skip()
= '%s'" % (self.txt_kd_buku.GetValue())
cur.execute(sql)
hasil= cur.fetchone()
if cur.rowcount>0 :
tanya = wx.MessageDialog(self,\
260
+" "+self.txt_kd_buku.GetValue()+" "+\
"Judul "+self.txt_judul.GetValue()\
,style = wx.YES_NO)
if tanya.ShowModal()==wx.ID_YES:
= '%s'" % (self.txt_kd_buku.GetValue())
cur.execute(sql)
else :
self.pesan = wx.MessageDialog(self,\
di database","Konfirmasi",wx.OK)
self.pesan.ShowModal()
self.Awal()
wildcard=wildcard,
style=wx.OPEN)
if dialog.ShowModal() == wx.ID_OK:
261
self.txt_path.SetValue(dialog.GetPath())
dialog.Destroy()
filepath = self.txt_path.GetValue()
filepath = filepath.replace("\\",'\\\\')
self.txt_path.SetValue(filepath)
self.gambar.SetBitmap\
(wx.BitmapFromImage(img))
262
Gambar 10.12 Aplikasi Data Mahasiswa dengan IPK
Jenis Name
Komponen
txt_nim
wx.TextCtrl txt_nama
txt_ipk
263
tmb_Simpan
wx.Button tmb_Bersih
tmb_Hapus
nim VarChar 3
nama VarChar 25
ipk Float 2
264
MENYIMPAN DATA FLOAT DARI
FRAME(TEXTCTRL) KE DATABASE (TABEL)
#Boa:Frame:Frame1
conn=MySQLdb.connect(host="localhost",\
user="root",passwd="",db="akses_database")
cur = conn.cursor()
265
def create(parent):
return Frame1(parent)
[wxID_FRAME1, wxID_FRAME1PANEL1,
wxID_FRAME1STATICTEXT1,
wxID_FRAME1STATICTEXT2,
wxID_FRAME1STATICTEXT3,
wxID_FRAME1TMB_BERSIH,
wxID_FRAME1TMB_HAPUS,
wxID_FRAME1TMB_SIMPAN, wxID_FRAME1TXT_IPK,
wxID_FRAME1TXT_NAMA, wxID_FRAME1TXT_NIM,
class Frame1(wx.Frame):
style=wx.DEFAULT_FRAME_STYLE,
title='Operasi Numerik Desimal')
self.SetClientSize(wx.Size(384, 233))
266
self.panel1 = wx.Panel(id=wxID_FRAME1PANEL1,
name='panel1', parent=self,
style=wx.TAB_TRAVERSAL)
self.staticText1 =
wx.StaticText(id=wxID_FRAME1STATICTEXT1,
label='NIM',
name='staticText1', parent=self.panel1,
pos=wx.Point(32, 32),
self.txt_nim =
wx.TextCtrl(id=wxID_FRAME1TXT_NIM, name='txt_nim',
style=wx.TE_PROCESS_ENTER, value='')
self.txt_nim.Bind(wx.EVT_TEXT_ENTER,
self.OnTxt_nimTextEnter,
id=wxID_FRAME1TXT_NIM)
self.staticText2 =
wx.StaticText(id=wxID_FRAME1STATICTEXT2,
label='Nama', name='staticText2',
parent=self.panel1,
267
pos=wx.Point(32, 88), size=wx.Size(28, 13),
style=0)
self.txt_nama =
wx.TextCtrl(id=wxID_FRAME1TXT_NAMA,
name='txt_nama',
style=0, value='')
self.staticText3 =
wx.StaticText(id=wxID_FRAME1STATICTEXT3, label='IPK',
name='staticText3', parent=self.panel1,
pos=wx.Point(32, 144),
self.txt_ipk = wx.TextCtrl(id=wxID_FRAME1TXT_IPK,
name='txt_ipk',
style=0, value='')
self.tmb_Simpan =
wx.Button(id=wxID_FRAME1TMB_SIMPAN,
label='Simpan',
268
name='tmb_Simpan', parent=self.panel1,
pos=wx.Point(32, 192),
self.tmb_Simpan.Bind(wx.EVT_BUTTON,
self.OnTmb_SimpanButton,
id=wxID_FRAME1TMB_SIMPAN)
self.tmb_Bersih =
wx.Button(id=wxID_FRAME1TMB_BERSIH, label='Bersih',
name='tmb_Bersih', parent=self.panel1,
pos=wx.Point(136, 192),
self.tmb_Bersih.Bind(wx.EVT_BUTTON,
self.OnTmb_BersihButton,
id=wxID_FRAME1TMB_BERSIH)
self.tmb_Hapus =
wx.Button(id=wxID_FRAME1TMB_HAPUS, label='Hapus',
name='tmb_Hapus', parent=self.panel1,
pos=wx.Point(240, 192),
self.tmb_Hapus.Bind(wx.EVT_BUTTON,
self.OnTmb_HapusButton,
id=wxID_FRAME1TMB_HAPUS)
269
def __init__(self, parent):
self._init_ctrls(parent)
self.txt_nim.SetValue("")
self.txt_nama.SetValue("")
self.txt_ipk.SetValue("")
self.txt_nim.SetFocus()
= '%s'" %(self.txt_nim.GetValue())
cur.execute(sql)
hasil= cur.fetchone()
ipk1 = float(self.txt_ipk.GetValue())
if cur.rowcount > 0 :
(self.txt_nama.GetValue(),\
ipk1,self.txt_nim.GetValue())
else :
270
sql ="insert into ipk (nim,nama,ipk) \
values
('%s','%s','%s')"%(self.txt_nim.GetValue(),\
self.txt_nama.GetValue(),ipk1)
cur.execute(sql)
self.Bersih()
self.Bersih()
if self.txt_nim.GetValue()=="" :
self.pesan = wx.MessageDialog\
self.pesan.ShowModal()
event.Skip()
= '%s'" % (self.txt_nim.GetValue())
cur.execute(sql)
hasil= cur.fetchone()
if cur.rowcount>0 :
271
tanya = wx.MessageDialog(self,\
"Nama "+self.txt_nama.GetValue()\
,style = wx.YES_NO)
if tanya.ShowModal()==wx.ID_YES:
= '%s'" % (self.txt_nim.GetValue())
cur.execute(sql)
else :
self.pesan = wx.MessageDialog(self,\
di database","Konfirmasi",wx.OK)
self.pesan.ShowModal()
= '%s'" %(self.txt_nim.GetValue())
cur.execute(sql)
hasil= cur.fetchone()
272
if cur.rowcount > 0 :
self.txt_nama.SetValue(hasil[1])
self.txt_ipk.SetValue(str(hasil[2]))
else :
self.pesan = wx.MessageDialog(self,\
self.pesan.ShowModal()
273
Gambar 10.13 Aplikasi Master Gabungan Input Data
Buku
274
Gambar 10.14 wx.EVT_LIST_ITEM_SELECTED pada
wx.ListCtrl
275
5. Memanggil method untuk mengisi komponen
dengan data dari database untuk kode buku
yang sesuai dengan yang tercantum di
txt_kdbuku.
self.Isi_Object()
txt_kdbuku
txt_judul
txt_stock
276
rTidak Buku boleh
dipinjam (Ya)
atau Tidak.
wx.ListCtrl lc Menampilkan
Data buku yang
dalam 3 kolom
(Kode Buku,
Judul, Stock)
kd_buku VarChar 15
judul Varchar 25
kategori VarChar 15
dipinjam Tinyint 1
tgl_mas Date
uk
277
stock Int 11
tinggi Float 2
#Boa:Frame:Frame1
import datetime
conn= MySQLdb.connect(host="localhost",
user="root", passwd="",db="perpus")
cur = conn.cursor()
def create(parent):
return Frame1(parent)
278
[wxID_FRAME1, wxID_FRAME1CMBKATEGORI,
wxID_FRAME1GAMBAR, wxID_FRAME1LC,
wxID_FRAME1PANEL1, wxID_FRAME1RTIDAK,
wxID_FRAME1RYA, wxID_FRAME1STATICTEXT1,
wxID_FRAME1STATICTEXT2,
wxID_FRAME1STATICTEXT3,
wxID_FRAME1STATICTEXT4,
wxID_FRAME1STATICTEXT5,
wxID_FRAME1STATICTEXT6,
wxID_FRAME1STATICTEXT7,
wxID_FRAME1STATICTEXT8,
wxID_FRAME1STATICTEXT9,
wxID_FRAME1TGL_MASUK,
wxID_FRAME1TMBBERSIH,
wxID_FRAME1TMBBROWSE, wxID_FRAME1TMBHAPUS,
wxID_FRAME1TMBSIMPAN, wxID_FRAME1TXT_JUDUL,
wxID_FRAME1TXT_KDBUKU,
wxID_FRAME1TXT_PATH, wxID_FRAME1TXT_STOCK,
wxID_FRAME1TXT_TINGGI,
class Frame1(wx.Frame):
parent.InsertColumn(col=0,
format=wx.LIST_FORMAT_LEFT,
279
heading='Kode Buku', width=90)
parent.InsertColumn(col=1,
format=wx.LIST_FORMAT_LEFT, heading='Judul',
width=165)
parent.InsertColumn(col=2,
format=wx.LIST_FORMAT_LEFT, heading='Stock',
width=-1)
style=wx.DEFAULT_FRAME_STYLE, title='Data
Buku')
self.SetClientSize(wx.Size(462, 520))
self.panel1 = wx.Panel(id=wxID_FRAME1PANEL1,
name='panel1', parent=self,
style=wx.TAB_TRAVERSAL)
280
self.staticText1 =
wx.StaticText(id=wxID_FRAME1STATICTEXT1,
self.txt_kdbuku =
wx.TextCtrl(id=wxID_FRAME1TXT_KDBUKU,
name='txt_kdbuku', parent=self.panel1,
pos=wx.Point(104, 10),
size=wx.Size(100, 21),
style=wx.TE_PROCESS_ENTER, value='')
self.txt_kdbuku.Bind(wx.EVT_TEXT_ENTER,
self.OnTxt_kdbukuTextEnter,
id=wxID_FRAME1TXT_KDBUKU)
self.staticText2 =
wx.StaticText(id=wxID_FRAME1STATICTEXT2,
label='Judul', name='staticText2',
parent=self.panel1,
self.txt_judul =
wx.TextCtrl(id=wxID_FRAME1TXT_JUDUL,
name='txt_judul',
281
parent=self.panel1, pos=wx.Point(104, 41),
size=wx.Size(168, 21),
style=0, value='')
self.staticText3 =
wx.StaticText(id=wxID_FRAME1STATICTEXT3,
label='Kategori', name='staticText3',
parent=self.panel1,
self.cmbkategori = wx.ComboBox(choices=[],
id=wxID_FRAME1CMBKATEGORI,
name='cmbkategori', parent=self.panel1,
pos=wx.Point(103, 97),
self.cmbkategori.SetLabel('')
self.staticText4 =
wx.StaticText(id=wxID_FRAME1STATICTEXT4,
label='Dipinjam', name='staticText4',
parent=self.panel1,
282
self.rYa = wx.RadioButton(id=wxID_FRAME1RYA,
label='Ya', name='rYa',
style=0)
self.rYa.SetValue(False)
self.rTidak =
wx.RadioButton(id=wxID_FRAME1RTIDAK, label='Tidak',
name='rTidak', parent=self.panel1,
pos=wx.Point(232, 145),
self.rTidak.SetValue(False)
self.staticText5 =
wx.StaticText(id=wxID_FRAME1STATICTEXT5,
label='staticText5', name='staticText5',
parent=self.panel1,
self.staticText6 =
wx.StaticText(id=wxID_FRAME1STATICTEXT6,
283
pos=wx.Point(16, 193), size=wx.Size(71, 13),
style=0)
self.tgl_masuk =
wx.DatePickerCtrl(id=wxID_FRAME1TGL_MASUK,
name='tgl_masuk', parent=self.panel1,
pos=wx.Point(104, 193),
size=wx.Size(90, 21),
style=wx.DP_SHOWCENTURY)
self.tgl_masuk.SetValue(wx.DateTimeFromDMY(17,
1, 2011, 0, 0, 0))
self.tgl_masuk.SetLabel('17/2/2011')
self.staticText7 =
wx.StaticText(id=wxID_FRAME1STATICTEXT7,
label='Stock', name='staticText7',
parent=self.panel1,
self.txt_stock =
wx.TextCtrl(id=wxID_FRAME1TXT_STOCK,
name='txt_stock',
style=0, value='')
284
self.tmbSimpan =
wx.Button(id=wxID_FRAME1TMBSIMPAN,
label='Simpan',
name='tmbSimpan', parent=self.panel1,
pos=wx.Point(16, 320),
self.tmbSimpan.Bind(wx.EVT_BUTTON,
self.OnTmbSimpanButton,
id=wxID_FRAME1TMBSIMPAN)
self.tmbHapus =
wx.Button(id=wxID_FRAME1TMBHAPUS, label='Hapus',
name='tmbHapus', parent=self.panel1,
pos=wx.Point(112, 320),
self.tmbHapus.Bind(wx.EVT_BUTTON,
self.OnTmbHapusButton,
id=wxID_FRAME1TMBHAPUS)
self.tmbBersih =
wx.Button(id=wxID_FRAME1TMBBERSIH, label='Bersih',
name='tmbBersih', parent=self.panel1,
pos=wx.Point(200, 320),
285
self.tmbBersih.Bind(wx.EVT_BUTTON,
self.OnTmbBersihButton,
id=wxID_FRAME1TMBBERSIH)
style=wx.LC_REPORT)
self._init_coll_lc_Columns(self.lc)
self.lc.Bind(wx.EVT_LIST_ITEM_SELECTED,
self.OnLcListItemSelected,
id=wxID_FRAME1LC)
self.gambar =
wx.StaticBitmap(bitmap=wx.NullBitmap,
id=wxID_FRAME1GAMBAR, name='gambar',
parent=self.panel1,
self.tmbBrowse =
wx.Button(id=wxID_FRAME1TMBBROWSE,
label='Browse',
name='tmbBrowse', parent=self.panel1,
pos=wx.Point(344, 192),
286
size=wx.Size(75, 23), style=0)
self.tmbBrowse.Bind(wx.EVT_BUTTON,
self.OnTmbBrowseButton,
id=wxID_FRAME1TMBBROWSE)
self.txt_path =
wx.TextCtrl(id=wxID_FRAME1TXT_PATH,
name='txt_path',
style=0, value='')
self.staticText8 =
wx.StaticText(id=wxID_FRAME1STATICTEXT8,
label='Tinggi', name='staticText8',
parent=self.panel1,
self.txt_tinggi =
wx.TextCtrl(id=wxID_FRAME1TXT_TINGGI,
name='txt_tinggi', parent=self.panel1,
pos=wx.Point(104, 280),
287
self.staticText9 =
wx.StaticText(id=wxID_FRAME1STATICTEXT9,
label='(cm)', name='staticText9',
parent=self.panel1,
self.staticText9.SetForegroundColour(wx.Colour(255,
0, 0))
self._init_ctrls(parent)
skrg = datetime.date.today()
day = skrg.day
month = skrg.month
tahun = skrg.year
displayed = wx.DateTimeFromDMY(day,month-
1,tahun)
displayed.Format("%d/%m/%Y")
#myDate = wx.DateTimeFromDMY(int(day),
int(month)-1 , int(year1))
self.tgl_masuk.SetValue(displayed)
self.cmbkategori.Append("Buku")
self.cmbkategori.Append("Majalah")
288
#self.imageCtrl.SetBitmap(wx.BitmapFromImage(img))
filepath = 'C:\\Gambar\\noimage.jpg'
self.gambar.SetBitmap(wx.BitmapFromImage(img))
self.Isi_List()
def Isi_Object(self) :
cur.execute(sql)
if cur.rowcount > 0 :
hasil = cur.fetchone()
self.txt_judul.SetValue(hasil[1])
self.cmbkategori.SetStringSelection(hasil[2])
if hasil[3] == 0 :
self.rTidak.Value=True
else :
self.rYa.Value = True
tgl = hasil[4]
day = tgl.day
month = tgl.month
289
year = tgl.year
displayed =
wx.DateTimeFromDMY(day,month-1,year)
self.tgl_masuk.SetValue(displayed)
self.txt_stock.SetValue(str(hasil[5]))
self.txt_tinggi.SetValue(str(hasil[6]))
filepath = hasil[7]
filepath = filepath.replace("\\",'\\\\')
self.txt_path.SetValue(filepath)
img = wx.Image(filepath,
wx.BITMAP_TYPE_ANY)
self.gambar.SetBitmap(wx.BitmapFromImage(img))
self.Isi_Object()
cur.execute(sql)
judul1 = self.txt_judul.GetValue()
kategori1 =self.cmbkategori.GetStringSelection()
if self.rYa.Value == True :
290
dipinjam1 = 1
else :
dipinjam1 = 0
selected = self.tgl_masuk.GetValue()
month = selected.Month + 1
day = selected.Day
year = selected.Year
tgl_masuk1 = datetime.date(year,month,day)
stock1 = int(self.txt_stock.GetValue())
tinggi1 = float(self.txt_tinggi.GetValue())
kd_buku1 =self.txt_kdbuku.GetValue()
gambar1= self.txt_path.GetValue()
if cur.rowcount > 0 :
else :
291
"%(kd_buku1,judul1,kategori1,dipinjam1,tgl_masuk1,s
tock1,tinggi1,gambar1)
cur.execute(sql)
conn.commit()
self.Awal()
def Awal(self) :
self.Isi_List()
self.txt_kdbuku.SetValue("")
self.txt_judul.SetValue("")
self.cmbkategori.SetValue("")
self.rYa.Value=False
self.rTidak.Value=False
skrg = datetime.date.today()
day = skrg.day
month = skrg.month
tahun = skrg.year
displayed = wx.DateTimeFromDMY(day,month-
1,tahun)
displayed.Format("%d/%m/%Y")
self.tgl_masuk.SetValue(displayed)
self.txt_stock.SetValue("")
292
self.txt_tinggi.SetValue("")
self.txt_kdbuku.SetFocus()
filepath = 'C:\\Gambar\\noimage.jpg'
self.gambar.SetBitmap(wx.BitmapFromImage(img))
def Isi_List(self) :
self.lc.DeleteAllItems()
cur.execute(sql)
hasil = cur.fetchall()
jumbar = self.lc.GetItemCount()
for i in hasil :
self.lc.InsertStringItem(jumbar,i[0])
self.lc.SetStringItem(jumbar,1,i[1])
self.lc.SetStringItem(jumbar,2,str(i[5]))
jumbar = jumbar + 1
293
wildcard=wildcard,
style=wx.OPEN)
if dialog.ShowModal() == wx.ID_OK:
self.txt_path.SetValue(dialog.GetPath())
dialog.Destroy()
filepath = self.txt_path.GetValue()
filepath = filepath.replace("\\",'\\\\')
self.txt_path.SetValue(filepath)
self.gambar.SetBitmap(wx.BitmapFromImage(img))
a = event.m_itemIndex
b = self.lc.GetItem(a,0).GetText()
self.txt_kdbuku.SetValue(b)
self.Isi_Object()
294
self.Awal()
if self.txt_nim.GetValue()=="" :
self.pesan = wx.MessageDialog\
self.pesan.ShowModal()
event.Skip()
= '%s'" % (self.txt_nim.GetValue())
cur.execute(sql)
hasil= cur.fetchone()
if cur.rowcount>0 :
tanya = wx.MessageDialog(self,\
"Nama "+self.txt_nama.GetValue()\
,style = wx.YES_NO)
if tanya.ShowModal()==wx.ID_YES:
295
= '%s'" % (self.txt_nim.GetValue())
cur.execute(sql)
else :
self.pesan = wx.MessageDialog(self,\
di database","Konfirmasi",wx.OK)
self.pesan.ShowModal()
self.Awal()
296
BAB XI
DENGAN XLWT
- dan semisalnya…
297
11.2 PERINTAH DASAR YANG SERING
DIGUNAKAN DALAM XLWT
book.save(path1)
298
11.3 PERINTAH MENGHAPUS FILE LAMA DAN
MELUNCURKAN FILE BARU
1. Import modul os
import os
if os.path.exists(path1) :
os.remove(path1)
299
os.system("start excel.exe C:\\cetak.xls")
a. Pengaturan font
font0 = Font()
font0.name = 'Times New Roman'
font0.height=200
font0.bold = True
Font diatur dengan jenis „Times New Roman‟,
tinggi 200 dan disetting Bold (cetak tebal).
Tinggi 200 dalam setting normal adalah sama
dengan 10 (didapatkan dari 200/20). Angka 20
adalah konstanta. Misalnya, jika anda ingin
ukuran font adalah 20, maka setting height-nya
adalah 20x20 = 400.
b. Pendefinisian style dan pendaftaran setting
font pada Style
style0 = XFStyle()
style0.font = font0
c. Implementasi style pada cell tertentu
300
ws0.write(1, 1, 'Test', style0)
ws0 adalah nama Workbook, sedangkan
style0 adalah nama style yang telah
didefinisikan sebelumnya.
2. Mengatur Border (garis di sekitar cell)
Berikut ini adalah kode untuk membuat border di
sekitar cell
## setting border
borders = Borders()
borders.left = 1
borders.right = 1
borders.top = 1
borders.bottom = 1
# Definisikan Style
style0 = XFStyle()
# Mendaftarkan setting border pada style
style0.borders = borders
#Membuat workbook dan sheet telah dijelaskan di
#atas….
# Menuliskan ke dalam cell sesuai style
ws0.write(1, 1, 'Test', style0)
BkgPat = Pattern()
301
BkgPat.pattern = Pattern.SOLID_PATTERN
BkgPat.pattern_fore_colour = 22
# Mendefinisikan Style
style0 = XFStyle()
style0.pattern = BkgPat
# atas……….
# Menuliskan ke cell (1,1)
ws0.write(1, 1, 'Test', style0)
Ketentuan:
Contoh kode :
ws.insert_bitmap('python.bmp', 2, 2)
302
Contoh kode :
# Mengalikan nilai di A1 dengan B1
ws.write(0, 2, Formula("A1*B1"))
# Contoh formula IF
ws.write(12, 3, Formula('IF(A1>A2;10;0)'))
ws.write(6, 3, Formula("SUM($A$1:$C$5)"))
Kode contoh :
fmt =‟0.00‟
style = XFStyle()
style.num_format_str = fmt
Kode contoh :
from datetime import datetime
fmt =‟DD-MM-YYYY‟
style = XFStyle()
style.num_format_str = fmt
303
ws.write(i, 4, datetime.now(), style)
304
BAB XII
MADURA-INGGRIS
12.1 Pendahuluan
1. wx.App (AppKamus.py)
#!/usr/bin/env python
#Boa:App:BoaApp
import wx
305
import FrmMenu
class BoaApp(wx.App):
def OnInit(self):
self.main = FrmMenu.create(None)
self.main.Show()
self.SetTopWindow(self.main)
return True
def main():
application = BoaApp(0)
application.MainLoop()
if __name__ == '__main__':
main()
306
Nama Database : kamus
madura VarChar 40
inggris VarChar 40
#Boa:Frame:Frame1
307
import wx, FrmInput, FrmKamus
def create(parent):
return Frame1(parent)
class Frame1(wx.Frame):
style=wx.DEFAULT_FRAME_STYLE, title='Menu
Utama')
self.SetClientSize(wx.Size(1024, 712))
self._init_ctrls(parent)
menuBar = wx.MenuBar()
menuData =wx.Menu()
menuData.Append(1,"&Isi Data")
308
menuData.AppendSeparator()
menuData.Append(2,"&Keluar")
menuLihat = wx.Menu()
menuLihat.Append(3,"&Lihat Kamus")
menuBar.Append(menuData,"&Data")
menuBar.Append(menuLihat,"&Kamus")
self.SetMenuBar(menuBar)
def OnInput(self,event) :
self.main = FrmInput.create(None)
self.main.Show()
self.Destroy()
self.main = FrmKamus.create(None)
self.main.Show()
309
12.5 Frame Isi Data (FrmInput.py)
310
Gambar 12.3 Nama Tiap Komponen Frame Input Kata
#Boa:Frame:Frame1
# Buat koneksi
conn
=MySQLdb.connect(host="localhost",user="root",passwd=""
,db = "kamus")
# Buat kursor
kursor = conn.cursor()
311
def create(parent):
return Frame1(parent)
[wxID_FRAME1, wxID_FRAME1LC,
wxID_FRAME1PANEL1, wxID_FRAME1STATICTEXT1,
wxID_FRAME1STATICTEXT2,
wxID_FRAME1TMBBERSIH, wxID_FRAME1TMBHAPUS,
wxID_FRAME1TMBSIMPAN,
wxID_FRAME1TXT_INGGRIS,
wxID_FRAME1TXT_MADURA,
class Frame1(wx.Frame):
parent.InsertColumn(col=0,
format=wx.LIST_FORMAT_LEFT, heading='Madura',
width=150)
parent.InsertColumn(col=1,
format=wx.LIST_FORMAT_LEFT,
heading='Inggris', width=192)
312
def _init_ctrls(self, prnt):
style=wx.DEFAULT_FRAME_STYLE, title='Input
Kata ')
self.SetClientSize(wx.Size(392, 449))
'Tahoma'))
self.panel1 = wx.Panel(id=wxID_FRAME1PANEL1,
name='panel1', parent=self,
style=wx.TAB_TRAVERSAL)
self.staticText1 =
wx.StaticText(id=wxID_FRAME1STATICTEXT1,
label='Madura', name='staticText1',
parent=self.panel1,
313
pos=wx.Point(24, 40), size=wx.Size(52, 19),
style=0)
self.staticText1.SetFont(wx.Font(12, wx.SWISS,
wx.NORMAL, wx.NORMAL,
False, 'Tahoma'))
self.txt_madura =
wx.TextCtrl(id=wxID_FRAME1TXT_MADURA,
name='txt_madura', parent=self.panel1,
pos=wx.Point(112, 32),
size=wx.Size(176, 32),
style=wx.TE_PROCESS_ENTER, value='')
self.txt_madura.SetFont(wx.Font(12, wx.SWISS,
wx.NORMAL, wx.NORMAL,
False, 'Tahoma'))
self.txt_madura.Bind(wx.EVT_TEXT_ENTER,
self.OnTxt_maduraTextEnter,
id=wxID_FRAME1TXT_MADURA)
self.staticText2 =
wx.StaticText(id=wxID_FRAME1STATICTEXT2,
label='Inggris', name='staticText2',
parent=self.panel1,
314
self.staticText2.SetFont(wx.Font(12, wx.SWISS,
wx.NORMAL, wx.NORMAL,
False, 'Tahoma'))
self.txt_inggris =
wx.TextCtrl(id=wxID_FRAME1TXT_INGGRIS,
name='txt_inggris', parent=self.panel1,
pos=wx.Point(112, 112),
self.txt_inggris.SetFont(wx.Font(12, wx.SWISS,
wx.NORMAL, wx.NORMAL,
False, 'Tahoma'))
self.tmbSimpan =
wx.Button(id=wxID_FRAME1TMBSIMPAN,
label='&Simpan',
name='tmbSimpan', parent=self.panel1,
pos=wx.Point(24, 184),
self.tmbSimpan.Bind(wx.EVT_BUTTON,
self.OnTmbSimpanButton,
id=wxID_FRAME1TMBSIMPAN)
self.tmbBersih =
wx.Button(id=wxID_FRAME1TMBBERSIH, label='Bersih',
315
name='tmbBersih', parent=self.panel1,
pos=wx.Point(144, 184),
self.tmbBersih.Bind(wx.EVT_BUTTON,
self.OnTmbBersihButton,
id=wxID_FRAME1TMBBERSIH)
self.tmbHapus =
wx.Button(id=wxID_FRAME1TMBHAPUS, label='Hapus',
name='tmbHapus', parent=self.panel1,
pos=wx.Point(256, 184),
self.tmbHapus.Bind(wx.EVT_BUTTON,
self.OnTmbHapusButton,
id=wxID_FRAME1TMBHAPUS)
style=wx.LC_REPORT)
self._init_coll_lc_Columns(self.lc)
self.lc.Bind(wx.EVT_LIST_ITEM_SELECTED,
self.OnLcListItemSelected,
id=wxID_FRAME1LC)
316
def __init__(self, parent):
self._init_ctrls(parent)
self.Isi_List()
def Isi_List(self) :
self.lc.DeleteAllItems()
kursor.execute(sql)
hasil = kursor.fetchall()
baris = self.lc.GetItemCount()
for i in hasil :
self.lc.InsertStringItem(baris,"%s"%i[0])
self.lc.SetStringItem(baris,1,"%s"%i[1])
baris =baris + 1
kursor.execute(sql)
hasil = kursor.fetchall()
317
if kursor.rowcount > 0 :
kursor.execute(sql1)
conn.commit()
else :
kursor.execute(sql1)
conn.commit()
self.Bersih()
self.Isi_List()
def Bersih(self) :
self.txt_madura.SetValue("")
self.txt_inggris.SetValue("")
self.txt_madura.SetFocus()
self.Bersih()
318
sql1 = "delete from buku where madura ='%s'
"%(self.txt_madura.GetValue())
kursor.execute(sql1)
conn.commit()
self.Bersih()
self.a = event.m_itemIndex
md1 = self.lc.GetItem(self.a,0).GetText()
self.txt_madura.SetValue(md1)
ing1 = self.lc.GetItem(self.a,1).GetText()
self.txt_inggris.SetValue(ing1)
kursor.execute(sql)
if kursor.rowcount > 0 :
hasil = kursor.fetchall()
for i in hasil :
self.txt_inggris.SetValue(i[1])
else :
319
self.pesan = wx.MessageDialog(self, "terjemahan
kata "+self.txt_inggris.GetValue()+ " tidak
ada","Informasi",wx.OK)
self.pesan.ShowModal()
320
Gambar 12.5 Komponen Frame Kamus
#Boa:Frame:Frame1
# Buat koneksi
conn
=MySQLdb.connect(host="localhost",user="root",passwd=""
,db = "kamus")
# Buat kursor
kursor = conn.cursor()
321
def create(parent):
return Frame1(parent)
[wxID_FRAME1, wxID_FRAME1PANEL1,
wxID_FRAME1RINGGRIS, wxID_FRAME1RMADURA,
wxID_FRAME1STATICTEXT1,
wxID_FRAME1STATICTEXT2,
wxID_FRAME1TMBTERJEMAHKAN,
wxID_FRAME1TXT_KATA,
wxID_FRAME1TXT_TERJEMAHAN,
class Frame1(wx.Frame):
style=wx.DEFAULT_FRAME_STYLE,
self.SetClientSize(wx.Size(468, 312))
322
self.panel1 = wx.Panel(id=wxID_FRAME1PANEL1,
name='panel1', parent=self,
style=wx.TAB_TRAVERSAL)
self.rMadura =
wx.RadioButton(id=wxID_FRAME1RMADURA,
label='Madura-Inggris', name='rMadura',
parent=self.panel1,
self.rMadura.SetValue(True)
self.rMadura.SetFont(wx.Font(12, wx.SWISS,
wx.NORMAL, wx.NORMAL, False,
'Tahoma'))
self.rInggris =
wx.RadioButton(id=wxID_FRAME1RINGGRIS,
label='Inggris-Madura', name='rInggris',
parent=self.panel1,
self.rInggris.SetValue(False)
323
self.rInggris.SetFont(wx.Font(12, wx.SWISS,
wx.NORMAL, wx.NORMAL, False,
'Tahoma'))
self.staticText1 =
wx.StaticText(id=wxID_FRAME1STATICTEXT1,
style=0)
self.staticText1.SetFont(wx.Font(12, wx.SWISS,
wx.NORMAL, wx.NORMAL,
False, 'Tahoma'))
self.txt_kata =
wx.TextCtrl(id=wxID_FRAME1TXT_KATA, name='txt_kata',
style=0, value='')
self.txt_kata.SetFont(wx.Font(12, wx.SWISS,
wx.NORMAL, wx.NORMAL, False,
'Tahoma'))
324
self.tmbTerjemahkan =
wx.Button(id=wxID_FRAME1TMBTERJEMAHKAN,
label='Terjemahkan', name='tmbTerjemahkan',
parent=self.panel1,
self.tmbTerjemahkan.Bind(wx.EVT_BUTTON,
self.OnTmbTerjemahkanButton,
id=wxID_FRAME1TMBTERJEMAHKAN)
self.staticText2 =
wx.StaticText(id=wxID_FRAME1STATICTEXT2,
label='Terjemahan', name='staticText2',
parent=self.panel1,
self.staticText2.SetFont(wx.Font(12, wx.SWISS,
wx.NORMAL, wx.NORMAL,
False, 'Tahoma'))
self.txt_terjemahan =
wx.TextCtrl(id=wxID_FRAME1TXT_TERJEMAHAN,
name='txt_terjemahan', parent=self.panel1,
pos=wx.Point(40, 224),
325
self.txt_terjemahan.SetFont(wx.Font(12, wx.SWISS,
wx.NORMAL, wx.NORMAL,
False, 'Tahoma'))
self._init_ctrls(parent)
if self.rMadura.Value == True :
kursor.execute(sql)
if kursor.rowcount > 0 :
hasil = kursor.fetchall()
for i in hasil :
self.txt_terjemahan.SetValue(i[1])
else :
self.pesan.ShowModal()
else :
326
sql = "select * from kata where inggris ='%s'
"%(self.txt_kata.GetValue())
kursor.execute(sql)
if kursor.rowcount > 0 :
hasil = kursor.fetchall()
for i in hasil :
self.txt_terjemahan.SetValue(i[0])
else :
self.pesan.ShowModal()
327
BAB XIII
APLIKASI PENJUALAN
13.1 Pendahuluan
1. wx.App (AppPenjualan.py)
328
6. Frame Laporan Daftar Stock Minimum
(stock_min.py)
kd_brg Varchar 5
nama_brg Varchar 25
hrg_beli Int
hrg_jual Int
stock Int
stock_min Int
nota int
tgl date
329
total int
bayar int
kembali Int
Nota int
kd_brg varchar 5
jml int
hrg_jual int
total int
#!/usr/bin/env python
#Boa:App:BoaApp
import wx
import frmMenu
330
modules ={u'frmMenu': [1, 'Main frame of Application',
u'frmMenu.py']}
class BoaApp(wx.App):
def OnInit(self):
self.main = frmMenu.create(None)
self.main.Show()
self.SetTopWindow(self.main)
return True
def main():
application = BoaApp(0)
application.MainLoop()
if __name__ == '__main__':
main()
331
Gambar 13.1 Struktur Menu Penjualan
#Boa:Frame:frmMenu
def create(parent):
return frmMenu(parent)
class frmMenu(wx.Frame):
332
# generated method, don't edit
wx.Frame.__init__(self, id=wxID_FRMMENU,
name='frmMenu', parent=prnt,
style=wx.DEFAULT_FRAME_STYLE, title='Menu
Utama Penjualan')
self.SetClientSize(wx.Size(1024, 721))
self._init_ctrls(parent)
menuMaster = wx.Menu()
menuMaster.AppendSeparator()
menuMaster.Append(2, "E&xit")
menuTrans = wx.Menu()
menuTrans.Append(3, "&Penjualan...")
menuLap = wx.Menu()
menuBar = wx.MenuBar()
333
menuBar.Append(menuMaster, "&Master")
menuBar.Append(menuTrans, "&Transaksi")
menuBar.Append(menuLap, "&Laporan")
self.SetMenuBar(menuBar)
self.CreateStatusBar()
self.Close()
self.main = Dabar.create(None)
self.main.Show()
self.main = Jual.create(None)
self.main.Show()
334
def OnLapStock_min(self,event) :
self.main = Stock_min.create(None)
self.main.Show()
def OnLapPenjualan(self,event) :
self.main = LapPenjualan.create(None)
self.main.Show()
335
Gambar 13.3 Komponen Frame Input Data
#Boa:Frame:Dabar
cur = conn.cursor()
336
def create(parent):
return Dabar(parent)
wxID_DABARSTATICTEXT2, wxID_DABARSTATICTEXT3,
wxID_DABARSTATICTEXT4,
wxID_DABARSTATICTEXT5, wxID_DABARSTATICTEXT6,
wxID_DABARTMBBERSIH,
wxID_DABARTMBHAPUS, wxID_DABARTMBSIMPAN,
wxID_DABARTXT_HRGBELI,
wxID_DABARTXT_HRGJUAL, wxID_DABARTXT_KDBRG,
wxID_DABARTXT_NAMABRG,
wxID_DABARTXT_STOCK, wxID_DABARTXT_STOCKMIN,
class Dabar(wx.Frame):
parent.InsertColumn(col=0,
format=wx.LIST_FORMAT_LEFT,
337
parent.InsertColumn(col=1,
format=wx.LIST_FORMAT_LEFT,
parent.InsertColumn(col=2,
format=wx.LIST_FORMAT_LEFT, heading='Stock',
width=-1)
parent.InsertColumn(col=3,
format=wx.LIST_FORMAT_LEFT,
wx.Frame.__init__(self, id=wxID_DABAR,
name='Dabar', parent=prnt,
style=wx.DEFAULT_FRAME_STYLE, title='Input
Data Barang')
self.SetClientSize(wx.Size(457, 494))
self.panel1 = wx.Panel(id=wxID_DABARPANEL1,
name='panel1', parent=self,
338
style=wx.TAB_TRAVERSAL)
self.staticText1 =
wx.StaticText(id=wxID_DABARSTATICTEXT1,
self.txt_kdbrg =
wx.TextCtrl(id=wxID_DABARTXT_KDBRG,
name='txt_kdbrg',
style=wx.TE_PROCESS_ENTER, value='')
self.txt_kdbrg.Bind(wx.EVT_TEXT_ENTER,
self.OnTxt_kdbrgTextEnter,
id=wxID_DABARTXT_KDBRG)
self.staticText2 =
wx.StaticText(id=wxID_DABARSTATICTEXT2,
339
self.txt_namabrg =
wx.TextCtrl(id=wxID_DABARTXT_NAMABRG,
name='txt_namabrg', parent=self.panel1,
pos=wx.Point(128, 53),
self.staticText3 =
wx.StaticText(id=wxID_DABARSTATICTEXT3,
self.txt_hrgbeli =
wx.TextCtrl(id=wxID_DABARTXT_HRGBELI,
name='txt_hrgbeli', parent=self.panel1,
pos=wx.Point(128, 96),
self.staticText4 =
wx.StaticText(id=wxID_DABARSTATICTEXT4,
340
self.txt_hrgjual =
wx.TextCtrl(id=wxID_DABARTXT_HRGJUAL,
name='txt_hrgjual', parent=self.panel1,
pos=wx.Point(128, 144),
self.staticText5 =
wx.StaticText(id=wxID_DABARSTATICTEXT5,
label='Stock', name='staticText5',
parent=self.panel1,
self.txt_stock =
wx.TextCtrl(id=wxID_DABARTXT_STOCK,
name='txt_stock',
style=0, value='')
self.staticText6 =
wx.StaticText(id=wxID_DABARSTATICTEXT6,
341
self.txt_stockmin =
wx.TextCtrl(id=wxID_DABARTXT_STOCKMIN,
name='txt_stockmin', parent=self.panel1,
pos=wx.Point(128, 232),
self.tmbSimpan =
wx.Button(id=wxID_DABARTMBSIMPAN, label='Simpan',
name='tmbSimpan', parent=self.panel1,
pos=wx.Point(24, 272),
self.tmbSimpan.Bind(wx.EVT_BUTTON,
self.OnTmbSimpanButton,
id=wxID_DABARTMBSIMPAN)
self.tmbHapus =
wx.Button(id=wxID_DABARTMBHAPUS, label='Hapus',
name='tmbHapus', parent=self.panel1,
pos=wx.Point(112, 272),
self.tmbHapus.Bind(wx.EVT_BUTTON,
self.OnTmbHapusButton,
id=wxID_DABARTMBHAPUS)
342
self.tmbBersih =
wx.Button(id=wxID_DABARTMBBERSIH, label='Bersih',
name='tmbBersih', parent=self.panel1,
pos=wx.Point(200, 272),
self.tmbBersih.Bind(wx.EVT_BUTTON,
self.OnTmbBersihButton,
id=wxID_DABARTMBBERSIH)
style=wx.LC_REPORT)
self._init_coll_lc_Columns(self.lc)
self.lc.Bind(wx.EVT_LIST_ITEM_SELECTED,
self.OnLcListItemSelected,
id=wxID_DABARLC)
self._init_ctrls(parent)
self.Awal()
self.Isi_Object()
343
def OnTmbSimpanButton(self, event):
if self.txt_kdbrg.GetValue()=="" :
self.pesan.ShowModal()
self.txt_kdbrg.SetFocus()
event.Veto()
if self.txt_namabrg.GetValue()=="" :
self.pesan.ShowModal()
self.txt_namabrg.SetFocus()
event.Veto()
cur.execute(sql)
kd_brg1=self.txt_kdbrg.GetValue()
nama_brg1=self.txt_namabrg.GetValue()
hrg_beli1=int(self.txt_hrgbeli.GetValue())
hrg_jual1=int(self.txt_hrgjual.GetValue())
344
stock1=int(self.txt_stock.GetValue())
stock_min1=int(self.txt_stockmin.GetValue())
if cur.rowcount > 0 :
else :
cur.execute(sql)
conn.commit()
self.Awal()
def Awal(self) :
self.Isi_List()
self.txt_kdbrg.SetValue("")
self.txt_namabrg.SetValue("")
self.txt_hrgbeli.SetValue("")
self.txt_hrgjual.SetValue("")
345
self.txt_stock.SetValue("")
self.txt_stockmin.SetValue("")
self.txt_kdbrg.SetFocus()
def Isi_Object(self) :
cur.execute(sql)
if cur.rowcount > 0 :
hasil = cur.fetchone()
self.txt_namabrg.SetValue(hasil[1])
self.txt_hrgbeli.SetValue(str(hasil[2]))
self.txt_hrgjual.SetValue(str(hasil[3]))
self.txt_stock.SetValue(str(hasil[4]))
self.txt_stockmin.SetValue(str(hasil[5]))
#else :
# self.pesan.ShowModal()
self.txt_namabrg.SetFocus()
def Isi_List(self) :
self.lc.DeleteAllItems()
346
cur.execute(sql)
hasil = cur.fetchall()
jumbar = self.lc.GetItemCount()
for i in hasil :
self.lc.InsertStringItem(jumbar,i[0])
self.lc.SetStringItem(jumbar,1,i[1])
self.lc.SetStringItem(jumbar,2,str(i[4]))
self.lc.SetStringItem(jumbar,3,str(i[3]))
jumbar = jumbar + 1
if self.txt_kdbrg.GetValue()=="" :
self.pesan.ShowModal()
self.txt_kdbrg.SetFocus()
event.Veto()
if tanya.ShowModal()==wx.ID_YES:
347
sql ="delete from barang where kd_brg ='%s'
"%(self.txt_kdbrg.GetValue())
cur.execute(sql)
conn.commit()
self.Awal()
self.Awal()
self.currentItem = event.m_itemIndex
b = self.lc.GetItem(self.currentItem).GetText()
self.txt_kdbrg.SetValue(b)
self.Isi_Object()
348
Gambar 13.4 Transaksi Penjualan
349
Gambar 13.5 Komponen Frame Penjualan
350
adalah 36, maka nota saat ini yang ditampilkan
adalah 37.
351
6. User menekan tombol Simpan, maka akan
terjadi proses perubahan pada database yang
meliputi :
352
8. Proses 1 transaksi selesai, dan semua textctrl
akan dibersihkan kecuali Nota dan Tanggal.
Nota akan bertambah 1 angka.
#Boa:Frame:Frame1
cur = conn.cursor()
353
def create(parent):
return Frame1(parent)
[wxID_FRAME1, wxID_FRAME1LC,
wxID_FRAME1PANEL1, wxID_FRAME1STATICTEXT1,
wxID_FRAME1STATICTEXT10,
wxID_FRAME1STATICTEXT11,
wxID_FRAME1STATICTEXT2,
wxID_FRAME1STATICTEXT3,
wxID_FRAME1STATICTEXT4,
wxID_FRAME1STATICTEXT5,
wxID_FRAME1STATICTEXT6,
wxID_FRAME1STATICTEXT7,
wxID_FRAME1STATICTEXT8,
wxID_FRAME1STATICTEXT9,
wxID_FRAME1TMBSIMPAN, wxID_FRAME1TMBTAMBAH,
wxID_FRAME1TXT_BAYAR, wxID_FRAME1TXT_HRG,
wxID_FRAME1TXT_JML,
wxID_FRAME1TXT_KDBRG,
wxID_FRAME1TXT_KEMBALI,
wxID_FRAME1TXT_NAMABRG,
wxID_FRAME1TXT_NOTA, wxID_FRAME1TXT_TGL,
wxID_FRAME1TXT_TOTAL,
wxID_FRAME1TXT_TOTAL_SEMUA,
class Frame1(wx.Frame):
354
def _init_coll_lc_Columns(self, parent):
parent.InsertColumn(col=0,
format=wx.LIST_FORMAT_LEFT,
parent.InsertColumn(col=1,
format=wx.LIST_FORMAT_LEFT,
parent.InsertColumn(col=2,
format=wx.LIST_FORMAT_LEFT, heading='Jumlah',
width=-1)
parent.InsertColumn(col=3,
format=wx.LIST_FORMAT_LEFT, heading='Harga',
width=-1)
parent.InsertColumn(col=4,
format=wx.LIST_FORMAT_LEFT, heading='Total',
width=-1)
355
style=wx.DEFAULT_FRAME_STYLE,
title='Transaksi Penjualan')
self.SetClientSize(wx.Size(571, 462))
self.panel1 = wx.Panel(id=wxID_FRAME1PANEL1,
name='panel1', parent=self,
style=wx.TAB_TRAVERSAL)
self.staticText1 =
wx.StaticText(id=wxID_FRAME1STATICTEXT1,
self.txt_nota =
wx.TextCtrl(id=wxID_FRAME1TXT_NOTA, name='txt_nota',
style=0, value='')
self.txt_nota.SetEditable(False)
356
self.staticText2 =
wx.StaticText(id=wxID_FRAME1STATICTEXT2,
label='Tanggal', name='staticText2',
parent=self.panel1,
self.txt_tgl = wx.TextCtrl(id=wxID_FRAME1TXT_TGL,
name='txt_tgl',
style=0, value='')
self.txt_tgl.SetEditable(False)
self.staticText3 =
wx.StaticText(id=wxID_FRAME1STATICTEXT3,
self.txt_kdbrg =
wx.TextCtrl(id=wxID_FRAME1TXT_KDBRG,
name='txt_kdbrg',
357
style=wx.TE_PROCESS_ENTER, value='')
self.txt_kdbrg.Bind(wx.EVT_TEXT_ENTER,
self.OnTxt_kdbrgTextEnter,
id=wxID_FRAME1TXT_KDBRG)
self.staticText4 =
wx.StaticText(id=wxID_FRAME1STATICTEXT4,
self.txt_namabrg =
wx.TextCtrl(id=wxID_FRAME1TXT_NAMABRG,
name='txt_namabrg', parent=self.panel1,
pos=wx.Point(128, 120),
self.txt_namabrg.SetEditable(False)
self.staticText5 =
wx.StaticText(id=wxID_FRAME1STATICTEXT5,
label='Jumlah', name='staticText5',
parent=self.panel1,
358
self.txt_jml = wx.TextCtrl(id=wxID_FRAME1TXT_JML,
name='txt_jml',
style=wx.TE_PROCESS_ENTER, value='')
self.txt_jml.Bind(wx.EVT_TEXT_ENTER,
self.OnTxt_jmlTextEnter,
id=wxID_FRAME1TXT_JML)
self.staticText6 =
wx.StaticText(id=wxID_FRAME1STATICTEXT6,
label='Harga', name='staticText6',
parent=self.panel1,
self.txt_hrg =
wx.TextCtrl(id=wxID_FRAME1TXT_HRG, name='txt_hrg',
style=0, value='')
self.txt_hrg.SetEditable(False)
359
self.staticText7 =
wx.StaticText(id=wxID_FRAME1STATICTEXT7,
label='Total', name='staticText7',
parent=self.panel1,
self.txt_total =
wx.TextCtrl(id=wxID_FRAME1TXT_TOTAL,
name='txt_total',
style=0, value='')
self.txt_total.SetEditable(False)
self.tmbTambah =
wx.Button(id=wxID_FRAME1TMBTAMBAH,
label='Tambah',
name='tmbTambah', parent=self.panel1,
pos=wx.Point(480, 120),
self.tmbTambah.Bind(wx.EVT_BUTTON,
self.OnTmbTambahButton,
id=wxID_FRAME1TMBTAMBAH)
360
self.lc = wx.ListCtrl(id=wxID_FRAME1LC, name='lc',
parent=self.panel1,
style=wx.LC_REPORT)
self._init_coll_lc_Columns(self.lc)
self.lc.Bind(wx.EVT_LIST_ITEM_SELECTED,
self.OnLcListItemSelected,
id=wxID_FRAME1LC)
self.staticText8 =
wx.StaticText(id=wxID_FRAME1STATICTEXT8,
label='Total', name='staticText8',
parent=self.panel1,
self.staticText8.SetFont(wx.Font(16, wx.SWISS,
wx.NORMAL, wx.NORMAL,
False, 'Tahoma'))
self.txt_total_semua =
wx.TextCtrl(id=wxID_FRAME1TXT_TOTAL_SEMUA,
name='txt_total_semua', parent=self.panel1,
pos=wx.Point(16, 336),
361
self.txt_total_semua.SetFont(wx.Font(16, wx.SWISS,
wx.NORMAL, wx.BOLD,
False, 'Tahoma'))
self.txt_total_semua.SetEditable(False)
self.staticText9 =
wx.StaticText(id=wxID_FRAME1STATICTEXT9,
label='Total', name='staticText9',
parent=self.panel1,
self.staticText9.SetFont(wx.Font(16, wx.SWISS,
wx.NORMAL, wx.NORMAL,
False, 'Tahoma'))
self.staticText10 =
wx.StaticText(id=wxID_FRAME1STATICTEXT10,
label='Bayar', name='staticText10',
parent=self.panel1,
self.staticText10.SetFont(wx.Font(14, wx.SWISS,
wx.NORMAL, wx.BOLD,
False, 'Tahoma'))
362
self.txt_bayar =
wx.TextCtrl(id=wxID_FRAME1TXT_BAYAR,
name='txt_bayar',
style=wx.TE_PROCESS_ENTER, value='')
self.txt_bayar.SetFont(wx.Font(16, wx.SWISS,
wx.NORMAL, wx.NORMAL,
False, 'Tahoma'))
self.txt_bayar.Bind(wx.EVT_TEXT_ENTER,
self.OnTxt_bayarTextEnter,
id=wxID_FRAME1TXT_BAYAR)
self.staticText11 =
wx.StaticText(id=wxID_FRAME1STATICTEXT11,
label='Kembali', name='staticText11',
parent=self.panel1,
self.staticText11.SetFont(wx.Font(14, wx.SWISS,
wx.NORMAL, wx.BOLD,
False, 'Tahoma'))
self.txt_kembali =
wx.TextCtrl(id=wxID_FRAME1TXT_KEMBALI,
363
name='txt_kembali', parent=self.panel1,
pos=wx.Point(392, 336),
self.txt_kembali.SetFont(wx.Font(16, wx.SWISS,
wx.NORMAL, wx.NORMAL,
False, 'Tahoma'))
self.tmbSimpan =
wx.Button(id=wxID_FRAME1TMBSIMPAN, label='Simpan',
name='tmbSimpan', parent=self.panel1,
pos=wx.Point(16, 416),
self.tmbSimpan.Bind(wx.EVT_BUTTON,
self.OnTmbSimpanButton,
id=wxID_FRAME1TMBSIMPAN)
self._init_ctrls(parent)
self.Awal()
# Isi No Nota
default_value = 0
364
#sql = "select max(nota) as nt from jual "
cur.execute(sql)
if cur.rowcount > 0 :
hasil = cur.fetchone()
jml = hasil[0] + 1
self.txt_nota.SetValue(str(jml))
else :
self.txt_nota.SetValue("1")
skrg = datetime.date.today()
day = skrg.day
month = skrg.month
year = skrg.year
self.txt_tgl.SetValue("%02d/%02d/%4d" % (day,
month, year))
self.txt_kdbrg.SetValue("")
self.txt_namabrg.SetValue("")
self.txt_hrg.SetValue("")
365
self.txt_jml.SetValue("")
self.txt_total.SetValue("")
self.txt_kdbrg.SetFocus()
# Bersihkan ListCtrl lc
self.lc.DeleteAllItems()
self.txt_total_semua.SetValue("0")
self.txt_bayar.SetValue("0")
self.txt_kembali.SetValue("0")
jumbar = self.lc.GetItemCount()
self.lc.InsertStringItem(jumbar,self.txt_kdbrg.GetValue())
self.lc.SetStringItem(jumbar,1,self.txt_namabrg.GetValue()
)
self.lc.SetStringItem(jumbar,2,self.txt_jml.GetValue())
self.lc.SetStringItem(jumbar,3,self.txt_hrg.GetValue())
self.lc.SetStringItem(jumbar,4,self.txt_total.GetValue())
# Tambahkan Total
ta = int(self.txt_total.GetValue())
366
tb = int(self.txt_total_semua.GetValue())
tb = tb + ta
self.txt_total_semua.SetValue(str(tb))
self.txt_kdbrg.SetValue("")
self.txt_namabrg.SetValue("")
self.txt_jml.SetValue("")
self.txt_hrg.SetValue("")
self.txt_total.SetValue("")
self.txt_kdbrg.SetFocus()
nota1= int(self.txt_nota.GetValue())
skrg = datetime.date.today()
day = skrg.day
month = skrg.month
year = skrg.year
367
tgl1 = datetime.date(year,month,day)
total1 = int(self.txt_total_semua.GetValue())
bayar1 = int(self.txt_bayar.GetValue())
kembali1 = int(self.txt_kembali.GetValue())
('%d','%s','%d','%d','%d')
"%(nota1,tgl1,total1,bayar1,kembali1)
cur.execute(sql)
conn.commit()
i =0
jumbar = self.lc.GetItemCount()
kd_brg1 = self.lc.GetItem(i,0).GetText()
jml1 = int(self.lc.GetItem(i,2).GetText())
hrg_jual1 = int(self.lc.GetItem(i,3).GetText())
total1 = int(self.lc.GetItem(i,4).GetText())
368
(nota1,kd_brg1,jml1,hrg_jual1,total1)
cur.execute(sql)
conn.commit()
i = i+1
i =0
jumbar = self.lc.GetItemCount()
kd_brg1 = self.lc.GetItem(i,0).GetText()
jml1 = int(self.lc.GetItem(i,2).GetText())
cur.execute(sql)
if cur.rowcount > 0 :
hasil = cur.fetchone()
kd_brg = '%s'"%(st1,kd_brg1)
cur.execute(sql)
conn.commit()
i = i +1
369
tanya = wx.MessageDialog(self,message="Apakah
Anda Hendak \
Mencetak Nota"+self.txt_namabrg.GetValue()+"
?",style = wx.YES_NO)
if tanya.ShowModal()==wx.ID_YES:
self.Cetak()
self.Awal()
def Cetak(self) :
book = Workbook()
sheet1 = book.add_sheet('Sheet1')
## Setting Border
borders = Borders()
borders.left = 1
borders.right = 1
borders.top = 1
borders.bottom = 1
style0 = XFStyle()
370
style0.borders = borders
jumbar =self.lc.GetItemCount()
## Cetak Header
sheet1.write(1,0,"No. Nota")
sheet1.write(1,1,self.txt_nota.GetValue())
sheet1.write(2,0,"Tanggal")
sheet1.write(2,1,self.txt_tgl.GetValue())
i=3
# Beri Judul
sheet1.write(i,0,"Kode Barang",style0)
sheet1.write(i,1,"Nama Barang",style0)
sheet1.write(i,2,"Jumlah",style0)
sheet1.write(i,3,"Harga",style0)
sheet1.write(i,4,"Total",style0)
j=0
371
while j<=jumbar-1 :
kd_brg1 = self.lc.GetItem(j,0).GetText()
sheet1.write(j+i+1,0,kd_brg1,style0)
nama_brg1 = self.lc.GetItem(j,1).GetText()
sheet1.write(j+i+1,1,nama_brg1,style0)
hrg1= self.lc.GetItem(j,2).GetText()
sheet1.write(j+i+1,2,int(hrg1),style0)
jml1 = self.lc.GetItem(j,3).GetText()
sheet1.write(j+i+1,3,int(jml1),style0)
total1 = self.lc.GetItem(j,4).GetText()
sheet1.write(j+i+1,4,int(total1),style0)
j=j+1
k = j+i+2
sheet1.write(k,4,int(self.txt_total_semua.GetValue()),style0)
sheet1.write(k+1,3,"Bayar ",style0)
sheet1.write(k+1,4,int(self.txt_bayar.GetValue()),style0)
sheet1.write(k+2,3,"Kembali ",style0)
372
sheet1.write(k+2,4,int(self.txt_kembali.GetValue()),style0)
sheet1.col(0).width = 3500
sheet1.col(1).width = 5000
sheet1.col(3).width = 4000
path1 = 'C:\\cetak.xls'
if os.path.exists(path1) :
os.remove(path1)
book.save(path1)
%(self.txt_kdbrg.GetValue())
373
cur.execute(sql)
if cur.rowcount > 0 :
hasil = cur.fetchone()
self.txt_namabrg.SetValue(hasil[1])
self.txt_hrg.SetValue(str(hasil[3]))
self.txt_jml.SetFocus()
hrg = int(self.txt_hrg.GetValue())
jml = int(self.txt_jml.GetValue())
tt = hrg * jml
self.txt_total.SetValue(str(tt))
self.tmbTambah.SetFocus()
tt = int(self.txt_total_semua.GetValue())
byr = int(self.txt_bayar.GetValue())
kmb = byr - tt
self.txt_kembali.SetValue(str(kmb))
374
self.currentItem = event.m_itemIndex
b = self.lc.GetItem(self.currentItem).GetText()
self.txt_kdbrg.SetValue(b)
self.lc.DeleteItem(self.currentItem)
375
Gambar 13.8 Daftar Barang di Bawah Stock Min
#Boa:Frame:Frame1
376
import wx, MySQLdb, datetime, os
cur = conn.cursor()
def create(parent):
return Frame1(parent)
[wxID_FRAME1, wxID_FRAME1BUTTON1,
wxID_FRAME1LC, wxID_FRAME1PANEL1,
wxID_FRAME1TMBCETAK,
class Frame1(wx.Frame):
parent.InsertColumn(col=0,
format=wx.LIST_FORMAT_LEFT,
parent.InsertColumn(col=1,
format=wx.LIST_FORMAT_LEFT,
377
heading='Nama Barang', width=160)
parent.InsertColumn(col=2,
format=wx.LIST_FORMAT_LEFT, heading='Stock',
width=65)
parent.InsertColumn(col=3,
format=wx.LIST_FORMAT_LEFT,
parent.InsertColumn(col=4,
format=wx.LIST_FORMAT_LEFT,
style=wx.DEFAULT_FRAME_STYLE,
self.SetClientSize(wx.Size(642, 447))
self.panel1 = wx.Panel(id=wxID_FRAME1PANEL1,
name='panel1', parent=self,
378
style=wx.TAB_TRAVERSAL)
self.panel1.SetBackgroundColour(wx.Colour(192,
192, 192))
self._init_coll_lc_Columns(self.lc)
self.button1 =
wx.Button(id=wxID_FRAME1BUTTON1, label='button1',
name='button1', parent=self.panel1,
pos=wx.Point(192, 216),
self.tmbCetak =
wx.Button(id=wxID_FRAME1TMBCETAK, label='Cetak',
name='tmbCetak', parent=self.panel1,
pos=wx.Point(512, 400),
self.tmbCetak.Bind(wx.EVT_BUTTON,
self.OnTmbCetakButton,
id=wxID_FRAME1TMBCETAK)
379
def __init__(self, parent):
self._init_ctrls(parent)
cur.execute(sql)
hasil= cur.fetchall()
k =self.lc.GetItemCount()
for i in hasil :
self.lc.InsertStringItem(k,i[0])
self.lc.SetStringItem(k,1,i[1])
self.lc.SetStringItem(k,2,str(i[4]))
self.lc.SetStringItem(k,3,str(i[5]))
self.lc.SetStringItem(k,4,str(i[2]))
k=k+1
book = Workbook()
sheet1 = book.add_sheet('Sheet1')
380
## Setting Font
font0 = Font()
font0.name = 'Arial'
font0.height=200
font0.bold = True
## Setting Border
borders = Borders()
borders.left = 1
borders.right = 1
borders.top = 1
borders.bottom = 1
## Setting Pattern
BkgPat = Pattern()
BkgPat.pattern = Pattern.SOLID_PATTERN
BkgPat.pattern_fore_colour = 22
381
## Buat dan setting Style style0
style0 = XFStyle()
style0.font = font0
style0.borders = borders
style0.pattern = BkgPat
style1 = XFStyle()
style1.borders = borders
style_judul = XFStyle()
style_judul.font = font0
jumbar =self.lc.GetItemCount()
## Cetak Header
382
sheet1.write(0,1,"DAFTAR BARANG DI BAWAH
STOCK MINIMUM",style_judul)
i=3
# Beri Judul
sheet1.write(i,0,"Kode Barang",style0)
sheet1.write(i,1,"Nama Barang",style0)
sheet1.write(i,2,"Stock",style0)
sheet1.write(i,3,"Stock Min",style0)
sheet1.write(i,4,"Harga Beli",style0)
j=0
while j<=jumbar-1 :
kd_brg1 = self.lc.GetItem(j,0).GetText()
sheet1.write(j+i+1,0,kd_brg1,style1)
nama_brg1 = self.lc.GetItem(j,1).GetText()
sheet1.write(j+i+1,1,nama_brg1,style1)
stock1= self.lc.GetItem(j,2).GetText()
sheet1.write(j+i+1,2,int(stock1),style1)
383
stock_min1 = self.lc.GetItem(j,3).GetText()
sheet1.write(j+i+1,3,int(stock_min1),style1)
hrg_beli1 = self.lc.GetItem(j,4).GetText()
sheet1.write(j+i+1,4,int(hrg_beli1),style1)
j=j+1
sheet1.col(0).width = 3500
sheet1.col(1).width = 5000
sheet1.col(3).width = 4000
sheet1.col(4).width = 3500
path1 = 'C:\\cetak_stock_min.xls'
if os.path.exists(path1) :
os.remove(path1)
book.save(path1)
384
13.9 Frame Laporan Omzet Penjualan Pada
Periode Tertentu (LapPenjualan.py)
385
Gambar 13.11 Komponen Laporan Penjualan
386
Total Keseluruhan Omzet ditampilkan di
textctrl txt_total_semua.
#Boa:Frame:Frame1
387
conn= MySQLdb.connect(host="localhost", user="root",
passwd="",db="penjualan")
cur = conn.cursor()
def create(parent):
return Frame1(parent)
[wxID_FRAME1, wxID_FRAME1LC,
wxID_FRAME1PANEL1, wxID_FRAME1STATICTEXT1,
wxID_FRAME1STATICTEXT2,
wxID_FRAME1STATICTEXT3, wxID_FRAME1TGL_DARI,
wxID_FRAME1TGL_SAMPAI, wxID_FRAME1TMBCETAK,
wxID_FRAME1TMBPROSES,
wxID_FRAME1TXT_TOTAL_SEMUA,
class Frame1(wx.Frame):
parent.InsertColumn(col=0,
format=wx.LIST_FORMAT_LEFT, heading='Nota',
width=-1)
388
parent.InsertColumn(col=1,
format=wx.LIST_FORMAT_LEFT, heading='Total',
width=-1)
style=wx.DEFAULT_FRAME_STYLE,
title='Laporan Penjualan')
self.SetClientSize(wx.Size(447, 438))
self.panel1 = wx.Panel(id=wxID_FRAME1PANEL1,
name='panel1', parent=self,
style=wx.TAB_TRAVERSAL)
self.tgl_dari =
wx.DatePickerCtrl(id=wxID_FRAME1TGL_DARI,
name='tgl_dari', parent=self.panel1,
pos=wx.Point(32, 64),
389
size=wx.Size(96, 21),
style=wx.DP_SHOWCENTURY)
self.staticText1 =
wx.StaticText(id=wxID_FRAME1STATICTEXT1,
label='Dari', name='staticText1',
parent=self.panel1,
self.staticText2 =
wx.StaticText(id=wxID_FRAME1STATICTEXT2,
label='Sampai', name='staticText2',
parent=self.panel1,
self.tgl_sampai =
wx.DatePickerCtrl(id=wxID_FRAME1TGL_SAMPAI,
name='tgl_sampai', parent=self.panel1,
pos=wx.Point(312, 64),
size=wx.Size(96, 21),
style=wx.DP_SHOWCENTURY)
self.tmbProses =
wx.Button(id=wxID_FRAME1TMBPROSES, label='Proses',
390
name='tmbProses', parent=self.panel1,
pos=wx.Point(336, 120),
self.tmbProses.Bind(wx.EVT_BUTTON,
self.OnTmbProsesButton,
id=wxID_FRAME1TMBPROSES)
style=wx.LC_REPORT)
self._init_coll_lc_Columns(self.lc)
self.staticText3 =
wx.StaticText(id=wxID_FRAME1STATICTEXT3,
self.txt_total_semua =
wx.TextCtrl(id=wxID_FRAME1TXT_TOTAL_SEMUA,
name='txt_total_semua', parent=self.panel1,
pos=wx.Point(136,
391
self.tmbCetak =
wx.Button(id=wxID_FRAME1TMBCETAK, label='Cetak',
name='tmbCetak', parent=self.panel1,
pos=wx.Point(328, 400),
self.tmbCetak.Bind(wx.EVT_BUTTON,
self.OnTmbCetakButton,
id=wxID_FRAME1TMBCETAK)
self._init_ctrls(parent)
skrg = datetime.date.today()
day = skrg.day
month = skrg.month
year = skrg.year
displayed = wx.DateTimeFromDMY(day,month-
1,year)
displayed.Format("%d/%m/%Y")
self.tgl_dari.SetValue(displayed)
#self.tgl_sampai.SetValue(displayed)
392
selected = self.tgl_dari.GetValue()
month = selected.Month + 1
day = selected.Day
year = selected.Year
dari1=datetime.date(year,month,day)
selected = self.tgl_sampai.GetValue()
month = selected.Month + 1
day = selected.Day
year = selected.Year
sampai1=datetime.date(year,month,day)
self.lc.DeleteAllItems()
cur.execute(sql)
if cur.rowcount > 0 :
hasil = cur.fetchall()
jumbar = self.lc.GetItemCount()
total =0
for i in hasil :
self.lc.InsertStringItem(jumbar,str(i[0]))
393
self.lc.SetStringItem(jumbar,1,str(i[2]))
total=total+i[2]
jumbar = jumbar + 1
self.txt_total_semua.SetValue(str(total))
book = Workbook()
sheet1 = book.add_sheet('Sheet1')
## Setting Font
font0 = Font()
font0.name = 'Arial'
font0.height=200
font0.bold = True
## Setting Border
borders = Borders()
394
borders.left = 1
borders.right = 1
borders.top = 1
borders.bottom = 1
## Setting Pattern
BkgPat = Pattern()
BkgPat.pattern = Pattern.SOLID_PATTERN
BkgPat.pattern_fore_colour = 22
style0 = XFStyle()
style0.font = font0
style0.borders = borders
style0.pattern = BkgPat
style1 = XFStyle()
style1.borders = borders
395
## Buat dan setting Style style_judul
style_judul = XFStyle()
style_judul.font = font0
## Format Tanggal
fmt ='DD-MM-YYYY'
style_tgl = XFStyle()
style_tgl.num_format_str = fmt
style_num1 = XFStyle()
style_num1.borders = borders
style_num1.num_format_str = fmt
style_num2 = XFStyle()
style_num2.borders = borders
style_num2.num_format_str = fmt
style_num2.pattern = BkgPat
396
style_num2.font = font0
jumbar =self.lc.GetItemCount()
selected = self.tgl_dari.GetValue()
month = selected.Month + 1
day = selected.Day
year = selected.Year
dari1=datetime.date(year,month,day)
selected = self.tgl_sampai.GetValue()
month = selected.Month + 1
day = selected.Day
year = selected.Year
sampai1=datetime.date(year,month,day)
## Cetak Header
397
sheet1.write(2,0,"Dari Tgl", style_judul)
sheet1.write(2,1,dari1,style_tgl)
sheet1.write(3,1,sampai1,style_tgl)
i=4
sheet1.write(i,0,"Nota",style0)
sheet1.write(i,1,"Total Harga",style0)
j=0
while j<=jumbar-1 :
nota1 = self.lc.GetItem(j,0).GetText()
sheet1.write(j+i+1,0,nota1,style1)
total1 = self.lc.GetItem(j,1).GetText()
sheet1.write(j+i+1,1,int(total1),style_num1)
j=j+1
k=j+i+1
sheet1.write(k,0,"Total Omzet",style0)
sheet1.write(k,1,int(self.txt_total_semua.GetValue()),style_
num2)
398
# Atur Lebar Kolom
sheet1.col(0).width = 3500
sheet1.col(1).width = 5000
path1 = 'C:\\cetak_lap_omzet.xls'
if os.path.exists(path1) :
os.remove(path1)
book.save(path1)
399
DAFTAR PUSTAKA
zetcode.com/databases/mysqlpythontutorial, diakses
30 Mei 2011
400
LAMPIRAN A : INSTALASI IDLE Python,
wxPython, dan Python-MySQL Connector di
Windows 7
401
3. Muncul Tampilan : „Select Destination Directory‟
(Memilih Folder tujuan).
Klik Next
402
Gambar A.4 Jendela Customize Python 2.5
403
Gambar A.5 Proses Instalasi Python 2.5
404
Gambar A.7 Python 2.5 Telah Berada di Start Menu
Programs
405
Klik Next untuk melanjutkan
406
Gambar A.10 Select Destination Location
wxPython
407
Gambar A.12 Proses Instalasi Berjalan
408
Klik tombol Finish.
409
Jika tidak ada pesan error, berarti instalasi sudah
berhasil.
Klik Next
410
Gambar A.16 Folder Tujuan Instalasi
Klik Next
411
6. Instalasi Telah Selesai
412
Gambar A.19 Start Menu> Python 2.5
413
LAMPIRAN B: INSTALASI XAMPP
Klik OK.
414
4. Tampilan Awal Instalasi XAMPP
Klik Next
415
Klik Next
416
8. Finalisasi Proses Instalasi XAMPP
417
Gambar B.9 XAMPP Control Panel
418
Gambar B.10 Tampilan Awal phpmyadmin
419
LAMPIRAN C: BACKUP (EXPORT) DAN
RESTORE (IMPORT) DATABASE
420
Selanjutnya, klik tombol Go
421
5. Tampil Pesan untuk Menyimpan File
422
Gambar C.5 Ketik ‘cmd’ di Kotak Pencarian
423
Gambar C.8 Ke Alamat MySQL\bin
424
Gambar C.10 Masukkan Password MySQL
Tekan Enter.
425
2. Buatlah Nama Database yang akan diimport,
misalnya : kamus. Kemudian tekan tombol
Create
5. Klik tombol Go
426
4. Arahkan direktori aktif di command prompt ke
C:\xampp\mysql\bin
427
LAMPIRAN D : MEMBUKA FILE APLIKASI
CONTOH DALAM BUKU
428