如何删除 Tkinter 应用程序中的空列

问题描述 投票:0回答:1

从DB以表格形式输出数据时,会出现一个空列,占用大量空间。

在此输入图片描述

我想删除此栏,但不知道如何删除。这是我的代码:{

import customtkinter as ctk
import sqlite3
import tkinter as tk
import pywinstyles
from tkinter import ttk

tables = []

edit_entry = None
save_button = None
cancel_button = None

# Функции ----------------------------------------------------------------------------------------------------------------------------------------------------------------------
# Главная функция
def init(filepath):
    from functions import log
    from functions import l_settings
    conn = sqlite3.connect(filepath)
    cursor = conn.cursor()
# Главная функция
    def close_aplication():
        exit()

    def button_show_all_data():
        global tables
        if tables:
            return
        cursor.execute("SELECT * FROM users")
        rows = cursor.fetchall()
        columns = [desc[0] for desc in cursor.description]

        table_frame = ttk.Frame(root)
        table_frame.pack(pady=20, fill="both", expand=True)

        scrollbar_y = tk.Scrollbar(table_frame, orient="vertical")
        scrollbar_y.pack(side="right", fill="y")

        scrollbar_x = tk.Scrollbar(table_frame, orient="horizontal")
        scrollbar_x.pack(side="bottom", fill="x")

        tree = ttk.Treeview(table_frame, xscrollcommand=scrollbar_x.set, yscrollcommand=scrollbar_y.set)
        tree['columns'] = columns

        for column in columns:
            tree.column(column, anchor="w")
            tree.heading(column, text=column)

        for row in rows:
            tree.insert('', 'end', values=list(row))

        scrollbar_x.config(command=tree.xview)
        scrollbar_y.config(command=tree.yview)
        tree.pack(fill="both", expand=True)

        tables.append(table_frame)

        tree.bind("<Button-1>", lambda event: edit_cell(event, tree, columns))

        tree['yscrollcommand'] = scrollbar_y.set
        tree['xscrollcommand'] = scrollbar_x.set
    def button_hide_table():
        global tables
        for table in tables:
            if table.winfo_exists(): 
                table.destroy()
        tables = []

    def edit_cell(event, tree, columns):
        global edit_entry, save_button, cancel_button
        if edit_entry is not None:
            edit_entry.destroy()
            save_button.destroy()
            cancel_button.destroy()

        item = tree.identify_row(event.y)
        column = tree.identify_column(event.x)
        cell_value = tree.item(item, 'values')[int(column[1:]) - 1]

        edit_entry = tk.Entry(tree, width=20)
        edit_entry.insert(0, cell_value)
        edit_entry.place(x=event.x, y=event.y)

        def save_changes():
            global edit_entry, save_button, cancel_button
            new_value = edit_entry.get()
            tree.item(item, values=list(tree.item(item, 'values')[:int(column[1:]) - 1]) + [new_value] + list(tree.item(item, 'values')[int(column[1:]) - 1 + 1:]))
            cursor.execute(f"UPDATE users SET {columns[int(column[1:]) - 1]} = '{new_value}' WHERE id = {tree.item(item, 'values')[0]}")
            conn.commit()
            edit_entry.destroy()
            save_button.destroy()
            cancel_button.destroy()
            edit_entry = None
            save_button = None
            cancel_button = None

        def cancel_changes():
            global edit_entry, save_button, cancel_button
            edit_entry.destroy()
            save_button.destroy()
            cancel_button.destroy()
            edit_entry = None
            save_button = None
            cancel_button = None

        save_button = tk.Button(tree, text="Сохранить", command=save_changes)
        save_button.place(x=event.x, y=event.y + 20)

        cancel_button = tk.Button(tree, text="Отмена", command=cancel_changes)
        cancel_button.place(x=event.x + 50, y=event.y + 20)
# Функции --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    root = ctk.CTk()
    root.title("Sqlite3 reader")
    root.minsize(700, 400)
    if l_settings.change('read', '', 'fullscreen'):
        root.attributes("-fullscreen", True)
    if l_settings.change('read', '', 'style') != 'normal':
        pywinstyles.apply_style(root, l_settings.change('read', '', 'readerstyle'))
    ctk.set_appearance_mode(l_settings.change('read', '', 'theme'))

    frame = ctk.CTkFrame(root, width=200, height=root.winfo_screenheight())
    frame.pack(side="left", fill="y", pady=0, padx=0)

    button_show_all = ctk.CTkButton(frame, text="Показать все данные")
    button_exit = ctk.CTkButton(frame, text="Выйти")
    button_hide = ctk.CTkButton(frame, text="Скрыть таблицу")

    button_exit.configure(command=close_aplication)
    button_show_all.configure(command=button_show_all_data)
    button_hide.configure(command=button_hide_table)

    button_show_all.pack(side="top", pady=10, padx=10)
    button_hide.pack(side="top", pady=10, padx=10)
    button_exit.pack(side="bottom", fill="x")

    root.mainloop()

}

我尝试使用 columns = [desc[0] for desc incursor.description if desc[0] not in ['rowid']] 删除它,但没有帮助

python sqlite tkinter
1个回答
0
投票

它是树列,可以通过在创建

show="headings"
小部件时设置
Treeview
来删除:

...
tree = ttk.Treeview(table_frame, xscrollcommand=scrollbar_x.set,
                    yscrollcommand=scrollbar_y.set, show="headings")
...
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.