python利用tkinter做一个带复选框的listview原来如此简单

tkinter是python的标准包,不需要额外安装。所有今天就用tkinter做一个listview练练手。

 

主要用的是tkinter中的treeview。主要用到的功能语句有:

语句一:插入行

tree.insert('', 'end', values=values)

语句二:获取所有表格的行

items = self.tree.get_children()

语句三:获取所有表格的行

tree.set(item, column=2, value='a')

实现功能:

  1. 动态添加,修改,删除数据(一个表格,一行,一列)。可以指定行号、列号修改相应的内容
  2. 点击行,改变复选状态

python中用tkinter做带复选框的listview

用到的其他辅助语句:主要美化的

语句一:改变列宽

tree.column("#%d" % col_num, width=width)

语句二:设置表头的字体和大小

style = ttk.Style()

style.configure("Treeview.Heading", font=(font, size))

语句三:设置表格行高和字体

s = ttk.Style()

s.configure('Treeview', rowheight=height, font=(None, font))

 

设计思路:(因为没有对tkinter深入的研究,所以功能虽实现了,肯定不是很完美。以后对python继续学习和对tkinter的进一步理解再说吧),用字符标识状态,用数据的第1列作为标识,其他列存放数据

 

以下是完整代码:

# !/usr/bin/python3
# -*-coding:utf-8 -*-
"""
@author Kwina
@desc 本模块是封装gui控件
@date 20200519
@version 1.0
说明:
classes:
    1.ListView():
        1.version:1.0
        2.功能:实现可视列表复选框,及列表数据的增删改查
        3.设计思路:利用python的标准包tkinter实现。这里没有对treeview进行封装,
            只是利用了treeview数据可以修改实现的功能
            复选框的功能利用字符☑□的变化实现的
        4.vals:一行的vals是不包含行头部信息的数据集合
        5.values:一个的values是包含行头部信息的数据集合
        6.行的复选框和索引占用了item数据的第1列,
            所以数据的增删改查都重新封装成函数
        7.cleare...:这一类方法只清空数据,也就是把数据改为空
        8.delete...:这一类方法是删除整行
"""

from tkinter import *
from tkinter import ttk


class ListView():
    char_ct = '☑'  # 复选框选中标识符
    chat_cf = '□'  # 复选框未选中标识符

    def __init__(self, tk, x=0, y=0, height=400, width=600):
        self.tk = tk
        self.x = x
        self.y = y
        self.height = height
        self.width = width
        self.rows_count = 0
        self.cols_count = 0
        self.head_tags = ['index']
        self.head_widths = [50]
        self.head_texts = ['']
        self.tree = None
        self.__created = False  # 控制表格创建后,停用部分方法
        self.__check_boxes = True  # 标识是否有复选框功能
        self.__show_index = True  # 标识是否显示行号


    def create_listview(self):
        """
        设置好列后,执行这个函数显示出控件
        """
        if self.__created:
            print('不能再次创建!')
        else:
            self.__created = True
            self.cols_count = len(self.head_tags) - 1  # 第一列用作索引了

            frame1 = Frame(self.tk, relief=RAISED)
            frame1.place(height=self.height, width=self.width, x=self.x, y=self.y)
            frame1.propagate(0)  # 使组件大小不变,此时width才起作用

            # 定义listview
            self.tree = ttk.Treeview(frame1, columns=self.head_tags, show='headings')
            self.tree.column(self.head_tags[0], width=self.head_widths[0], anchor='center')  # stretch=YES怎么用
            for i in range(1, len(self.head_tags)):
                self.tree.column(self.head_tags[i], width=self.head_widths[i], anchor='center')
                self.tree.heading(self.head_tags[i], text=self.head_texts[i])

            # 设置垂直滚动条
            vbar = ttk.Scrollbar(frame1, orient=VERTICAL, command=self.tree.yview)
            self.tree.configure(yscrollcommand=vbar.set)
            # self.tree.grid(row=0, column=0, sticky=NSEW)
            self.tree.grid(row=0, column=0)
            vbar.grid(row=0, column=1, sticky=NS)

            # 设置水平滚动条
            hbar = ttk.Scrollbar(frame1, orient=HORIZONTAL, command=self.tree.xview)
            self.tree.configure(xscrollcommand=hbar.set)
            hbar.grid(row=1, column=0, sticky=EW)

            # 绑定事件
            self.tree.bind('<ButtonRelease-1>', self.on_click)  # 绑定行单击事件
            self.tree.bind("<Double-1>", self.on_db_click)  # 绑定双击事件

    def add_column(self, text='', width=100):
        """
        增加一列,应该在show()前面设定,后面就无效了
        :param text: 表头文字
        :param width: 列宽度
        """
        if self.__created:
            print('表格已经创建,在增加的列无效!')
        else:
            self.head_tags.append(len(self.head_tags))
            self.head_widths.append(width)
            self.head_texts.append(text)

    def add_row_char(self, check_char=char_ct, vals=''):
        """
        在最后增加一行
        """
        if self.__check_boxes:
            if check_char != ListView.char_ct:
                check_char = ListView.chat_cf
            index = '%s%d' % (check_char, self.rows_count + 1)
        else:
            index = self.rows_count + 1

        values = [index]
        for v in vals:
            values.append(v)
        self.tree.insert('', 'end', values=values)
        self.rows_count += 1

    def add_row(self, check_bl=True, vals=''):
        """
        在最后增加一行
        """
        check_char = self.check_bl2char(check_bl)
        self.add_row_char(check_char, vals)

    def set_check(self, state=True):
        """
        设置是否有复选功能
        """
        if self.__created:
            print('表格创建后,不能设置复选状态!')
    
  • 11
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值