Python tkinter treeview удалить строку

Delete and Edit items in Tkinter TreeView

Tkinter Treeview widget is used to display the data in a hierarchical structure. In this structure, each row can represent a file or a directory. Each directory contains files or additional directories. If we want to create a Treeview widget, then we can use Treeview(parent, columns) constructor to build the table.

The Treeview widget items can be edited and deleted by selecting the item using tree.selection() function. Once an item is selected, we can perform certain operations to delete or edit the item.

Example

# Import the required libraries from tkinter import * from tkinter import ttk # Create an instance of tkinter frame win = Tk() # Set the size of the tkinter window win.geometry("700x350") # Create an instance of Style widget style = ttk.Style() style.theme_use('clam') # Add a Treeview widget tree = ttk.Treeview(win, column=("c1", "c2"), show='headings', height=8) tree.column("# 1", anchor=CENTER) tree.heading("# 1", text="ID") tree.column("# 2", anchor=CENTER) tree.heading("# 2", text="Company") # Insert the data in Treeview widget tree.insert('', 'end', text="1", values=('1', 'Honda')) tree.insert('', 'end', text="2", values=('2', 'Hyundai')) tree.insert('', 'end', text="3", values=('3', 'Tesla')) tree.insert('', 'end', text="4", values=('4', 'Wolkswagon')) tree.insert('', 'end', text="5", values=('5', 'Tata Motors')) tree.insert('', 'end', text="6", values=('6', 'Renault')) tree.pack() def edit(): # Get selected item to Edit selected_item = tree.selection()[0] tree.item(selected_item, text="blub", values=("foo", "bar")) def delete(): # Get selected item to Delete selected_item = tree.selection()[0] tree.delete(selected_item) # Add Buttons to Edit and Delete the Treeview items edit_btn = ttk.Button(win, text="Edit", command=edit) edit_btn.pack() del_btn = ttk.Button(win, text="Delete", command=delete) del_btn.pack() win.mainloop()

Output

Executing the above code will display a window that contains a list of car models and ID in it.

Читайте также:  Python export environment variable windows

If we select a particular row and press edit or delete button, then it will perform the operations defined in the program.

Select the 4th row and click the «Delete» button.

It will produce the following output −

Источник

Подробно про виджет Tkinter TreeView

В рамках нашей серии руководств по Tkinter сегодняшняя статья будет посвящена виджету TreeView в Python.

Виджет TreeView очень полезен, если вы хотите отобразить иерархию элементов со всеми атрибутами, перечисленными рядом.

Treeview

Например, если вы хотите создать приложение, похожее на проводник Windows, мы можем сделать это с помощью виджета TreeView Tkinter.

Проводник Файлов Windows

Итак, TreeView позволяет нам создавать древовидную структуру и соответственно вставлять элементы вместе с их атрибутами.

Вы можете динамически добавлять или удалять узлы из своего Дерева, когда захотите, поэтому это очень полезно для многих ваших приложений с графическим интерфейсом. Мы можем построить Дерево по своему усмотрению.

Если вы хотите реплицировать файловый проводник, вы должны создать TreeView файлов с их атрибутами и добавить вложенные файлы и папки в качестве дочерних элементов родительских папок.

Давайте теперь посмотрим, как мы можем создать виджет TreeView и выполнять с ним операции, такие как вставка и удаление.

Как создать виджет TreeView?

Виджет TreeView принадлежит модулю tkinter.ttk , поэтому мы должны его импортировать.

Теперь мы можем ссылаться на виджет как на ttk.TreeView() .

Синтаксис для создания нового виджета TreeView прост.

tree = ttk.Treeview(master, columns)

Здесь tree соответствует корневому узлу вновь сформированного дерева. Здесь master относится к главному главному узлу приложения Tkinter.

columns — это кортеж, который ссылается на имена столбцов.

Например, мы можем построить такой виджет TreeView, имеющий столбцы «Name» и «ID»:

tree = ttk.Treeview(master, columns=("Name", "ID"))

Это дерево будет построено с использованием master в качестве базового виджета. Обычно он является главным мастер-объектом вашего приложения:

Теперь, когда у нас есть виджет TreeView, нет смысла отображать его, поскольку он пуст.

Давайте сначала вставим несколько объектов, чтобы мы могли просматривать TreeView в наших реальных приложениях.

Имейте в виду, что строки узла TreeView состоят только из строк, например:

"Label" , "Hello", "Second Col", "Third Col"

Теперь давайте вставим несколько узлов.

Вставка в TreeView

Синтаксис вставки очень прост. Мы берем объект TreeView и вставляем некоторые values , помеченные с помощью text . Мы также можем указать уникальный идентификатор для узла, используя параметр iid .

tree.insert(parent, index, iid, text, values)

Здесь мы вставляем узел в parent . Если вы хотите, чтобы parent виджет был главным (корневым) узлом, мы можем установить для него пустую строку (”). В противном случае мы должны указать iid существующего родительского узла.

На дочерний номер этого узла ссылаются с помощью index .

Например, если вы хотите вставить в первый дочерний элемент, вы указываете index=0 . Если вы хотите вставить в конец, вы можете указать специальное значение ‘end’ .

tree.insert(parent='', index='end', iid=0, text="Label", values=("Hello", "Second Col", "Third Col"))

Выше приведен пример вставки в конец корневого узла со значениями, указанными в строке ниже:

"Label" , "Hello", "Second Col", "Third Col"

К сожалению, не существует простого способа создать TreeView, поскольку вам нужны другие виджеты для правильной визуализации вывода.

Перед тем, как продолжить, ознакомьтесь с разделами, посвященными виджетам Tkinter Button, Grid Manager и Tkinter Entry.

Я предоставлю образец приложения для визуализации вывода с использованием этих виджетов:

import tkinter as tk import tkinter.ttk as ttk class Application(tk.Frame): def __init__(self, root): self.root = root self.initialize_user_interface() def initialize_user_interface(self): # Configure the root object for the Application self.root.title("Application") self.root.grid_rowconfigure(0, weight=1) self.root.grid_columnconfigure(0, weight=1) self.root.config(background="green") # Define the different GUI widgets self.name_label = tk.Label(self.root, text="Name:") self.name_entry = tk.Entry(self.root) self.name_label.grid(row=0, column=0, sticky=tk.W) self.name_entry.grid(row=0, column=1) self.idnumber_label = tk.Label(self.root, text="ID") self.idnumber_entry = tk.Entry(self.root) self.idnumber_label.grid(row=1, column=0, sticky=tk.W) self.idnumber_entry.grid(row=1, column=1) self.submit_button = tk.Button(self.root, text="Insert", command=self.insert_data) self.submit_button.grid(row=2, column=1, sticky=tk.W) self.exit_button = tk.Button(self.root, text="Exit", command=self.root.quit) self.exit_button.grid(row=0, column=3) # Set the treeview self.tree = ttk.Treeview(self.root, columns=('Name', 'ID')) # Set the heading (Attribute Names) self.tree.heading('#0', text='Item') self.tree.heading('#1', text='Name') self.tree.heading('#2', text='ID') # Specify attributes of the columns (We want to stretch it!) self.tree.column('#0', stretch=tk.YES) self.tree.column('#1', stretch=tk.YES) self.tree.column('#2', stretch=tk.YES) self.tree.grid(row=4, columnspan=4, sticky='nsew') self.treeview = self.tree self.id = 0 self.iid = 0 def insert_data(self): self.treeview.insert('', 'end', iid=self.iid, text="Item_" + str(self.id), values=("Name: " + self.name_entry.get(), self.idnumber_entry.get())) self.iid = self.iid + 1 self.id = self.id + 1 app = Application(tk.Tk()) app.root.mainloop()

Здесь я создал несколько меток и записей для ввода. Я также создал TreeView, который состоит из двух частей:

  • Заголовки TreeView (для отображения имен столбцов)
  • Столбцы TreeView и метод insert_data()

Каждый раз, когда мы нажимаем кнопку «Вставить», в нашем виджете TreeView будет вызываться метод insert_data() .

Treeview пример

Давайте теперь добавим кнопку «Удалить», чтобы мы могли удалить выбранную строку.

Удаление строки из TreeView

Существует метод TreeView.delete() которым мы можем воспользоваться. Это удалит соответствующий узел (в нашем случае строку) из нашего виджета TreeView.

Метод просто берет идентификационный номер iid узла и удаляет его из TreeView.

Теперь большой вопрос в том, как мы можем получить идентификационный номер нашей строки из виджета TreeView. Что ж, это зависит от того, как вы собираетесь выполнять операцию удаления.

Мы будем удалять строку всякий раз, когда выбираем эту строку с помощью мыши. После того, как строка будет выделена, мы можем нажать кнопку удаления, и это удалит ее из виджета TreeView .

Для этого мы будем использовать метод TreeView.focus() , чтобы получить iid строки (в виде строки).

def delete_data(self): row_id = int(self.tree.focus()) self.treeview.delete(row_id)

Давайте добавим кнопку удаления и используем этот метод как функцию обратного вызова.

После добавления приложение будет выглядеть так:

import tkinter as tk import tkinter.ttk as ttk class Application(tk.Frame): def __init__(self, root): self.root = root self.initialize_user_interface() def initialize_user_interface(self): # Configure the root object for the Application self.root.title("Application") self.root.grid_rowconfigure(0, weight=1) self.root.grid_columnconfigure(0, weight=1) self.root.config(background="green") # Define the different GUI widgets self.name_label = tk.Label(self.root, text="Name:") self.name_entry = tk.Entry(self.root) self.name_label.grid(row=0, column=0, sticky=tk.W) self.name_entry.grid(row=0, column=1) self.idnumber_label = tk.Label(self.root, text="ID:") self.idnumber_entry = tk.Entry(self.root) self.idnumber_label.grid(row=1, column=0, sticky=tk.W) self.idnumber_entry.grid(row=1, column=1) self.submit_button = tk.Button(self.root, text="Insert", command=self.insert_data) self.submit_button.grid(row=2, column=1, sticky=tk.W) self.delete_button = tk.Button(self.root, text="Delete", command=self.delete_data) self.delete_button.grid(row=100, column=100) self.exit_button = tk.Button(self.root, text="Exit", command=self.root.quit) self.exit_button.grid(row=0, column=3) # Set the treeview self.tree = ttk.Treeview(self.root, columns=('Name', 'ID')) # Set the heading (Attribute Names) self.tree.heading('#0', text='Item') self.tree.heading('#1', text='Name') self.tree.heading('#2', text='ID') # Specify attributes of the columns (We want to stretch it!) self.tree.column('#0', stretch=tk.YES) self.tree.column('#1', stretch=tk.YES) self.tree.column('#2', stretch=tk.YES) self.tree.grid(row=4, columnspan=4, sticky='nsew') self.treeview = self.tree self.id = 0 self.iid = 0 def insert_data(self): self.treeview.insert('', 'end', iid=self.iid, text="Item_" + str(self.id), values=("Name: " + self.name_entry.get(), self.idnumber_entry.get())) self.iid = self.iid + 1 self.id = self.id + 1 def delete_data(self): row_id = int(self.tree.focus()) self.treeview.delete(row_id) app = Application(tk.Tk()) app.root.mainloop()

Treeview удаление

Теперь у нас есть базовая структура TreeView, а также реализованы простые операции вставки и удаления.

Я бы посоветовал вам расширить возможности этого приложения, выполнив другие операции, например, обновив некоторые строки. Вы также можете заметить, что номера позиций не упорядочены должным образом после удаления.

Вот простая функция-шаблон для update() которую вы можете использовать в качестве справки:

def update(self): for idx, node in enumerate(self.treeview.get_children()): self.tree.item(node, text="Updated_Item_" + str(idx))

Это обновит все строки вашего TreeView и изменит text метку. Аналогичным образом можно изменить другие атрибуты.

Источник

Оцените статью