Quick actions

cmd+k|ctrl+k

Navigation

Languages

Aplikasi kasir

Snippet info

Language

Python

Visibility

public

Author

markusparu54

Created

2024-12-15T14:02:24.319063Z

Updated

2024-12-16T05:33:30.648289Z

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()
INFO