簡體   English   中英

Tkinter GUI –如何使用按鈕刪除一行Entry小部件

[英]Tkinter GUI – How to remove a row of Entry widgets, using a Button

我正在使用ttk.Entry和`ttk.Combobox'(行和列–行的數量可以變化)來建立表格。

用戶應該能夠使用放在GUI上的“刪除按鈕”刪除該表的整個行。

  1. 可以將要刪除的行放置在任何位置(第一,最后,之間的任何位置)。
  2. 無需在每行的末尾/開頭添加“復選框”小部件來標記所需的行。

嘗試過:

a)使用focus_get()確定Entry的行號,然后刪除整個窗口小部件行。 但是 ,當按下“刪除按鈕”時, focus_get()從Entry更改為Button,並且“ Delete Button”被刪除了。

b)我還沒有嘗試過,但是有一種方法可以將類綁定到整個對象,但這似乎並不優雅。

有什么想法是“正確”的方法嗎?

編輯1:添加圖片 圖形用戶界面 選擇任何條目,將刪除整行小部件

您沒有在問題中陳述它,但我假設您正在使用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()

正如@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM