delphi listview 选中行与选中checkbox_Python GUI编程入门(37)-通用的ListView类

Tkinter主题控件的Treeview除了体统树状视图之外,还可以提供列表视图。但是由于控件本身的复杂性,如果想正确的使用这个控件,或多或少都需要一些时间来调查和学习。本文提供一个通用的ListView类以简化这个过程。

3ff07f7a49b759b374db200b2f80f15c.png

这个类除了提供一般的列表功能之外,还提供一个简单的就地编辑功能:当用户双击文件名时,可以触发一个文本输入框直接编辑文件名。

class ListView(Treeview): def __init__(self, master, **kwargs): columns = kwargs.get('columns') kwargs.pop('columns') Treeview.__init__(self, master) if columns: cols = [] for c in range(1, columns): cols.append('#{}'.format(c)) self['columns'] = cols self.editable = {} self.bind('<>', self.item_selected) self.bind('', self.item_double_clicked) # 双击左键进入编辑 # 设定允许编辑的列 def enable_edit(self, col, editable): self.editable[col] = editable # 双击处理 def item_double_clicked(self, event): column = self.identify_column(event.x) # 列 row = self.identify_row(event.y) # 行 editable = self.editable.get(column) if editable: ItemEdit(self, row, column) # 编辑结果确认处理 def entry_confirmed(self, row, col, text): self.set_text(row, col, text) # 行选中处理 def item_selected(self, event): try: self.master.item_selected(event) except: pass # 指定行列获取内容 def get_text(self, row, col): if col == '#0': return self.item(row, 'text') else: return self.set(row, col) # 指定行列修改内容 def set_text(self, row, col, text): if col == '#0': self.item(row, text=text) else: self.set(row, col, text)

这个类继承自Tkinter的Treeview类,除了提供了get_text和set_text两个函数之外,主要是实现的就地编辑功能。这是ListView需要配合ItemEdit类使用:

class ItemEdit(Entry): def __init__(self, view, row, col): Entry.__init__(self, view) bbox = view.bbox(row, col) cur_width = self['width'] req_width = self.winfo_reqwidth() width = int(cur_width * bbox[2] / req_width) self.configure(width=width) cur_width = self['width'] req_width = self.winfo_reqwidth() width = int(cur_width * bbox[2] / req_width) self.configure(width=width) req_width = self.winfo_reqwidth() self.insert(INSERT, view.get_text(row, col)) self.view = view self.row = row self.col = col self.place(x=bbox[0]+(bbox[2]-req_width)/2, y=bbox[1]-1) self.bind('', self.confirm) self.bind('', self.confirm) self.focus_set() self.update() self.bind('', self.confirm) def confirm(self, event): self.view.entry_confirmed(self.row, self.col, self.get()) self.destroy() def config(self, event): print(event)

ItemEdit类继承自Entry类,当用户按下编辑控件内容并按下回车键是,将变更内容通知给ListView并销毁自身。除了按下回车键之外,Entry失去焦点或者更换主题时也会触发同样的处理。

有了这个ListView类之后,FileBroswer通过一个FileList类来实现目录内容显示和文件操作功能。

class FileList(ListView): def __init__(self, master, **kwargs): ListView.__init__(self, master, columns=5, size_grip=True) self.column("#0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值