0

I'm trying to program an interface with tkinter, that shows users of my application as a list of Labels. The list is created from a database (created with sqlite3). By clicking on each Label the program should open another window, showing details of the clicked user. maybe do I need to use classes? (because for now, my script is not OOP)

root = Tk()
root.title("Utenti")
root.iconbitmap("D:\Willow\WilloW SW Gestionale")
root.geometry("365x600")

def open_user(name = str):
  user = Tk()
  user.title("Utenti")
  user.iconbitmap("D:\Willow\WilloW SW Gestionale")
  user.geometry("500x400")

  #create entry
  f_name_entry = Entry(user, width=30, state="disabled")
  f_name_entry.grid(row=0, column=1, padx=20, pady=(10, 0))

  P_iva_entry = Entry(user, width=30, state="disabled")
  P_iva_entry.grid(row=1, column=1)

  cell_number_entry = Entry(user, width=30, state="disabled")
  cell_number_entry.grid(row=2, column=1)

  tax_entry = Entry(user, width=30, state="disabled")
  tax_entry.grid(row=3, column=1)

  inps_entry = Entry(user, width=30, state="disabled")
  inps_entry.grid(row=4, column=1)

  # create text boxes
  f_name_label = Label(user, text=name)
  f_name_label.grid(row=0, column=0, pady=(10, 0))

  P_iva_label = Label(user, text="p iva")
  P_iva_label.grid(row=1, column=0)

  cell_number_label = Label(user, text="cell number")
  cell_number_label.grid(row=2, column=0)

  tax_label = Label(user, text="tax")
  tax_label.grid(row=3, column=0)

  inps_label = Label(user, text="inps")
  inps_label.grid(row=4, column=0)

i = 4

conn = sqlite3.connect("usersEsteso.db")
c = conn.cursor()
c.execute("SELECT *, oid FROM usersEsteso")
records = c.fetchall()

for record in records:
    print_records = record[0]

    users_lable = Label(root, bg="#778899")
    users_lable.grid(row=i + 7, column=0, sticky="w", padx=5, pady=5, columnspan=3)
    user_text = Label(users_lable, text=print_records)
    user_text.grid(row=0, column=0, pady=5, padx=5, sticky="w")
    #user_text.bind("<Enter>", open_user("sam"))
    openUser_lable_button = Button(users_lable, text="apri " + record[0], command=lambda: open_user(record[0])) #here i showld pass the identification of the parent the button
    openUser_lable_button.grid(row=1, column=0, pady=5, padx=5, sticky="e")
    i = i + 1


conn.commit()
conn.close()
  • 1
    don't use multiple `Tk` instances, if you need other windows use `Toplevel`, also what exactly is the issue with your code? can't really test it since I don't have that database so it would be great if you provided some sample data in code, along with a [mre] – Matiiss Dec 03 '21 at 11:52
  • Are you aware that the event `` triggers when the cursor is moved over the widget, not when the user presses the enter key? – Bryan Oakley Dec 03 '21 at 14:30
  • @matiss at this stage the code works, but openUser_lable_button opens a generic window filled with labels and textboxes declared inside the function open_user(). I need that every different openUser_lable_button opens a new window specific for the specific label the button is child of. If I had a known number of Labels I could create a specific command for every button in my interface, but the number of my labels is dynamic and depends on the state of the database. – Gianni Panni Dec 03 '21 at 15:40
  • @matiiss Maybe if you have also some suggestions for avoiding for-cycle in order to create dynamically one label for every line of my database... – Gianni Panni Dec 03 '21 at 15:40
  • @BryanOakley yes I know, I was testing and forgot to change it. – Gianni Panni Dec 03 '21 at 15:42
  • Please try to remove the database from the code and add some hard-coded data. – Bryan Oakley Dec 03 '21 at 16:10
  • Does this answer your question? https://stackoverflow.com/q/17677649 – Bryan Oakley Dec 03 '21 at 16:12

1 Answers1

0

here the previous code, without database and simplyfied:

from tkinter import *


root = Tk()
root.title("Users")
root.geometry("365x600")

#global variables
i = 1


def open_user():
    user = Tk()
    user.title("User")
    user.geometry("500x400")

    #create entry
    f_name_entry = Entry(user, width=150, state="normal")
    f_name_entry.grid(row=0, column=1, padx=20, pady=(10, 0))

    P_iva_entry = Entry(user, width=150, state="disabled")
    P_iva_entry.grid(row=1, column=1, columnspan=2)

    cell_number_entry = Entry(user, width=150, state="disabled")
    cell_number_entry.grid(row=2, column=1, columnspan=2)

    tax_entry = Entry(user, width=150, state="disabled")
    tax_entry.grid(row=3, column=1, columnspan=2)

    inps_entry = Entry(user, width=150, state="disabled")
    inps_entry.grid(row=4, column=1, columnspan=2)

    # create text boxes
    f_name_label = Label(user, text="name")
    f_name_label.grid(row=0, column=0, pady=(10, 0))

    P_iva_label = Label(user, text="p iva")
    P_iva_label.grid(row=1, column=0)

    cell_number_label = Label(user, text="cell number")
    cell_number_label.grid(row=2, column=0)

    tax_label = Label(user, text="tax")
    tax_label.grid(row=3, column=0)

    inps_label = Label(user, text="inps")
    inps_label.grid(row=4, column=0)

    f_name_entry.insert(0, "here should be the name of the clicked user")


my_list = ["andrew", "sam", "Zoe"]

title_label = Label(root, text="List of Users")
title_label.grid(row=0, column=0, pady=(10,40))

for item in my_list:
    print(i)
    my_frame = Frame(root, bg="#a6a6a6")
    my_label = Label(my_frame, text=item)
    my_button = Button(my_frame, text="inspect user", command=open_user)
    my_frame.grid(row=i, column=0, padx=10, pady=10)
    my_label.grid(row=0, column=0, padx=10, pady=10)
    my_button.grid(row=1, column=0, padx=10, pady=10)

    i = i+1


root.mainloop()