tkinter绘制组件(35)——列表视图

这篇具有很好参考价值的文章主要介绍了tkinter绘制组件(35)——列表视图。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引言

又是一个莫名其妙的元素组件——列表视图(listview)。

这个组件在原生tkinter中没有对应控件,这是一个拓展组件。但是,在tkinter中不存在,不代表在其它UI库或框架不存在,就比如WinUI的ListView。

listview的重要性在于将若干个重复排版而又包含不同信息的元素呈现出来,避免占用主界面过多的位置。相比于listbox,listview在提供可选的基础上,为使用者提供了更丰富的信息,并做到整齐划一;对编写者,能够做到批量生成信息元素模块。

对于listview,最大的技术难点不是布局,因为看看,这都到了TinUI在CSDN上的第35篇文章了,一般的布局不会是问题。难点是:在tkinter可滚动控件中,鼠标进入子控件,传递滚动信息的问题。这个会在稍后讲解。


布局

函数结构

    def add_listview(self,pos:tuple,width=300,height=300,linew=80,bg='#f3f3f3',activebg='#eaeaea',oncolor='#3041d8',scrobg='#f8f8f8',scroc='#999999',scrooc='#89898b',num=5,command=None):#绘制列表视图,function:add_list
    '''
    pos-位置
    width-宽度
    height-高度
    linew-列表元素高度
    bg-背景色
    activebg-响应色
    oncolor-选中标识色
    scrobg-滚动条背景色
    scroc-滚动条颜色
    scrooc-滚动条响应色
    num-列表元素数量
    command-响应函数,需要一个参数接受选中项位次
    '''

列表框架

为了方便样式调控,我们使用BasicTinUI作为列表视图框架。

        nowon=-1
        ui=BasicTinUI(self,bg=bg)
        view=self.create_window(pos,window=ui,height=height,width=width,anchor='nw')
        uid='listview'+str(view)
        self.addtag_withtag(uid,view)
        scro=self.add_scrollbar((pos[0]+width+2,pos[1]),ui,height=height,bg=scrobg,color=scroc,oncolor=scrooc)
        self.addtag_withtag(uid,scro[-1])

这里之所以选择BasicTinUI,还有一个重要原因是可以使用TinUI自己的滚动条,而不是使用tkinter的,这样可以有统一性。

列表元素

这个很简单,该怎么添加就怎么添加。

        for i in range(0,num):
            item=ui.add_ui((3,endy),width=width-3,height=linew,bg=bg)
            items.append(item)
            endy+=linew+2
            item[0].bind('<Enter>',lambda event,item=item:buttonin(item))
            item[0].bind('<Button-1>',lambda event,item=item:click(item))
            item[0].bind('<Leave>',lambda event,item=item:buttonout(item))

标识元素

这里的表示元素是模仿winui的。也就是在列表元素左侧有一个高度大概为元素高度三分之一的线条,以作为标识元素。

        lineheight=linew/3
        line=ui.create_line((1,linew/3,1,linew*2/3),fill=oncolor,width=3,capstyle='round')

滚动范围和背景

滚动范围就是ui内所有元素了,而背景就不用再自己绘制了,直接使用TinUI的back

        ui.config(scrollregion=ui.bbox('all'))
        ui.move(line,0,-linew-height)
        self.add_back((),(view,scro[-1]),fg=bg,bg=bg,linew=3)

滚动信息传递

这个部分是重点,虽然不难,但是是一个需要注意的地方。

如果只为BasicTinUI绑定滚动,那这个控件基本费了。当鼠标进入某一个列表元素时,是滚不动的。

因此,需要将每一个列表元素的滚动信息都往上传。

        def bindyview(event):
            ui.yview_scroll(int(-1*(event.delta/120)), "units")
        #...
        for i in range(0,num):
            #...
            item[0].bind('<MouseWheel>',bindyview)

选择功能

这个部分参考listbox。

        def buttonin(itui):
            itui[0]['background']=activebg
        def buttonout(itui):
            if items.index(itui)!=nowon:
                itui[0]['background']=bg
        def click(itui):
            nonlocal nowon
            index=items.index(itui)
            items[nowon][0]['background']=bg
            nowon=index
            items[nowon][0]['background']=activebg
            ui.coords(line,1,index*(linew+2)+lineheight,1,index*(linew+2)+lineheight*2)
            if command!=None:
                command(nowon)

完整函数代码

    def add_listview(self,pos:tuple,width=300,height=300,linew=80,bg='#f3f3f3',activebg='#eaeaea',oncolor='#3041d8',scrobg='#f8f8f8',scroc='#999999',scrooc='#89898b',num=5,command=None):#绘制列表视图,function:add_list
        def buttonin(itui):
            itui[0]['background']=activebg
        def buttonout(itui):
            if items.index(itui)!=nowon:
                itui[0]['background']=bg
        def click(itui):
            nonlocal nowon
            index=items.index(itui)
            items[nowon][0]['background']=bg
            nowon=index
            items[nowon][0]['background']=activebg
            ui.coords(line,1,index*(linew+2)+lineheight,1,index*(linew+2)+lineheight*2)
            if command!=None:
                command(nowon)
        def bindyview(event):
            ui.yview_scroll(int(-1*(event.delta/120)), "units")
        nowon=-1
        ui=BasicTinUI(self,bg=bg)
        view=self.create_window(pos,window=ui,height=height,width=width,anchor='nw')
        uid='listview'+str(view)
        self.addtag_withtag(uid,view)
        scro=self.add_scrollbar((pos[0]+width+2,pos[1]),ui,height=height,bg=scrobg,color=scroc,oncolor=scrooc)
        self.addtag_withtag(uid,scro[-1])
        items=[]#使用列表作为存储类型,以后可能动态修改列表视图元素
        endy=0
        for i in range(0,num):
            item=ui.add_ui((3,endy),width=width-3,height=linew,bg=bg)
            items.append(item)
            endy+=linew+2
            item[0].bind('<Enter>',lambda event,item=item:buttonin(item))
            item[0].bind('<Button-1>',lambda event,item=item:click(item))
            item[0].bind('<Leave>',lambda event,item=item:buttonout(item))
            item[0].bind('<MouseWheel>',bindyview)
        lineheight=linew/3
        line=ui.create_line((1,linew/3,1,linew*2/3),fill=oncolor,width=3,capstyle='round')
        ui.config(scrollregion=ui.bbox('all'))
        ui.move(line,0,-linew-height)
        self.add_back((),(view,scro[-1]),fg=bg,bg=bg,linew=3)
        ui.bind('<MouseWheel>',bindyview)
        return ui,scro,items,uid

效果

测试代码

    lvitems=b.add_listview((1220,980))[2]
    lvcontent=(
    ('BasicTinUI','TinUI框架渲染核心','https://tinui.smart-space.com.cn'),
    ('TinUI','基于tkinter的现代元素控件框架','https://smart-space.com.cn/project/TinUI/index.html'),
    ('CSDN','中文IT技术交流平台','https://www.csdn.net/'),
    ('百度','全球领先的中文搜索引擎','https://www.baidu.com/'),
    ('Smart-Space','一个平凡的中国人','https://smart-space.com.cn')
    )
    for i in range(0,5):
        lvitems[i][2].loadxml(f'''<tinui>
        <line>
        <line>
        <title text='{lvcontent[i][0]}'></title>
        <link text='相关链接' url='{lvcontent[i][2]}'></link>
        </line>
        <line>
        <label text='{lvcontent[i][1]}'></label>
        </line>
        </line>
        </tinui>''')

最终效果

tkinter绘制组件(35)——列表视图


github项目

TinUI的github项目地址

pip下载

pip install tinui

结语

最近TinUI的pypi使用率上来了,但是维护频率下降了🥹。

🔆tkinter创新🔆文章来源地址https://www.toymoban.com/news/detail-437338.html

到了这里,关于tkinter绘制组件(35)——列表视图的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 03-微信小程序常用组件-视图容器组件

    微信小程序组件-视图容器 微信小程序包含了六大组件: 视图容器 、 基础内容 、 导航 、 表单 、 互动 和 导航 。这些组件可以通过WXML和WXSS进行布局和样式设置,从而构建出丰富的小程序界面和交互体验。 其中,视图容器组件包括view和scroll-view等,用于实现页面的结构和

    2024年02月12日
    浏览(43)
  • 【CocosCreator入门】CocosCreator组件 | PageView(页面视图)组件

           Cocos Creator 是一款流行的游戏开发引擎,具有丰富的组件和工具,其中的PageView组件是一种用于实现分页视图效果的重要组件。它可以让我们在游戏中实现各种分页视图效果,例如引导页、轮播图等。 目录 一、组件介绍 二、组件属性 三、组件使用  四、脚本示例

    2024年02月12日
    浏览(35)
  • vue3 - 使用reactive定义响应式数据进行列表赋值时,视图没有更新的解决方案

    在Vue 3.0 中我们使用 reactive() 定义的响应式数据的时候,当是一个数组或对象时,我们直接进行赋值,发现数据已经修改成功,但是页⾯并没有自动渲染成最新的数据;这是为什么呢? 就如同官网所说的reactive存在一些 局限性 :(官方的描述) 原因就是reactive函数会返回一个

    2024年02月13日
    浏览(57)
  • Android Studio App入门之列表视图ListView的讲解及实战(附源码 超详细必看)

    需要图片集或全部源码请点赞关注收藏后评论区留言~~ 如果想在页面上直接显示全部列表信息,就要引入新的列表视图ListView,列表视图允许在页面上分行展示相似的数据列表。 列表视图新增的属性与方法如下 divider 指定分割线的图形 dividerHeight 指定分割线的高度 listSelecto

    2023年04月22日
    浏览(45)
  • uni-app小程序父组件数据更新,实现自定义组件刷新视图

    之前错误的思路 新思路(忽略我的参数命名,写文章的时候方便。)

    2024年02月16日
    浏览(49)
  • [Angular 基础] - 视图封装 & 局部引用 & 父子组件中内容传递

    之前的笔记: [Angular 基础] - Angular 渲染过程 组件的创建 [Angular 基础] - 数据绑定(databinding) [Angular 基础] - 指令(directives) 以上为静态页面,即不涉及到跨组件交流的内容 以下涉及到组件内的沟通,从这开始数据就“活”了 [Angular 基础] - 自定义事件 自定义属性 下面的例子依旧

    2024年02月22日
    浏览(38)
  • 微信小程序-常用视图容器类组件[图文并茂 通俗易懂]

    目录 view scroll-view swiper和swiper-item text rich-text button image 普通视图区域 块级元素 类似HTML的div 使用效果: 代码展示: list.wxml list.wxss 可滚动的视图区域 常用来实现滚动列表的效果 使用效果: 代码展示: list.wxml list.wxss  轮播图容器组件 和 轮播图 item组件 更多了解属性 使用效果

    2024年02月09日
    浏览(48)
  • Unity UGUI的ScrollRect(滚动视图)组件的介绍及使用

    ScrollRect(滚动视图)是Unity UGUI中的一个常用组件,用于在UI界面中创建可滚动的区域。通过ScrollRect组件,可以实现在有限的空间内显示大量的内容,并且可以通过滑动手势来浏览内容。 ScrollRect组件通过将内容放置在一个可滚动的矩形区域内,然后通过拖动或滑动手势来改变

    2024年02月09日
    浏览(49)
  • 【Android笔记108】Android之翻转视图组件ViewFlipper的使用

    这篇文章,主要介绍Android之翻转视图组件ViewFlipper的使用。 目录 一、翻转视图ViewFlipper 1.1、什么是ViewFlipper 1.2、运行效果 (1)不带动画的效果

    2024年02月08日
    浏览(59)
  • 【Unity-UGUI控件全面解析】| ScrollView 滚动视图组件详解

    🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN 🙉 🎄 学习专栏推荐:Unity系统学习专栏 🌲 游戏制作专栏推荐:

    2024年02月06日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包