Feb-21-2024, 10:54 AM
Hi,
I'm really beginner with TKinter/Python. I followed a TKinter training and I'm now trying to develop my 1st application.
I'm facing 2 challenges where I would need some help.
Some background:
I'd like developing a form (2 windows) where user can either enter new information's or update those information's. Information are saved in a SQLite database.
The 1st windows contains few widgets and present a summary of database content. User can either launch 2nd window for new entry or launch 2nd window to update a record.
Here is the design I'm looking at for my master window:
![[Image: uleh.png]](https://zupimages.net/up/24/08/uleh.png)
The 2 challenges I'm encountering:
1. Window resize
If I resize my window, I'm able to extend all my content horizontally:
![[Image: k04h.png]](https://zupimages.net/up/24/08/k04h.png)
2. Navigation in the table presenting database extract
I've no control on the frame height presenting the database extract (frame_summary) => if database content is big, I see only first results.
I'd like this frame height to be adapted to record content (or to have its own vertical scrollbar)
![[Image: 0otg.png]](https://zupimages.net/up/24/08/0otg.png)
Here my code.
Regards,
Fab
I'm really beginner with TKinter/Python. I followed a TKinter training and I'm now trying to develop my 1st application.
I'm facing 2 challenges where I would need some help.
Some background:
I'd like developing a form (2 windows) where user can either enter new information's or update those information's. Information are saved in a SQLite database.
The 1st windows contains few widgets and present a summary of database content. User can either launch 2nd window for new entry or launch 2nd window to update a record.
Here is the design I'm looking at for my master window:
![[Image: uleh.png]](https://zupimages.net/up/24/08/uleh.png)
The 2 challenges I'm encountering:
1. Window resize
If I resize my window, I'm able to extend all my content horizontally:
![[Image: k04h.png]](https://zupimages.net/up/24/08/k04h.png)
2. Navigation in the table presenting database extract
I've no control on the frame height presenting the database extract (frame_summary) => if database content is big, I see only first results.
I'd like this frame height to be adapted to record content (or to have its own vertical scrollbar)
![[Image: 0otg.png]](https://zupimages.net/up/24/08/0otg.png)
Here my code.
import tkinter as tk from tkinter import ttk, messagebox import sqlite3 import re from datetime import datetime class FabApplication: def __init__(self, master): self.master = master self.master.title("Summary") #1 Canvas creation which will contains all children from master windows (required to add scrollbar) self.canvas_summary = tk.Canvas(self.master) self.canvas_summary.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) #1.1 Créer une barre de défilement vertical scrollbar_summary = tk.Scrollbar(self.master, orient=tk.VERTICAL, command=self.canvas_summary.yview) scrollbar_summary.pack(side=tk.RIGHT, fill=tk.Y) # Configurer le canvas pour utiliser la barre de défilement self.canvas_summary.config(yscrollcommand=scrollbar_summary.set) #1.2 Now that scrollbar is added to a canvas, creation of a global frame for all children self.frame_containermain = tk.Frame(self.canvas_summary) self.canvas_summary.create_window((0, 0), window=self.frame_containermain, anchor=tk.NW) #1.2.1 à 1.2.3. Creation of the 3 sub-frames into frame_containermain self.frame_logos = tk.Frame(self.frame_containermain, bg="light grey", relief=tk.GROOVE) self.frame_logos.pack(fill=tk.X, padx=10, pady=10) self.frame_user_selection = tk.Frame(self.frame_containermain, bg="light grey", relief=tk.GROOVE) self.frame_user_selection.pack(fill=tk.X, padx=10, pady=10) self.frame_summary = tk.Frame(self.frame_containermain, bg="light grey", relief=tk.GROOVE) self.frame_summary.pack(fill=tk.BOTH, expand=True, padx=10, pady=10) #1.2.1 Here I add my Label widgets (pictures) in the frame: frame_logos #1.2.2 Here I add my widgets (Label, Combobox, Entry) in the frame:self.frame_user_selection #1.2.3 Creation ofthe "table" where data's from SQlite will be presented (into frame_summary) self.treeview_summary = ttk.Treeview(self.frame_summary, columns=("Initiative ID", "Owner", "Initiative name", "Total Score", "Decision")) self.treeview_summary.heading("#0", text="", anchor=tk.W) self.treeview_summary.heading("Initiative ID", text="Initiative ID", anchor=tk.W) self.treeview_summary.heading("Owner", text="Owner", anchor=tk.W) self.treeview_summary.heading("Initiative name", text="Initiative name", anchor=tk.W) self.treeview_summary.heading("Total Score", text="Total Score", anchor=tk.W) self.treeview_summary.heading("Decision", text="Decision", anchor=tk.W) self.treeview_summary.pack(fill=tk.BOTH, expand=True) #Load data's from SQLite self.load_data() # Link data loading function to event window resize self.master.bind("<Configure>", self.on_window_resize) # Config canvas canvas_summary to adapt size to content self.master.bind("<Configure>", self.on_configure2) # Link central mouse wheel event to vertical scroll self.master.bind_all("<MouseWheel>", self.on_mousewheel2) # Link lateral mouse wheel event to vertical scroll self.master.bind("<Shift-MouseWheel>", self.on_horizontal_scroll2) def load_data(self, event=None):# Method to load database info (including user filter) # Connexion to SQLite database conn = sqlite3.connect("F4G database.db") cursor = conn.cursor() # Retrieve user filter filter_value = self.combo_filter.get() # Retrieve datas based on user filter if filter_value == "": cursor.execute("SELECT InitiativeID, Owner, InitiativeName, TotalScore, Decision FROM DetailsTracker") else: cursor.execute("SELECT InitiativeID, Owner, InitiativeName, TotalScore, Decision FROM DetailsTracker WHERE Decision=?", (filter_value,)) # Delete old table entries for row in self.treeview_summary.get_children(): self.treeview_summary.delete(row) # Add new data's into table for row in cursor.fetchall(): self.treeview_summary.insert("", "end", values=row) # Close database connexion cursor.close() conn.close() def on_window_resize(self, event): # Redéfinir les largeurs des colonnes du tableau principal lors du redimensionnement de la fenêtre total_width = self.frame_summary.winfo_width() self.treeview_summary.column("#0", width=int(total_width * 0.01)) self.treeview_summary.column("Initiative ID", width=int(total_width * 0.09)) self.treeview_summary.column("Owner", width=int(total_width * 0.2)) self.treeview_summary.column("Initiative name", width=int(total_width * 0.5)) self.treeview_summary.column("Total Score", width=int(total_width * 0.1)) self.treeview_summary.column("Decision", width=int(total_width * 0.1)) # Configurer le canvas canvas_summary pour s'adapter à la taille de son contenu def on_configure2(self, event): self.canvas_summary.configure(scrollregion=self.canvas_summary.bbox("all")) # Fonction pour gérer le défilement dans canvas_summary avec la molette centrale def on_mousewheel2(self, event): # Récupérer la direction du défilement (1 pour vers le haut, -1 pour vers le bas) direction = -1 if event.delta < 0 else 1 # Effectuer le défilement self.canvas_summary.yview_scroll(direction, "units") # Fonction pour gérer le défilement horizontal avec la molette latérale dans canvas_summary def on_horizontal_scroll2(self, event): # Récupérer la direction du défilement (1 pour vers la gauche, -1 pour vers la droite) direction = 1 if event.delta > 0 else -1 # Effectuer le défilement self.canvas_summary.xview_scroll(direction, "units")Would someone see how to solve my issues?
Regards,
Fab