Isi Menu "Riwayat Aktivitas"
Isi Menu "Riwayat Aktivitas" (Bagian 1)
(Konten Sub Menu "Lihat Riwayat Penggunaan ")
5. Sub Menu "Lihat Riwayat Penggunaan"
Sekarang kita masuk ke Menu " Riwayat Aktivitas" , kita lanjut membuat konten Sub Menu " Lihat Riwayat Penggunaan".
Sip, kita masuk ke Sub Menu "Lihat Riwayat Penggunaan" di dalam Menu Riwayat Aktivitas ✅
📌 Konsep fiturnya:
Sub menu ini menampilkan riwayat aktivitas pengguna aplikasi — misalnya kapan pengguna membuka resep, membuat daftar belanja, mengekspor PDF, menambah gambar, dll. Jadi ini semacam log aktivitas .
🔹 Isi konten "Lihat Riwayat Penggunaan":
-
Filter Riwayat
- Pilih rentang tanggal (Date Picker / Combobox).
- Pilih jenis aktivitas (misalnya: "Buka Resep", "Simpan Resep", "Daftar Belanja", "Ekspor PDF", "Bagikan Online", dll).
- Tombol
Filteruntuk memperbarui tampilan.
-
Daftar Riwayat Aktivitas (Daftar)
- Ditampilkan di dalam frame yang dapat di-scroll.
- Kolom utama: Tanggal/Waktu , Jenis Aktivitas , Nama Resep/File , Keterangan tambahan .
- Bisa berupa
ttk.Treeviewbiar tabel lebih rapi.
-
Tombol Aksi
Refresh→ reload log terbaru.Export Riwayat→ simpan ke file TXT/CSV.Hapus Riwayat→ hapus log tertentu atau hapus semua.Kembali→ kembali ke menu sebelumnya.
🔹 Alur Data
- Setiap aktivitas di aplikasi (misalnya tekan tombol "Buka Resep", "Simpan", "Daftar Belanja", dll) → otomatis dicatat ke file
riwayat.jsonatauriwayat.db(SQLite). - Saat membuka sub menu ini → data dari file DB/JSON dibaca, lalu ditampilkan.
🔹 Contoh kerangka filesub_menu_riwayat_penggunaan.py
import tkinter as tk
from tkinter import ttk, messagebox
import json
import os
from datetime import datetime
RIWAYAT_FILE = "riwayat.json"
def catat_aktivitas(jenis, nama_file="", keterangan=""):
"""Catat aktivitas ke file JSON"""
log = {
"waktu": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
"jenis": jenis,
"file": nama_file,
"ket": keterangan
}
if os.path.exists(RIWAYAT_FILE):
with open(RIWAYAT_FILE, "r", encoding="utf-8") as f:
data = json.load(f)
else:
data = []
data.append(log)
with open(RIWAYAT_FILE, "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
def sub_menu_riwayat_penggunaan(root_frame, go_back):
"""Tampilan sub menu Lihat Riwayat Penggunaan"""
frame_content = tk.Frame(root_frame)
frame_content.pack(fill="both", expand=True)
# --- Judul ---
tk.Label(frame_content, text="📜 Riwayat Penggunaan",
font=("Arial", 14, "bold")).pack(pady=10)
# --- Tabel Treeview ---
columns = ("waktu", "jenis", "file", "ket")
tree = ttk.Treeview(frame_content, columns=columns, show="headings", height=15)
tree.pack(fill="both", expand=True, padx=10, pady=6)
for col, text in zip(columns, ["Waktu", "Jenis Aktivitas", "Nama File/Resep", "Keterangan"]):
tree.heading(col, text=text)
tree.column(col, anchor="w", width=150)
# --- Tombol Aksi ---
action_frame = tk.Frame(frame_content)
action_frame.pack(fill="x", pady=8)
def load_data():
tree.delete(*tree.get_children())
if os.path.exists(RIWAYAT_FILE):
with open(RIWAYAT_FILE, "r", encoding="utf-8") as f:
data = json.load(f)
for log in data:
tree.insert("", "end", values=(log["waktu"], log["jenis"], log["file"], log["ket"]))
def export_riwayat():
if os.path.exists(RIWAYAT_FILE):
messagebox.showinfo("Export", f"Riwayat berhasil diexport ke {RIWAYAT_FILE}")
else:
messagebox.showwarning("Export", "Belum ada riwayat untuk diexport.")
def hapus_riwayat():
if messagebox.askyesno("Konfirmasi", "Hapus semua riwayat?"):
with open(RIWAYAT_FILE, "w", encoding="utf-8") as f:
json.dump([], f)
load_data()
ttk.Button(action_frame, text="Refresh", command=load_data).pack(side="left", padx=6)
ttk.Button(action_frame, text="Export Riwayat", command=export_riwayat).pack(side="left", padx=6)
ttk.Button(action_frame, text="Hapus Riwayat", command=hapus_riwayat).pack(side="left", padx=6)
ttk.Button(action_frame, text="⬅ Kembali", command=go_back).pack(side="right", padx=6)
# --- Load awal ---
load_data()
return frame_content
👉 Dengan kerangka ini:
- Kamu bisa menelepon
catat_aktivitas()di berbagai tempat (misalnya saat pengguna menekan tombol "Buka Resep", "Ekspor PDF", dll). - Sub menu akan menampilkan semua log aktivitas.
Mau saya bikin juga versi pakai SQLite (riwayat.db) biar lebih rapi kalau datanya sudah banyak, atau cukup pakai JSON dulu?
File sub_menu_riwayat_penggunaan.py ada disimpan di folder /storage/emulated/0/AppJadi/SmartNutriChefAI/RiwayatAktivitas/
Lalu file menu_riwayat_aktivitas.py sudah saya buat berikut ini:
Menu Riwayat Aktivitas
impor tkinter sebagai tk
dari tkinter impor ttk
dari RiwayatAktivitas.sub_menu_riwayat_penggunaan import sub_menu_riwayat_penggunaan
def show_menu_riwayat_aktivitas(root_frame):
from menu_utama import tampilkan_halaman_utama # import lokal agar aman
# Bersihkan frame
for widget in root_frame.winfo_children():
widget.destroy()
# Judul
label_title = tk.Label(root_frame, text="Riwayat Aktivitas", font=("Arial", 16, "bold"), bg="light grey")
label_title.pack(pady=10)
# Submenu tombol
submenus = [
("Lihat Riwayat Penggunaan", lambda: sub_menu_riwayat_penggunaan(root_frame))
]
for submenu in submenus:
btn = tk.Button(root_frame, text=submenu, font=("Arial", 10), width=40, height=2, bg="light blue", fg="dark green")
btn.pack(pady=5)
# Tombol kembali
tombol_kembali = tk.Button(
root_frame,
text="Kembali ke Menu Utama",
font=("Arial", 12),
bg="#d9534f",
fg="white",
command=lambda: tampilkan_halaman_utama(root_frame)
)
tombol_kembali.pack(pady=30)
Oke 👍, saya lihat kode kamu di menu_riwayat_aktivitas.pyada beberapa hal yang membuat tombol "Lihat Riwayat Penggunaan" tidak jalan :
- Kesalahan passing submenu
Di sini:
for submenu in submenus:
btn = tk.Button(root_frame, text=submenu, font=("Arial", 10), width=40, height=2, bg="light blue", fg="dark green")
btn.pack(pady=5)
submenu masih berupa tuple ("Lihat Riwayat Penggunaan", lambda: sub_menu_riwayat_penggunaan(root_frame)),
jadi text=submenu salah → harus submenu[0],
dan command=submenu[1].
sub_menu_riwayat_penggunaan butuh go_back parameter
Dari kode saya sebelumnya, fungsi sub_menu_riwayat_penggunaan punya parameter go_back.
Jadi ketika dipanggil dari menu_riwayat_aktivitas.py, kita perlu passing tombol kembali yang akan memanggil show_menu_riwayat_aktivitas lagi.
✅ Perbaikan menu_riwayat_aktivitas.py
# Menu Riwayat Aktivitas
import tkinter as tk
from tkinter import ttk
from RiwayatAktivitas.sub_menu_riwayat_penggunaan import sub_menu_riwayat_penggunaan
def show_menu_riwayat_aktivitas(root_frame):
from menu_utama import tampilkan_halaman_utama # import lokal agar aman
# Bersihkan frame
for widget in root_frame.winfo_children():
widget.destroy()
# Judul
label_title = tk.Label(
root_frame, text="Riwayat Aktivitas",
font=("Arial", 16, "bold"), bg="light grey"
)
label_title.pack(pady=10)
# Submenu tombol
submenus = [
("Lihat Riwayat Penggunaan",
lambda: sub_menu_riwayat_penggunaan(
root_frame,
lambda: show_menu_riwayat_aktivitas(root_frame) # fungsi kembali
))
]
for title, cmd in submenus:
btn = tk.Button(
root_frame, text=title,
font=("Arial", 10), width=40, height=2,
bg="light blue", fg="dark green",
command=cmd
)
btn.pack(pady=5)
# Tombol kembali ke menu utama
tombol_kembali = tk.Button(
root_frame,
text="Kembali ke Menu Utama",
font=("Arial", 12),
bg="#d9534f",
fg="white",
command=lambda: tampilkan_halaman_utama(root_frame)
)
tombol_kembali.pack(pady=30)
📌 Dengan perbaikan ini:
- Tombol "Lihat Riwayat Penggunaan" akan membuka sub menu.
- Sub menu punya tombol "⬅ Kembali" → balik ke
show_menu_riwayat_aktivitas.
- Dari
Riwayat Aktivitas, user bisa klik "Kembali ke Menu Utama".
Mau saya bikinkan juga integrasi pencatatan aktivitas otomatis (misalnya kalau user buka resep → langsung tercatat di riwayat.json), biar sub menu ini benar-benar ada isinya?
Bersihkan frame, karena ketika tombol "Lihat Riwayat Penggunaan" ditekan maka konten menumpuk di bawah tombol.
Benar 👍
Kalau tidak dibersihkan, isinya akan menumpuk di bawah tombol menu.sub_menu_riwayat_penggunaan(root_frame)
Untuk mengatasinya, lakukan pembersihan frame (destroy kids) sebelum memanggil fungsi sub menu.
Berikut perbaikannya:
# Menu Riwayat Aktivitas
import tkinter as tk
from tkinter import ttk
from RiwayatAktivitas.sub_menu_riwayat_penggunaan import sub_menu_riwayat_penggunaan
def show_menu_riwayat_aktivitas(root_frame):
from menu_utama import tampilkan_halaman_utama # import lokal agar aman
# Bersihkan frame utama
for widget in root_frame.winfo_children():
widget.destroy()
# Judul
label_title = tk.Label(
root_frame,
text="Riwayat Aktivitas",
font=("Arial", 16, "bold"),
bg="light grey"
)
label_title.pack(pady=10)
# Fungsi wrapper agar frame dibersihkan sebelum memanggil sub menu
def open_submenu(func):
for widget in root_frame.winfo_children():
widget.destroy()
func(root_frame)
# Submenu tombol
submenus = [
("Lihat Riwayat Penggunaan", lambda: open_submenu(sub_menu_riwayat_penggunaan)),
]
for text, command in submenus:
btn = tk.Button(
root_frame,
text=text,
font=("Arial", 10),
width=40,
height=2,
bg="light blue",
fg="dark green",
command=command
)
btn.pack(pady=5)
# Tombol kembali
tombol_kembali = tk.Button(
root_frame,
text="Kembali ke Menu Utama",
font=("Arial", 12),
bg="#d9534f",
fg="white",
command=lambda: tampilkan_halaman_utama(root_frame)
)
tombol_kembali.pack(pady=30)
📌 Perubahan utama:
- Ditambahkan fungsinya
open_submenu(func)supaya frame dibersihkan dulu sebelum memanggil sub menu. - Di submenu loop:
for text, command in submenus:supaya label tombol benar, bukan tuple.
Mau saya bikin juga file template dasar sub_menu_riwayat_penggunaan.py biar langsung nyambung ke sini?
Muncul error:
Exception in Tkinter callback
Traceback (most recent call last):
File "/data/user/0/ru.iiec.pydroid3/files/aarch64-linux-android/lib/python3.11/tkinter/ init .py", baris 1948, dalam panggilan
return self.func(*args)
^^^^^^^^^^^^^^^^^
File "/storage/emulated/0/AppJadi/SmartNutriChefAI/menu_riwayat_aktivitas.py", baris 31, dalam panggilan
("Lihat Riwayat Penggunaan", lambda: open_submenu(sub_menu_riwayat_penggunaan)),
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/storage/emulated/0/AppJadi/SmartNutriChefAI/menu_riwayat_aktivitas.py", baris 27, di open_submenu
func(root_frame)
TypeError: sub_menu_riwayat_penggunaan() tidak ada 1 argumen posisi yang diperlukan: 'go_back'
Nah, jelas errornya 👌
Fungsinya sub_menu_riwayat_penggunaanternyata butuh dua argumen :
root_framego_back
Contoh pola umumnya biasanya seperti ini:
def sub_menu_riwayat_penggunaan(root_frame, go_back):
# isi konten sub menu
...
tk.Button(root_frame, text="Kembali", command=go_back).pack()
Jadi waktu dipanggil dari menu_riwayat_aktivitas.py , kita harus kasih argumen go_back.
Solusinya: definisikan go_backsupaya kembali lagi ke menu utama Riwayat Aktivitas.
👉 Perbaikan kodemenu_riwayat_aktivitas.py :
# Menu Riwayat Aktivitas
import tkinter as tk
from tkinter import ttk
from RiwayatAktivitas.sub_menu_riwayat_penggunaan import sub_menu_riwayat_penggunaan
def show_menu_riwayat_aktivitas(root_frame):
from menu_utama import tampilkan_halaman_utama # import lokal agar aman
# Bersihkan frame utama
for widget in root_frame.winfo_children():
widget.destroy()
# Judul
label_title = tk.Label(
root_frame,
text="Riwayat Aktivitas",
font=("Arial", 16, "bold"),
bg="light grey"
)
label_title.pack(pady=10)
# Fungsi wrapper agar frame dibersihkan sebelum memanggil sub menu
def open_submenu(func):
for widget in root_frame.winfo_children():
widget.destroy()
func(root_frame, lambda: show_menu_riwayat_aktivitas(root_frame))
# kirim go_back → kembali ke menu riwayat
# Submenu tombol
submenus = [
("Lihat Riwayat Penggunaan", lambda: open_submenu(sub_menu_riwayat_penggunaan)),
]
for text, command in submenus:
btn = tk.Button(
root_frame,
text=text,
font=("Arial", 10),
width=40,
height=2,
bg="light blue",
fg="dark green",
command=command
)
btn.pack(pady=5)
# Tombol kembali ke menu utama
tombol_kembali = tk.Button(
root_frame,
text="Kembali ke Menu Utama",
font=("Arial", 12),
bg="#d9534f",
fg="white",
command=lambda: tampilkan_halaman_utama(root_frame)
)
tombol_kembali.pack(pady=30)
📌 Intinya:
- Sekarang
sub_menu_riwayat_penggunaanakan dapat 2 argumen (root_frame,go_back). go_backdiisi denganlambda: show_menu_riwayat_aktivitas(root_frame)supaya kembali ke menu riwayat.
Mau saya bikin juga contoh sub_menu_riwayat_penggunaan.pyminimal (tampilan sederhana + tombol kembali) biar langsung nyambung?
Bantu buat tombol "Kembali" letaknya di baris berikutnya setelah baris tombol "Refresh".
Lalu sebaiknya data riwayat penggunaan disimpan di database pakai SQLite dengan path /storage/emulated/0/AppJadi/SmartNutriChefAI/Database/RiwayatAktivitas/
Berikut ini file sub_menu_riwayat_penggunaan.py:
import tkinter as tk
from tkinter import ttk, messagebox
import json
import os
from datetime import datetime
RIWAYAT_FILE = "riwayat.json"
def catat_aktivitas(jenis, nama_file="", keterangan=""):
"""Kata aktivitas ke file JSON"""
log = {
waktu": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
"jenis": jenis,
"file": nama_file,
"ket": keterangan
}
if os.path.exists(RIWAYAT_FILE):
with open(RIWAYAT_FILE, "r", coding="utf-8") as f:
data = json.beban(f)
lain:
data = []
data.append(log)
with open(RIWAYAT_FILE, "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent2)
def sub_menu_riwayat_penggunaan(root_frame, go_back):
"""Tampilan sub menu Lihat Riwayat Penggunaan"""
frame_content = tk.Frame(root_frame)
frame_content.pack(fill="both", expand=True)
# --- Judul ---
tk.Label(frame_content, text="Riwayat Penggunaan",
font=("Arial", 14, "bold")).pack(pady=10)
# --- Tabel Treeview ---
columns = ("waktu", "jenis", "file", "ket")
tree = ttk.Treeview(frame_content, columns=columns, show="headings", height=15)
tree.pack(fill="both", expand=True, padx=10, pady=6)
for col, text in zip(columns, ["Waktu", "Jenis Aktivitas", "Nama File/Resep", "Keterangan"]):
tree.heading(col, text=text)
tree.column(col, anchor="w", width=150)
# --- Tombol Aksi ---
action_frame = tk.Frame(frame_content)
action_frame.pack(fill="x", pady=8)
def load_data():
tree.delete(*tree.get_children())
if os.path.exists(RIWAYAT_FILE):
with open(RIWAYAT_FILE, "r", encoding="utf-8") as f:
data = json.load(f)
for log in data:
tree.insert("", "end", values=(log["waktu"], log["jenis"], log["file"], log["ket"]))
def export_riwayat():
if os.path.exists(RIWAYAT_FILE):
messagebox.showinfo("Export", f"Riwayat berhasil diexport ke {RIWAYAT_FILE}")
else:
messagebox.showwarning("Export", "Belum ada riwayat untuk diexport.")
def hapus_riwayat():
if messagebox.askyesno("Konfirmasi", "Hapus semua riwayat?"):
with open(RIWAYAT_FILE, "w", encoding="utf-8") as f:
json.dump([], f)
load_data()
ttk.Button(action_frame, text="Refresh", command=load_data).pack(side="left", padx=6)
ttk.Button(action_frame, text="Export Riwayat", command=export_riwayat).pack(side="left", padx=6)
ttk.Button(action_frame, text="Hapus Riwayat", command=hapus_riwayat).pack(side="left", padx=6)
ttk.Button(action_frame, text="⬅ Kembali", command=go_back).pack(side="right", padx=6)
# --- Load awal ---
load_data()
return frame_content
Oke 👍 saya pahami.
Saat ini sub_menu_riwayat_penggunaan.pymasih menyimpan riwayat ke file JSON , tapi kamu ingin mengubahnya supaya menggunakan database SQLite di path:
/storage/emulated/0/AppJadi/SmartNutriChefAI/Database/RiwayatAktivitas/riwayat.db
Sekaligus tombol "Kembali" harus tampil di baris baru, bukan sejajar dengan tombol lainnya.
Berikut revisinya:
import tkinter as tk
from tkinter import ttk, messagebox
import sqlite3, os
from datetime import datetime
# Lokasi database
DB_PATH = "/storage/emulated/0/AppJadi/SmartNutriChefAI/Database/RiwayatAktivitas/riwayat.db"
def init_db():
"""Inisialisasi database & tabel jika belum ada"""
os.makedirs(os.path.dirname(DB_PATH), exist_ok=True)
conn = sqlite3.connect(DB_PATH)
cur = conn.cursor()
cur.execute("""
CREATE TABLE IF NOT EXISTS riwayat (
id INTEGER PRIMARY KEY AUTOINCREMENT,
waktu TEXT,
jenis TEXT,
file TEXT,
ket TEXT
)
""")
conn.commit()
conn.close()
def catat_aktivitas(jenis, nama_file="", keterangan=""):
"""Catat aktivitas ke database SQLite"""
init_db()
conn = sqlite3.connect(DB_PATH)
cur = conn.cursor()
cur.execute("INSERT INTO riwayat (waktu, jenis, file, ket) VALUES (?, ?, ?, ?)",
(datetime.now().strftime("%Y-%m-%d %H:%M:%S"), jenis, nama_file, keterangan))
conn.commit()
conn.close()
def sub_menu_riwayat_penggunaan(root_frame, go_back):
"""Tampilan sub menu Lihat Riwayat Penggunaan"""
init_db()
frame_content = tk.Frame(root_frame)
frame_content.pack(fill="both", expand=True)
# --- Judul ---
tk.Label(frame_content, text="Riwayat Penggunaan",
font=("Arial", 14, "bold")).pack(pady=10)
# --- Tabel Treeview ---
columns = ("waktu", "jenis", "file", "ket")
tree = ttk.Treeview(frame_content, columns=columns, show="headings", height=15)
tree.pack(fill="both", expand=True, padx=10, pady=6)
for col, text in zip(columns, ["Waktu", "Jenis Aktivitas", "Nama File/Resep", "Keterangan"]):
tree.heading(col, text=text)
tree.column(col, anchor="w", width=150)
# --- Tombol Aksi (baris 1) ---
action_frame = tk.Frame(frame_content)
action_frame.pack(fill="x", pady=8)
def load_data():
tree.delete(*tree.get_children())
conn = sqlite3.connect(DB_PATH)
cur = conn.cursor()
cur.execute("SELECT waktu, jenis, file, ket FROM riwayat ORDER BY id DESC")
for row in cur.fetchall():
tree.insert("", "end", values=row)
conn.close()
def export_riwayat():
# Export ke file teks sederhana
conn = sqlite3.connect(DB_PATH)
cur = conn.cursor()
cur.execute("SELECT waktu, jenis, file, ket FROM riwayat ORDER BY id")
rows = cur.fetchall()
conn.close()
if rows:
export_path = os.path.join(os.path.dirname(DB_PATH), "riwayat_export.txt")
with open(export_path, "w", encoding="utf-8") as f:
for r in rows:
f.write(f"{r[0]} | {r[1]} | {r[2]} | {r[3]}\n")
messagebox.showinfo("Export", f"Riwayat berhasil diexport ke {export_path}")
else:
messagebox.showwarning("Export", "Belum ada riwayat untuk diexport.")
def hapus_riwayat():
if messagebox.askyesno("Konfirmasi", "Hapus semua riwayat?"):
conn = sqlite3.connect(DB_PATH)
cur = conn.cursor()
cur.execute("DELETE FROM riwayat")
conn.commit()
conn.close()
load_data()
ttk.Button(action_frame, text="Refresh", command=load_data).pack(side="left", padx=6)
ttk.Button(action_frame, text="Export Riwayat", command=export_riwayat).pack(side="left", padx=6)
ttk.Button(action_frame, text="Hapus Riwayat", command=hapus_riwayat).pack(side="left", padx=6)
# --- Tombol kembali di baris baru ---
back_frame = tk.Frame(frame_content)
back_frame.pack(fill="x", pady=8)
ttk.Button(back_frame, text="⬅ Kembali", command=go_back).pack(pady=5)
# --- Load awal ---
load_data()
return frame_content
🔹 Perubahan utama:
- Simpan data ke SQLite (bukan JSON).
- Path database otomatis dibuat jika folder belum ada.
- Tombol "Kembali" dipisahkan di frame
back_frame, sehingga muncul baris baru setelah tombol Refresh/Export/Hapus.
- Fungsi
export_riwayat buat file teks (riwayat_export.txt) agar mudah dicek.
Mau saya bikinkan juga contoh pencatatan aktivitas otomatis misalnya ketika user tekan tombol "Buka Resep" → langsung tersimpan ke tabel riwayat?
Apakah setiap aktivitas user akan otomatis tercatat di fitur ini, berikan saya contoh misalnya ketika user tekan tombol "Rekomendasi Resep MMAG" lalu tekan tombol "Resep MMAG Favorit Tetsimpan", Lalu memilih sebuah file/resep dan menekan tombol "Lihat Detail" untuk melihst isi file atau Resep tersebut, Lalu user menekan tombol "Tutup" dan "Kembali" untuk kembali ke Menu sebelumnya.
Betul sekali 👍, idenya fitur Riwayat Aktivitas ini adalah seperti “black box” aplikasi → setiap langkah penting user akan otomatis tercatat di database, sehingga bisa ditampilkan di menu Lihat Riwayat Penggunaan.
Mari saya ilustrasikan contoh alurnya:
📌 Skenario Aktivitas User
-
User masuk menu Rekomendasi Resep MMAG
→ Aplikasi catat ke tabel riwayat:
waktu: 2025-09-17 10:12:01
jenis: Navigasi Menu
file: -
ket: Membuka menu Rekomendasi Resep MMAG
-
User klik tombol "Resep MMAG Favorit Tersimpan"
→ Tercatat:
waktu: 2025-09-17 10:12:20
jenis: Navigasi Submenu
file: -
ket: Membuka submenu Resep MMAG Favorit Tersimpan
-
User memilih sebuah file resep dan tekan "Lihat Detail"
→ Misalnya file bernama Ayam_Bakar.json
waktu: 2025-09-17 10:12:45
jenis: Buka Resep
file: Ayam_Bakar.json
ket: Melihat detail resep
-
User tekan tombol "Tutup" (popup resep tertutup)
waktu: 2025-09-17 10:13:10
jenis: Tutup Resep
file: Ayam_Bakar.json
ket: Menutup tampilan detail resep
-
User tekan tombol "Kembali" untuk kembali ke menu sebelumnya
waktu: 2025-09-17 10:13:25
jenis: Navigasi Kembali
file: -
ket: Kembali ke menu sebelumnya
📌 Contoh Kode Pencatatan
Di setiap event penting cukup panggil fungsi catat_aktivitas(...).
Misalnya:
from RiwayatAktivitas.sub_menu_riwayat_penggunaan import catat_aktivitas
# Ketika user masuk menu Rekomendasi Resep
def show_menu_rekomendasi(root_frame):
catat_aktivitas("Navigasi Menu", keterangan="Membuka menu Rekomendasi Resep MMAG")
...
# Ketika user pilih submenu Favorit
def buka_favorit(root_frame):
catat_aktivitas("Navigasi Submenu", keterangan="Membuka submenu Resep MMAG Favorit Tersimpan")
...
# Ketika user buka resep
def buka_resep(filepath):
nama_file = os.path.basename(filepath)
catat_aktivitas("Buka Resep", nama_file, "Melihat detail resep")
...
# Ketika user tutup resep
def tutup_resep(filepath, win):
nama_file = os.path.basename(filepath)
catat_aktivitas("Tutup Resep", nama_file, "Menutup tampilan detail resep")
win.destroy()
# Ketika user kembali ke menu utama
def kembali_ke_menu(root_frame):
catat_aktivitas("Navigasi Kembali", keterangan="Kembali ke menu sebelumnya")
tampilkan_halaman_utama(root_frame)
👉 Dengan cara ini, setiap aktivitas yang user lakukan (navigasi, buka file, simpan, edit, hapus, share, dll) akan tercatat otomatis di database SQLite.
Mau saya bikinkan template decorator (@log_activity) supaya kamu tinggal tempel di atas fungsi event (misalnya @log_activity("Buka Resep")) tanpa harus nulis catat_aktivitas() manual di setiap fungsi?
Mau saya bikinkan juga contoh sub_menu_riwayat_penggunaan.py yang langsung membaca dari riwayat.db dan menampilkan daftar aktivitas user ke layar (listbox/table)?
kamu mau ketika user simpan hasil modifikasi resep ke file, otomatis juga tercatat di tabel riwayat.
Apakah mau saya lanjut bikinkan juga sub_menu_riwayat_penggunaan.py (UI untuk menampilkan daftar riwayat ini dengan Treeview) supaya user bisa lihat semua aktivitas langsung dari aplikasi?
Mau saya tambahkan juga pencatatan otomatis ke Riwayat Aktivitas setiap kali user simpan hasil Gemini/AI (seperti di catat_aktivitas) biar konsisten dengan menu lain?
Mau saya sekalian tambahkan juga pencatatan otomatis ke Riwayat Aktivitas (catat_aktivitas) setiap kali user simpan hasil Gemini/AI?
Comments
Post a Comment