如何解决在GUI中编辑Python Tkinter列表框文本
是否有一种方法可以编辑列表框项目而不是删除它?
我正在使用带有列表框的tkinter GUI。现在,我的列表框可以包含例如10个项目。如果我想更改一项的文本,是否有办法?
我知道我可以创建一个按钮来删除单个项目,但是有什么办法可以同时突出编辑一个项目?
解决方法
列表框不支持直接编辑列表框内的项目。您必须为用户提供一种输入数据的机制,然后才可以替换列表框中的单个项目。
话虽这么说,tkinter为您提供了所需的所有工具,使用户可以双击项目并进行更改。这是一个简单的例子。简而言之,当您双击时,它将在您单击的项目上叠加一个条目小部件,当您按回车键时,会将项目保存到列表框中。
import tkinter as tk
class EditableListbox(tk.Listbox):
"""A listbox where you can directly edit an item via double-click"""
def __init__(self,master,**kwargs):
super().__init__(master,**kwargs)
self.edit_item = None
self.bind("<Double-1>",self._start_edit)
def _start_edit(self,event):
index = self.index(f"@{event.x},{event.y}")
self.start_edit(index)
return "break"
def start_edit(self,index):
self.edit_item = index
text = self.get(index)
y0 = self.bbox(index)[1]
entry = tk.Entry(self,borderwidth=0,highlightthickness=1)
entry.bind("<Return>",self.accept_edit)
entry.bind("<Escape>",self.cancel_edit)
entry.insert(0,text)
entry.selection_from(0)
entry.selection_to("end")
entry.place(relx=0,y=y0,relwidth=1,width=-1)
entry.focus_set()
entry.grab_set()
def cancel_edit(self,event):
event.widget.destroy()
def accept_edit(self,event):
new_data = event.widget.get()
self.delete(self.edit_item)
self.insert(self.edit_item,new_data)
event.widget.destroy()
root = tk.Tk()
lb = EditableListbox(root)
vsb = tk.Scrollbar(root,command=lb.yview)
lb.configure(yscrollcommand=vsb.set)
vsb.pack(side="right",fill="y")
lb.pack(side="left",fill="both",expand=True)
for i in range(100):
lb.insert("end",f"Item #{i+1}")
root.mainloop()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。