import tkinter as tk
from tkinter import ttk, messagebox
from PIL import Image, ImageTk
import sqlite3
from datetime import datetime
# Fungsi untuk mengecek login
def check_login():
username = entry_username.get()
password = entry_password.get()
if username == "admin" and password == "1234":
login_window.destroy()
main_application()
else:
messagebox.showerror("Login Error", "Username atau Password salah!")
# Fungsi untuk aplikasi utama
def main_application():
# Koneksi ke database
conn = sqlite3.connect("barang.db")
cursor = conn.cursor()
# Membuat tabel barang jika belum ada
cursor.execute('''CREATE TABLE IF NOT EXISTS barang (
id INTEGER PRIMARY KEY,
nama TEXT NOT NULL,
harga INTEGER NOT NULL)''')
conn.commit()
# Window Utama Aplikasi Kasir
window = tk.Tk() # Membuat window utama aplikasi
window.title("Aplikasi Kasir Sederhana") # Set judul aplikasi
window.geometry("800x600") # Set ukuran window
window.config(bg="white") # Set warna latar belakang aplikasi menjadi putih
# Menambahkan Gambar Background dengan Pillow
try:
img = Image.open("kasir.jpg") # Coba membuka gambar dari file kasir.jpg
bg_image = ImageTk.PhotoImage(img) # Mengkonversi gambar menjadi format yang bisa digunakan di Tkinter
bg_label = tk.Label(window, image=bg_image) # Membuat label untuk menampilkan gambar
bg_label.place(relwidth=1, relheight=1) # Menempatkan gambar di seluruh ukuran window
bg_label.image = bg_image # Simpan referensi gambar agar tidak hilang
except Exception as e:
messagebox.showerror("Error", f"Gagal memuat gambar: {e}") # Menampilkan pesan error jika gambar gagal dimuat
return
# Frame Input Barang
frame_input = tk.Frame(window, pady=10, bg="#D3D3D3") # Membuat frame untuk input barang
frame_input.pack(fill="x") # Memasukkan frame ke window dan membuatnya memenuhi lebar window
# Label untuk Nama Toko dengan Teks Berjalan
def update_label():
current_text = label_toko.cget("text") # Ambil teks saat ini
label_toko.config(text=current_text[1:] + current_text[0]) # Geser teks ke kiri
window.after(200, update_label) # Perbarui label setiap 200ms
label_toko = tk.Label(window, text="Markus Paru", font=("Arial", 18, "bold"), bg="black", fg="white")
label_toko.pack(side="top", fill="x") # Menampilkan label di atas window untuk teks berjalan
update_label() # Mulai animasi teks berjalan
# Menampilkan Hari, Tanggal dan Jam
def update_time():
current_time = datetime.now().strftime("%A, %d %B %Y - %H:%M:%S")
label_time.config(text=current_time)
window.after(1000, update_time)
label_time = tk.Label(window, font=("Arial", 14), bg="black", fg="white")
label_time.pack(side="bottom", fill="x")
update_time()
# Label dan Entry untuk Nama Barang
tk.Label(frame_input, text="Nama Barang:", bg="#D3D3D3").grid(row=0, column=0, padx=5, pady=5)
entry_nama = tk.Entry(frame_input) # Membuat entry untuk nama barang
entry_nama.grid(row=0, column=1, padx=5, pady=5)
# Label dan Entry untuk Jumlah Barang
tk.Label(frame_input, text="Jumlah:", bg="#D3D3D3").grid(row=1, column=0, padx=5, pady=5)
entry_jumlah = tk.Entry(frame_input) # Membuat entry untuk jumlah barang
entry_jumlah.grid(row=1, column=1, padx=5, pady=5)
# Label dan Entry untuk Harga Barang
tk.Label(frame_input, text="Harga Satuan:", bg="#D3D3D3").grid(row=2, column=0, padx=5, pady=5)
entry_harga = tk.Entry(frame_input) # Membuat entry untuk harga satuan barang
entry_harga.grid(row=2, column=1, padx=5, pady=5)
# Fungsi Tambah Barang
def tambah_barang():
nama = entry_nama.get()
jumlah = entry_jumlah.get()
harga = entry_harga.get()
if nama and jumlah.isdigit() and harga.isdigit():
jumlah = int(jumlah)
harga = int(harga)
total = jumlah * harga
tree.insert("", "end", values=(nama, jumlah, harga, total))
entry_nama.delete(0, tk.END)
entry_jumlah.delete(0, tk.END)
entry_harga.delete(0, tk.END)
update_total()
cursor.execute("INSERT INTO barang (nama, harga) VALUES (?, ?)", (nama, harga))
conn.commit()
else:
messagebox.showerror("Input Error", "Pastikan semua kolom diisi dengan benar!")
# Fungsi Hapus Barang
def hapus_barang():
selected_item = tree.selection() # Mengambil item yang dipilih dari tabel
if selected_item:
tree.delete(selected_item) # Menghapus item yang dipilih
update_total() # Update total harga setelah penghapusan
else:
messagebox.showerror("Delete Error", "Pilih barang yang ingin dihapus!") # Pesan error jika tidak ada yang dipilih
# Fungsi Cek Harga Barang
def cek_harga():
nama = entry_nama.get() # Ambil nama barang dari entry
if nama:
cursor.execute("SELECT harga FROM barang WHERE nama=?", (nama,)) # Cari harga berdasarkan nama barang
result = cursor.fetchone() # Ambil hasil pencarian pertama
if result:
harga = result[0] # Ambil harga barang
messagebox.showinfo("Harga Barang", f"Harga {nama}: Rp {harga:,}") # Tampilkan harga barang
else:
messagebox.showerror("Error", "Barang tidak ditemukan!") # Pesan error jika barang tidak ditemukan
else:
messagebox.showerror("Input Error", "Masukkan nama barang untuk cek harga!")
# Fungsi Edit Barang
def edit_barang():
selected_item = tree.selection() # Mengambil item yang dipilih
if selected_item:
values = tree.item(selected_item, "values") # Mengambil nilai dari item yang dipilih
entry_nama.delete(0, tk.END) # Menghapus nilai yang ada di entry nama
entry_nama.insert(0, values[0]) # Menampilkan nama barang yang dipilih
entry_jumlah.delete(0, tk.END) # Menghapus nilai yang ada di entry jumlah
entry_jumlah.insert(0, values[1]) # Menampilkan jumlah barang yang dipilih
entry_harga.delete(0, tk.END) # Menghapus nilai yang ada di entry harga
entry_harga.insert(0, values[2]) # Menampilkan harga barang yang dipilih
tree.delete(selected_item) # Menghapus item yang dipilih dari tabel
else:
messagebox.showerror("Error", "Pilih barang yang ingin diedit!") # Pesan error jika tidak ada yan dipilih
# Fungsi Cetak Struk
def cetak_struk():
messagebox.showinfo("Cetak Struk", "Struk berhasil dicetak!") # Menampilkan pesan info setelah cetak struk
# Fungsi Keluar Aplikasi
def keluar_aplikasi():
if messagebox.askyesno("Keluar", "Apakah Anda yakin ingin keluar?"):
window.quit()
# Tombol untuk menambah barang
tk.Button(frame_input, text="Tambah Barang", command=tambah_barang, bg="#4CAF50", fg="white").grid(row=3, column=1, pady=10)
# Tombol untuk cek harga barang
tk.Button(frame_input, text="Cek Harga", command=cek_harga, bg="#FF5733", fg="white").grid(row=3, column=2, pady=10)
# Tombol untuk mengedit barang
tk.Button(frame_input, text="Edit Barang", command=edit_barang, bg="#FFC107", fg="white").grid(row=3, column=3, pady=10)
# Tombol untuk hapus barang
tk.Button(frame_input, text="Hapus Barang", command=hapus_barang, bg="#4CAF50", fg="white").grid(row=3, column=4, pady=10)
# Tombol untuk mencetak struk
tk.Button(frame_input, text="Cetak Struk", command=cetak_struk, bg="#4CAF50", fg="white").grid(row=3, column=5, pady=10)
# Tombol Keluar
tk.Button(window, text="Keluar", command=keluar_aplikasi, bg="#FF0000", fg="white").pack(side="bottom", pady=10)
# Tabel Barang
frame_table = tk.Frame(window)
frame_table.pack(fill="both", expand=True)
columns = ("Nama Barang", "Jumlah", "Harga Satuan", "Total")
tree = ttk.Treeview(frame_table, columns=columns, show="headings", height=10)
tree.pack(side="left", fill="both", expand=True)
for col in columns:
tree.heading(col, text=col)
tree.column(col, width=100)
scrollbar = ttk.Scrollbar(frame_table, orient="vertical", command=tree.yview)
scrollbar.pack(side="right", fill="y")
tree.config(yscrollcommand=scrollbar.set)
# Fungsi Update Total
def update_total():
total_semua = 0
for item in tree.get_children():
total_semua += int(tree.item(item, "values")[3])
label_total.config(text=f"Total: Rp {total_semua:,}")
# Label Total
frame_total = tk.Frame(window, pady=10, bg="#D3D3D3")
frame_total.pack(fill="x")
label_total = tk.Label(frame_total, text="Total: Rp 0", font=("Arial", 16), fg="blue", bg="#D3D3D3")
label_total.pack(side="left", padx=20)
# Menjalankan aplikasi
window.mainloop()
# Jendela Login
login_window = tk.Tk()
login_window.title("Login Aplikasi Kasir")
login_window.geometry("400x300")
tk.Label(login_window, text="Username:").pack(pady=10)
entry_username = tk.Entry(login_window)
entry_username.pack(pady=5)
tk.Label(login_window, text="Password:").pack(pady=10)
entry_password = tk.Entry(login_window, show="*")
entry_password.pack(pady=5)
tk.Button(login_window, text="Login", command=check_login).pack(pady=20)
login_window.mainloop()