Checkbox driller
Jeg arbejder på en form, hvor jeg har en checkbox "aktiv" der ikke virker korrekt feltet bliver læst korrekt ind i treeveiw. Men feltet i formen bliver ikke opdateret, samt at feltet "aktiv" ændring ligeledes ikke gemt i sqlete tabelen. .se koden herunder med tilhørende tabel struktur..
import tkinter as tk
from tkinter import ttk, messagebox
import sqlite3
import os
from env_piktogram import env_db_folder, env_database
DB_FOLDER = env_db_folder()
DB_PATH = os.path.join(DB_FOLDER, env_database())
def opret_db():
conn = sqlite3.connect(DB_PATH)
c = conn.cursor()
c.execute("""
CREATE TABLE IF NOT EXISTS Pictogrammer (
id INTEGER PRIMARY KEY AUTOINCREMENT,
dokid TEXT,
rekv TEXT,
navn TEXT,
html TEXT,
ejer TEXT,
note TEXT,
aktiv BOOLEAN DEFAULT 1,
replaceoff INTEGER,
copyoff TEXT,
dokrev INTEGER,
oprettet DATETIME DEFAULT CURRENT_TIMESTAMP
)
""")
conn.commit()
conn.close()
class PiktogramForm(tk.Tk):
def __init__(self):
super().__init__()
self.title("Piktogram Stamdata")
self.geometry("900x500")
self.opret_widgets()
self.hent_data()
def opret_widgets(self):
# --- Søgning ---
søg_frame = tk.Frame(self)
søg_frame.pack(fill="x")
tk.Label(søg_frame, text="Fritekst søgning:").pack(side="left")
self.søg_entry = tk.Entry(søg_frame)
self.søg_entry.pack(side="left", padx=5)
# Tre-tilstands søgefilter
self.aktiv_søg_var = tk.IntVar(value=0) # 0=Alle, 1=Aktive, 2=Inaktive
tk.Radiobutton(søg_frame, text="Alle", variable=self.aktiv_søg_var, value=0).pack(side="left")
tk.Radiobutton(søg_frame, text="Aktive", variable=self.aktiv_søg_var, value=1).pack(side="left")
tk.Radiobutton(søg_frame, text="Inaktive", variable=self.aktiv_søg_var, value=2).pack(side="left")
tk.Button(søg_frame, text="Søg", command=self.hent_data).pack(side="left", padx=5)
# --- Indhold ---
indhold = tk.Frame(self)
indhold.pack(fill="both", expand=True)
# Treeview
self.tree = ttk.Treeview(indhold, columns=("Navn", "ID", "aktiv"), show="headings")
self.tree.heading("Navn", text="Navn")
self.tree.heading("ID", text="ID")
self.tree.heading("aktiv", text="Aktiv")
self.tree.bind("<<TreeviewSelect>>", self.vis_post)
self.tree.pack(side="left", fill="y")
# Formularfelter
felter = tk.Frame(indhold)
felter.pack(side="left", fill="both", expand=True, padx=10)
self.entries = {}
for felt in ["dokid", "rekv", "navn", "ejer", "replaceoff", "copyoff", "dokrev"]:
tk.Label(felter, text=felt).pack()
entry = tk.Entry(felter)
entry.pack(fill="x")
self.entries[felt] = entry
# Checkbox for aktiv i formular
self.aktiv_var = tk.BooleanVar(value=True)
tk.Checkbutton(
felter,
text="Aktiv",
variable=self.aktiv_var,
onvalue=True,
offvalue=False
).pack(pady=5)
self.aktiv_var.set(True)
tk.Label(felter, text="Note").pack()
self.note = tk.Text(felter, height=6)
self.note.pack(fill="both", expand=True)
# Knapper
knapramme = tk.Frame(felter)
knapramme.pack(pady=5)
tk.Button(knapramme, text="Gem", command=self.gem_post).pack(side="left", padx=5)
tk.Button(knapramme, text="Slet", command=self.slet_post).pack(side="left")
def hent_data(self):
søg = self.søg_entry.get()
tilstand = self.aktiv_søg_var.get()
conn = sqlite3.connect(DB_PATH)
c = conn.cursor()
query = "SELECT id, navn, aktiv FROM Pictogrammer WHERE 1=1"
params = []
if søg:
query += " AND (navn LIKE ? OR rekv LIKE ? OR dokid LIKE ?)"
søg_wild = f"%{søg}%"
params += [søg_wild, søg_wild, søg_wild]
if tilstand == 1:
query += " AND aktiv = 1"
elif tilstand == 2:
query += " AND aktiv = 0"
c.execute(query, params)
rows = c.fetchall()
conn.close()
for i in self.tree.get_children():
self.tree.delete(i)
for row in rows:
aktiv_visning = "Ja" if row[2] else "Nej"
self.tree.insert("", "end", values=(row[1], row[0], aktiv_visning))
def vis_post(self, event):
selected = self.tree.selection()
if not selected:
return
id_val = self.tree.item(selected[0])["values"][1]
valgt = self.tree.focus()
if not valgt:
return
id_val = self.tree.item(valgt)["values"][1]
conn = sqlite3.connect(DB_PATH)
c = conn.cursor()
c.execute("SELECT * FROM Pictogrammer WHERE id=?", (id_val,))
post = c.fetchone()
conn.close()
if not post:
return
kolonner = [
"id","dokid","rekv","navn","html","oprettet",
"ejer","aktiv","replaceoff","copyoff","note","dokrev"
]
data = dict(zip(kolonner, post))
for felt, entry in self.entries.items():
entry.delete(0, tk.END)
entry.insert(0, data.get(felt, ""))
self.note.delete("1.0", tk.END)
self.note.insert("1.0", data.get("note", ""))
self.aktiv_var.set(bool(data.get("aktiv") or 0))
self.valgt_id = data["id"]
aktiv_db = data.get("aktiv", 0)
print(f"[DEBUG] aktiv fra DB = {aktiv_db!r} (type: {type(aktiv_db)})")
self.aktiv_var.set(bool(aktiv_db))
def gem_post(self):
data = {felt: entry.get() for felt, entry in self.entries.items()}
note = self.note.get("1.0", tk.END).strip()
aktiv = 1 if self.aktiv_var.get() else 0
conn = sqlite3.connect(DB_PATH)
c = conn.cursor()
if hasattr(self, "valgt_id"):
c.execute("""
UPDATE Pictogrammer
SET dokid=?, rekv=?, navn=?, ejer=?, replaceoff=?, copyoff=?, dokrev=?, note=?, aktiv=?
WHERE id=?
""", (
data["dokid"], data["rekv"], data["navn"],
data["ejer"], data["replaceoff"], data["copyoff"],
data["dokrev"], note, aktiv, self.valgt_id
))
else:
c.execute("""
INSERT INTO Pictogrammer
(dokid, rekv, navn, ejer, replaceoff, copyoff, dokrev, note, aktiv)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
""", (
data["dokid"], data["rekv"], data["navn"],
data["ejer"], data["replaceoff"], data["copyoff"],
data["dokrev"], note, aktiv
))
self.valgt_id = c.lastrowid
conn.commit()
conn.close()
print("Gemmer aktiv:", self.aktiv_var.get())
self.hent_data()
self.tøm_felter()
if hasattr(self, "valgt_id"):
del self.valgt_id
def slet_post(self):
if not hasattr(self, "valgt_id"):
return
if messagebox.askyesno("Bekræft", "Vil du slette posten?"):
conn = sqlite3.connect(DB_PATH)
c = conn.cursor()
c.execute("DELETE FROM Pictogrammer WHERE id=?", (self.valgt_id,))
conn.commit()
conn.close()
self.hent_data()
self.tøm_felter()
def tøm_felter(self):
for entry in self.entries.values():
entry.delete(0, tk.END)
self.note.delete("1.0", tk.END)
self.aktiv_var.set(True)
if hasattr(self, "valgt_id"):
del self.valgt_id
def PiktogramData():
app = PiktogramForm()
app.mainloop()
if __name__ == "__main__":
opret_db()
PiktogramData()