[英]Tkinter GUI – How to remove a row of Entry widgets, using a Button
我正在使用ttk.Entry
和`ttk.Combobox'(行和列–行的數量可以變化)來建立表格。
用戶應該能夠使用放在GUI上的“刪除按鈕”刪除該表的整個行。
嘗試過:
a)使用focus_get()
確定Entry的行號,然后刪除整個窗口小部件行。 但是 ,當按下“刪除按鈕”時, focus_get()
從Entry更改為Button,並且“ Delete Button”被刪除了。
b)我還沒有嘗試過,但是有一種方法可以將類綁定到整個對象,但這似乎並不優雅。
有什么想法是“正確”的方法嗎?
您沒有在問題中陳述它,但我假設您正在使用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()
正如@Bryan Oakley所建議的,這是更新代碼的相關部分—作為我的問題的答案。
Button的焦點設置為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
回調以通過使用grid_info().get('row')-1
獲取小部件的行號來刪除self.datafile
的確切行
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")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.