Tkinter GUI - 如何使用Button删除一行Entry小部件

时间:2017-10-13 11:06:35

标签: python user-interface tkinter

我正在建造一张桌子,使用ttk.Entry和`ttk.Combobox' (行和列 - 行数可以变化)。

用户应该能够使用GUI上的“删除按钮”删除该表的整行。

  1. 要删除的行可以放在任何位置(第一个,最后一个,中间的任何位置)。
  2. 不在每行的结尾/开头添加“复选框”小部件以标记所需的行。
  3. 试过:

    a)使用focus_get()确定Entry的行号,然后删除整行的小部件。 但是,当按下“删除按钮”focus_get()从条目更改为按钮时,“删除按钮”被删除。

    b)我没有尝试过,但是有一种方法可以使用类绑定到整个,但它看起来并不优雅。

    任何想法是什么样的“正确”方式?

    编辑1:添加GUI的图片。选择任何条目,将删除整行小部件

2 个答案:

答案 0 :(得分:2)

您不会在问题中说明,但我假设您正在使用ttk按钮。 ttk按钮小部件在您单击它时会获得焦点,这与tkinter不同,并且与按钮的工作方式不同。在我看来这是ttk按钮中的一个错误,但是几年前我提出了这个问题,开发人员决定保持这种行为。

快速解决方法是将按钮的takefocus选项设置为False。不幸的是,这会导致破坏使用键盘遍历gui的能力的副作用(例如:按Tab键将移动焦点从小部件移动到小部件)。这些问题都可以通过一些自定义绑定来解决。

以下是一个程序,用于说明将takefocus设置为FalseTrue

之间的区别
import tkinter as tk
from tkinter import ttk

root = tk.Tk()

def click():
    label.configure(text="Widget with focus: %s" % root.focus_get())

e1 = ttk.Entry(root, name="e1")
e2 = ttk.Entry(root, name="e2")
label = ttk.Label(root)

b1 = ttk.Button(root, text="Steal focus", command=click, name="b1", takefocus=True)
b2 = ttk.Button(root, text="Don't Steal focus", command=click, name="b2", takefocus=False)

e1.pack(fill="x")
e2.pack(fill="x")
label.pack(side="top", fill="both", expand=True)
b1.pack(side="left")
b2.pack(side="left")

root.mainloop()

答案 1 :(得分:0)

正如@Bryan Oakley建议的那样,这是更新代码的相关部分 - 作为我问题的答案。

按钮的焦点设置为False

del_row_button = ttk.Button(buttons_frame, width=10, text="Delete Row", takefocus=False, command=self.del_row)
        del_row_button.grid(row=1, column=1, pady=5, padx= 5)
已更新

self.del_row_button回调,删除self.datafile中的确切行,方法是使用grid_info().get('row')-1获取小部件的行号

def del_row(self):

        #delete data from list
        del self.datafile[self.class_frame.focus_get().grid_info().get('row') -1]

        #save data
        self.save_data()

        #destroy and rebuild rows with updated data
        self.rows_frame.destroy()
        self.rebuild_table()

        print("row deleted")