Forum >> Programmazione Python >> Database >> Programma in Python con interfaccia locale

Pagina: 1

Buongiorno,
ho creato un codice che mischia l'interfaccia al database, però una volta partito il programma la connessione non avviene.




In allegato il codice

import tkinter as tk
import psycopg2

# Crea la finestra principale
root = tk.Tk()

# Crea una connessione a Postgres
conn = psycopg2.connect(
    host="localhost",
    user="postgres_user",
    password="postgres_password",
    database="postgres_database"
)

# Crea un frame per i campi di login
login_frame = tk.Frame(root)

# Crea i campi per l'username e la password
username_label = tk.Label(login_frame, text="Username:")
username_entry = tk.Entry(login_frame)
password_label = tk.Label(login_frame, text="Password:")
password_entry = tk.Entry(login_frame, show="*")

# Visualizza i campi per l'username e la password
username_label.grid(row=0, column=0)
username_entry.grid(row=0, column=1)
password_label.grid(row=1, column=0)
password_entry.grid(row=1, column=1)

# Crea il pulsante di login
login_button = tk.Button(
    login_frame,
    text="Login",
    command=lambda: login(
        username_entry.get(),
        password_entry.get()
    )
)

# Visualizza il pulsante di login
login_button.grid(row=2, column=1)

# Mostra il frame per i campi di login
login_frame.pack()

# Definisci la funzione di login
def login(username, password):
    # Esegui una query per verificare se l'username e la password sono corretti
    with conn:
        cur = conn.cursor()
        cur.execute(
            "SELECT COUNT(*) FROM users WHERE username = %s AND password = %s",
            (username, password)
        )
        count = cur.fetchone()0

    # Se l'username e la password sono corretti, esegui un'azione di successo
    if count == 1:
        login_frame.destroy()
        success_label = tk.Label(root, text="Login effettuato con successo")
        success_label.pack()
    # Altrimenti, visualizza un messaggio di errore
    else:
        error_label = tk.Label(root, text="Username o password non validi")
        error_label.pack()

# Avvia il loop dell'interfaccia grafica
root.mainloop()





Il problema Ti è dato, in primo luogo, dalla visibilità delle variabili, così come è strutturato il codice l'user non verrà msi loggato a PostgreSQL perché non avviene alcuna connessione, che definisci all'inizio del codice con gli equivoci parametri:

    user="postgres_user",
    password="postgres_password",
    database="postgres_database"
(Non ti da nessun errore sulla connessione?)


Dovresti strutturarti una funzione alla quale passi i parametri di login e Ti restituisca la connessione, da invocare al login per poi proseguire con le successive operazioni.




... disgiuntamente dal problema "connessione", suggerirei di approfondire gli aspetti di "Visibilità" e "scope" delle variabili in python, oltre che strutturarlo considerando le classi, così come è il codice si presta molto poco ad applicazioni appena più che elementari.
[Edit] integrato "user" nella citazione ... giacché ci sono aggiungo che i parametri di login inseriti dall'user non saranno mai visibili da "conn" tanto per questioni di visibilità quanto per questioni di posizione (si, anche la posizione del codice è significativa)


--- Ultima modifica di nuzzopippo in data 2022-12-15 11:45:10 ---

--- Ultima modifica di nuzzopippo in data 2022-12-15 11:45:43 ---
Fatti non foste a viver come bruti...
Il problema Ti è dato, in primo luogo, dalla visibilità delle variabili, così come è strutturato il codice l'user non verrà msi loggato a PostgreSQL perché non avviene alcuna connessione, che definisci all'inizio del codice con gli equivoci parametri:

    user="postgres_user",
    password="postgres_password",
    database="postgres_database"
(Non ti da nessun errore sulla connessione?)


Dovresti strutturarti una funzione alla quale passi i parametri di login e Ti restituisca la connessione, da invocare al login per poi proseguire con le successive operazioni.




... disgiuntamente dal problema "connessione", suggerirei di approfondire gli aspetti di "Visibilità" e "scope" delle variabili in python, oltre che strutturarlo considerando le classi, così come è il codice si presta molto poco ad applicazioni appena più che elementari.
Edit integrato "user" nella citazione ... giacché ci sono aggiungo che i parametri di login inseriti dall'user non saranno mai visibili da "conn" tanto per questioni di visibilità quanto per questioni di posizione (si, anche la posizione del codice è significativa)


--- Ultima modifica di nuzzopippo in data 2022-12-15 11:45:10 ---
Risolto grazie eventualmente posso chiedere una libreria dall'aspetto piu moderno rispetto a tkinter?



Sento molto nominare le librerie QT, che però non conosco, da linuxaro quale sono preferisco librerie "libere", tipo wxPython non "nuovissime" ma più complete ed eleganti di tkinter.

La triade su (comprendente tkinter) sono i principali framework per applicazioni desktop, poi ci sono miriadi di cosette varie in giro, per lo più derivazioni da una delle tre, per scopi vari.




Suggerirei una ricerca in rete per farsi le idee su cosa si voglia/occorra veramente, studiarsi una qualunque di quelle librerie è estremamente impegnativo, per ottenere discreti risultati.

Fatti non foste a viver come bruti...
Hello this is Gulshan Negi
Well, in my recent search I found that the problem with your code is that the Tkinter GUI loop begins before the database connection is established. The connection must be established within the login function so that it can only be established when the login button is pressed.

Thanks
Well, in my recent search I found that the problem with your code is that the Tkinter GUI loop begins before the database connection is established. The connection must be established within the login function so that it can only be established when the login button is pressed.

Not necessarily, the tkinter mainloop can be bypassed using the publisher/subscriber pattern and a messaging protocol, p.e.

I apologize for the post syntax I don't speak English
Fatti non foste a viver come bruti...


Pagina: 1



Esegui il login per scrivere una risposta.