我正在建造一张桌子,使用ttk.Entry
和`ttk.Combobox' (行和列 - 行数可以变化)。
用户应该能够使用GUI上的“删除按钮”删除该表的整行。
答案 0 :(得分:2)
您不会在问题中说明,但我假设您正在使用ttk
按钮。 ttk按钮小部件在您单击它时会获得焦点,这与tkinter不同,并且与按钮的工作方式不同。在我看来这是ttk按钮中的一个错误,但是几年前我提出了这个问题,开发人员决定保持这种行为。
快速解决方法是将按钮的takefocus
选项设置为False。不幸的是,这会导致破坏使用键盘遍历gui的能力的副作用(例如:按Tab键将移动焦点从小部件移动到小部件)。这些问题都可以通过一些自定义绑定来解决。
以下是一个程序,用于说明将takefocus
设置为False
和True
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")