【问题标题】:tkinter clickable Label to open details of Labeltkinter 可点击标签以打开标签的详细信息
【发布时间】:2021-12-03 10:40:38
【问题描述】:

我正在尝试使用 tkinter 编写一个界面,它将我的应用程序的用户显示为标签列表。该列表是从数据库创建的(使用 sqlite3 创建的)。 通过单击每个标签,程序应打开另一个窗口,显示单击用户的详细信息。 也许我需要使用课程? (因为目前,我的脚本不是 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()

【问题讨论】:

  • 不要使用多个Tk 实例,如果您需要其他窗口使用Toplevel,您的代码到底有什么问题?由于我没有该数据库,因此无法真正对其进行测试,因此如果您在代码中提供一些示例数据以及minimal reproducible example,那就太好了
  • 您知道&lt;Enter&gt; 事件是在光标移到小部件上时触发的,而不是在用户按下回车键时触发的吗?
  • @matiss 在这个阶段代码可以工作,但是 openUser_lable_button 会打开一个通用窗口,其中填充了在函数 open_user() 中声明的标签和文本框。我需要每个不同的 openUser_lable_button 打开一个新窗口,该窗口特定于该按钮的子标签的特定标签。如果我有已知数量的标签,我可以为界面中的每个按钮创建一个特定的命令,但我的标签数量是动态的,取决于数据库的状态。
  • @matiiss 也许如果您也有一些避免 for-cycle 的建议,以便为我的数据库的每一行动态创建一个标签...
  • @BryanOakley 是的,我知道,我正在测试并忘记更改它。

标签: python tkinter label clickable


【解决方案1】:

这里是之前的代码,没有数据库,很简单:

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()

【讨论】:

  • 这不是答案,您需要编辑您的问题以添加新信息
猜你喜欢
  • 2021-10-09
  • 2017-08-17
  • 2020-09-12
  • 1970-01-01
  • 1970-01-01
  • 2013-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多