GUI programming

Messages : 0

Inscription : 29 avr. 2020 11:42

Profil de l'utilisateur : Élève de lycée

GUI programming

Message par cedric12 » 21 mai 2020 14:52

Ce programme contient du code frontend et backend pour une application de librairie avec une interface utilisateur graphique simple (GUI) construite avec la bibliothèque Tkinter sur spider (python)
le code backend dabord (principale)

Code : Tout sélectionner

import sqlite3
class Database:
    def __init__(self,db):
        self.conn = sqlite3.connect(db)
        self.cur = self.conn.cursor()
        self.cur.execute("CREATE TABLE IF NOT EXISTS book (id INTEGER PRIMARY KEY, title TEXT, "
                    "author TEXT, year INTEGER, isbn INTEGER)")
        self.conn.commit()

    def insert(self,title, author, year, isbn):
        self.cur.execute("INSERT INTO book VALUES(NULL,?,?,?,?)", (title,author,year,isbn))
        self.conn.commit()

    def view(self):
        self.cur.execute("SELECT * FROM book")
        rows = self.cur.fetchall()

        return rows

    def search(self,title="", author="", year="", isbn=""):
        self.cur.execute("SELECT * FROM book WHERE title = ? OR author = ? OR year = ? "
                    "OR isbn = ?", (title, author, year, isbn))
        rows = self.cur.fetchall()
        #conn.close()
        return rows

    def delete(self,id):
        self.cur.execute("DELETE FROM book WHERE id = ?", (id,))
        self.conn.commit()
        #conn.close()

    def update(self,id, title, author, year, isbn):
        self.cur.execute("UPDATE book SET title = ?, author = ?, year = ?, isbn = ? WHERE id = ?", (title, author, year, isbn, id))
        self.conn.commit()
-------------------------------------------le code frontend--------------------------------------------------

Code : Tout sélectionner

from tkinter import *
from backend import  Database

database = Database("books.db")

class Window(object):  #creation d'une classe window
    def __init__(self,window): # initialisation de l'objet permettant à ce dernier de recevoir l'argument window lors de l'instanciation
        self.window = window   
        self.window.wm_title("The Book Store") #definition du titre de la fenetre window

        l1 = Label(window, text="Title",fg='red',bg='black') 
        l1.grid(row=0, column=0)

        l2 = Label(window, text="Author",fg='red',bg='black')
        l2.grid(row=0, column=2)

        l3 = Label(window, text="Year",fg='red',bg='black')
        l3.grid(row=1, column=0)

        l4 = Label(window, text="ISBN",fg='red',bg='black')
        l4.grid(row=1, column=2)

        self.title_text = StringVar()
        self.e1 = Entry(window, textvariable=self.title_text)
        self.e1.grid(row=0, column=1)

        self.author_text = StringVar()
        self.e2 = Entry(window, textvariable=self.author_text)
        self.e2.grid(row=0, column=3)

        self.year_text = StringVar()
        self.e3 = Entry(window, textvariable=self.year_text)
        self.e3.grid(row=1, column=1)

        self.ISBN_text = StringVar()
        self.e4= Entry(window, textvariable=self.ISBN_text)
        self.e4.grid(row=1, column=3)

        self.list1 = Listbox(window, height=6, width=35)
        self.list1.grid(row=2, column=0, rowspan=6, columnspan=2)

        self.list1.bind('<<ListboxSelect>>', self.get_selected_row)

        # now we need to attach a scrollbar to the listbox, and the other direction,too
        sb1 = Scrollbar(window)
        sb1.grid(row=2, column=2, rowspan=6)
        self.list1.config(yscrollcommand=sb1.set)
        sb1.config(command=self.list1.yview)

        b1 = Button(window, text="View all", width=12, command=self.view_command)
        b1.grid(row=2, column=3)

        b2 = Button(window, text="Search entry", width=12, command=self.search_command)
        b2.grid(row=3, column=3)

        b3 = Button(window, text="Add entry", width=12, command=self.add_command)
        b3.grid(row=4, column=3)

        b4 = Button(window, text="Update selected", width=12, command=self.update_command)
        b4.grid(row=5, column=3)

        b5 = Button(window, text="Delete selected", width=12, command=self.delete_command)
        b5.grid(row=6, column=3)

        b6 = Button(window, text="delete all", width=12, command=window.destroy)
        b6.grid(row=7, column=3)
        
        b6 = Button(window, text="Close", width=12, command=self.delete_all_command)
        b6.grid(row=8, column=3)
        

    def get_selected_row(self,event):   #the "event" parameter is needed b/c we've binded this function to the listbox
        try:
            index = self.list1.curselection()[0]
            self.selected_tuple = self.list1.get(index)
            self.e1.delete(0,END)
            self.e1.insert(END,self.selected_tuple[1])
            self.e2.delete(0, END)
            self.e2.insert(END,self.selected_tuple[2])
            self.e3.delete(0, END)
            self.e3.insert(END,self.selected_tuple[3])
            self.e4.delete(0, END)
            self.e4.insert(END,self.selected_tuple[4])
        except IndexError:
            pass                #in the case where the listbox is empty, the code will not execute

    def view_command(self):
        self.list1.delete(0, END)  # make sure we've cleared all entries in the listbox every time we press the View all button
        for row in database.view():
            self.list1.insert(END, row)

    def search_command(self):
        self.list1.delete(0, END)
        for row in database.search(self.title_text.get(), self.author_text.get(), self.year_text.get(), self.ISBN_text.get()):
            self.list1.insert(END, row)

    def add_command(self):
        database.insert(self.title_text.get(), self.author_text.get(), self.year_text.get(), self.ISBN_text.get())
        self.list1.delete(0, END)
        self.list1.insert(END, (self.title_text.get(), self.author_text.get(), self.year_text.get(), self.ISBN_text.get()))

    def delete_command(self):
        database.delete(self.selected_tuple[0])
        self.view_command()

    def update_command(self):
        #be careful for the next line ---> we are updating using the texts in the entries, not the selected tuple
        database.update(self.selected_tuple[0],self.title_text.get(), self.author_text.get(), self.year_text.get(), self.ISBN_text.get())
        self.view_command()
        
    def delete_all_command(self):
       self.list1.delete(0, END)         
       for row in database.view():
            self.list1.drop(END, row)
            self.view_command
        
        

#code for the GUI (front end)
window = Tk()
Window(window)

window.mainloop()

Messages : 0

Inscription : 29 avr. 2020 11:42

Profil de l'utilisateur : Élève de lycée

Re: GUI programming

Message par cedric12 » 21 mai 2020 14:54

ce matin j'ai essayé d'ajouter une nouvelle commande (delete_all_command) qui fonctionne de la même manière que le close.
je voudrai que cette commande supprime toute la librairie sans pour autant fermé la fenêtre
si quelqu'un peut m'aider :) merci d'avance
et si vous avez d'autres améliorations à me proposer :) je suis partant

YS1

Messages : 13

Inscription : 06 févr. 2005 11:50

Profil de l'utilisateur : Enseignant (CPGE)

Re: GUI programming

Message par YS1 » 21 mai 2020 16:50

D'une part, l'exposition de votre problème est pour le moins confuse. Il convient d'isoler précisément ce qui fait difficulté dans votre programme et de décrire précisément le but que vous visez.

Mais d'autre part, pour ce genre de question technique (et qui n'a aucun rapport avec les programmes d'informatique de prépa), vous aurez sans doute une audience plus large sur un site de programmation.

Répondre