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
