Avatar billede molehonter Seniormester
Oprettet i dag kl. 08:20 Der er 1 kommentar

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()
Avatar billede erikjacobsen Ekspert
Skrevet for 21 minutter siden #1
Jeg leger lidt med dit program. Jeg synes at "aktiv"-checkboxen virker som den skal.

Kan du beskrive hvordan den "ikke virker korrekt" ?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester