最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python tkinter控件treeview的數(shù)據(jù)列表顯示的實(shí)現(xiàn)示例

 更新時(shí)間:2022年01月11日 09:53:36   作者:IronSimon  
本文主要介紹了python tkinter控件treeview的數(shù)據(jù)列表顯示的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

素材文件

  • result.txt
  • result2.txt

result.txt文件的數(shù)據(jù)來(lái)源是爬取貓眼電影前一百名的電影,而result2.txt文件只不過(guò)是內(nèi)容上把result.txt的內(nèi)容復(fù)制幾十次,使其數(shù)據(jù)足夠多,現(xiàn)截選如下:

{"排名": "1", "片名": "霸王別姬", "主演": "張國(guó)榮,張豐毅,鞏俐", "上映時(shí)間": "1993-01-01(中國(guó)香港)", "評(píng)分": "9.6"}
{"排名": "2", "片名": "羅馬假日", "主演": "格利高里·派克,奧黛麗·赫本,埃迪·艾伯特", "上映時(shí)間": "1953-09-02(美國(guó))", "評(píng)分": "9.1"}
{"排名": "3", "片名": "肖申克的救贖", "主演": "蒂姆·羅賓斯,摩根·弗里曼,鮑勃·岡頓", "上映時(shí)間": "1994-10-14(美國(guó))", "評(píng)分": "9.5"}
{"排名": "4", "片名": "這個(gè)殺手不太冷", "主演": "讓·雷諾,加里·奧德曼,娜塔莉·波特曼", "上映時(shí)間": "1994-09-14(法國(guó))", "評(píng)分": "9.5"}
{"排名": "5", "片名": "教父", "主演": "馬龍·白蘭度,阿爾·帕西諾,詹姆斯·肯恩", "上映時(shí)間": "1972-03-24(美國(guó))", "評(píng)分": "9.3"}
{"排名": "6", "片名": "泰坦尼克號(hào)", "主演": "萊昂納多·迪卡普里奧,凱特·溫絲萊特,比利·贊恩", "上映時(shí)間": "1998-04-03", "評(píng)分": "9.5"}
{"排名": "7", "片名": "龍貓", "主演": "日高法子,坂本千夏,糸井重里", "上映時(shí)間": "1988-04-16(日本)", "評(píng)分": "9.2"}
{"排名": "8", "片名": "唐伯虎點(diǎn)秋香", "主演": "周星馳,鞏俐,鄭佩佩", "上映時(shí)間": "1993-07-01(中國(guó)香港)", "評(píng)分": "9.2"}
{"排名": "9", "片名": "千與千尋", "主演": "柊瑠美,入野自由,夏木真理", "上映時(shí)間": "2001-07-20(日本)", "評(píng)分": "9.3"}
{"排名": "10", "片名": "魂斷藍(lán)橋", "主演": "費(fèi)雯·麗,羅伯特·泰勒,露塞爾·沃特森", "上映時(shí)間": "1940-05-17(美國(guó))", "評(píng)分": "9.2"}
{"排名": "11", "片名": "亂世佳人", "主演": "費(fèi)雯·麗,克拉克·蓋博,奧利維婭·德哈維蘭", "上映時(shí)間": "1939-12-15(美國(guó))", "評(píng)分": "9.1"}

實(shí)現(xiàn)效果

版本一實(shí)現(xiàn)的代碼:

# -*- coding: utf-8 -*-
"""
Created on Fri Jan  4 13:44:40 2019
@author: HJY
"""
 
import tkinter as tk
from tkinter import ttk
import re
import time
 
#固定
pattern = '{"排名": "(.*?)", "片名": "(.*?)", "主演": "(.*?)", "上映時(shí)間": "(.*?)", "評(píng)分": "(.*?)"}\n'
patch = re.compile(pattern)
 
class info():
    def __init__(self,):
        self.root = tk.Tk()
        self._setpage()
               
    def _setpage(self,):
        start= time.time()
        
        self.scrollbar = tk.Scrollbar(self.root,)
        self.scrollbar.pack(side=tk.RIGHT,fill=tk.Y)
           
        title=['1','2','3','4','5',]
        self.box = ttk.Treeview(self.root,columns=title,
                                yscrollcommand=self.scrollbar.set,
                                show='headings')
        
        self.box.column('1',width=50,anchor='center')
        self.box.column('2',width=200,anchor='center')
        self.box.column('3',width=300,anchor='center')
        self.box.column('4',width=150,anchor='center')
        self.box.column('5',width=50,anchor='center')
        
        self.box.heading('1',text='Range')
        self.box.heading('2',text='Flim Name')
        self.box.heading('3',text='Actor')
        self.box.heading('4',text='Time')
        self.box.heading('5',text='Score')
        
        self.dealline()
                
        self.scrollbar.config(command=self.box.yview)
        self.box.pack()
 
        end=time.time()
        tk.Label(self.root,text=end-start,fg='red').pack()
        tk.Button(self.root,text='Look',bg='green',).pack()
                
    def readdata(self,):    
        """逐行讀取文件"""    
        
        #讀取gbk編碼文件,需要加encoding='utf-8'
        f = open('result.txt','r',encoding='utf-8')
        line = f.readline()
        while line:
            yield line
            line = f.readline()            
        f.close()
        
    def dealline(self,):
        op = self.readdata()
        while 1:
            try:
                line = next(op)
            except StopIteration as e:
                break
            else:
                result = patch.match(line)
                self.box.insert('','end',values=[result.group(i) for i in range(1,6)])
                                
             
if __name__ == '__main__':
    op = info()
    op.root.mainloop()

首先這里引入yield的用法,實(shí)現(xiàn)逐行讀取文件,迭代器只有在每一次next()的時(shí)候才會(huì)產(chǎn)生下一條數(shù)據(jù),而不需要一次性讀取整份文件,處理文件中的每行數(shù)據(jù)并且保存結(jié)果,這種方式可以有效的避免面對(duì)大文件時(shí)的處理時(shí)間以及內(nèi)存等問(wèn)題。
但這里還是等文件中的數(shù)據(jù)都處理好都插入tkinter控件中時(shí),才執(zhí)行下一步的程序(也就是self.dealline()之后的程序語(yǔ)句),這會(huì)造成什么問(wèn)題呢?如果處理的是result.txt文件那種只有100條數(shù)據(jù)的文件,用戶不會(huì)感受到什么,但若處理result2.txt那樣的文件,那么就會(huì)感覺(jué)到卡頓,似乎要等一會(huì)才顯示應(yīng)用程序。

解決思路

可否一開始只向控件中插入10條或者50條數(shù)據(jù),當(dāng)用戶瀏覽到第10條數(shù)據(jù)時(shí)就馬上加載接下來(lái)的10條數(shù)據(jù)?

實(shí)現(xiàn)一:綁定鼠標(biāo)的滾輪事件,一旦監(jiān)聽到下滾事件,就觸發(fā)加載。
實(shí)現(xiàn)二:當(dāng)用戶點(diǎn)擊按鈕時(shí),就加載數(shù)據(jù)。這種一般用于翻頁(yè)等等。
實(shí)現(xiàn)三:當(dāng)用戶拖拽滑塊到底端時(shí),若還有數(shù)據(jù)沒(méi)加載完,就觸發(fā)加載(為實(shí)現(xiàn))。

改進(jìn)后代碼實(shí)現(xiàn)

# -*- coding: utf-8 -*-
"""
Created on Tue Jan  8 13:45:21 2019
@author: HJY
"""
 
# -*- coding: utf-8 -*-
"""
Created on Fri Jan  4 13:44:40 2019
@author: HJY
"""
 
import tkinter as tk
from tkinter import ttk
 
import re
import time
 
#固定
pattern = '{"排名": "(.*?)", "片名": "(.*?)", "主演": "(.*?)", "上映時(shí)間": "(.*?)", "評(píng)分": "(.*?)"}\n'
patch = re.compile(pattern)
 
 
class info():
    def __init__(self,):
        self.root = tk.Tk()
        self._setpage()       
        
    def _setpage(self,):
        start= time.time()
        
        self.scrollbar = tk.Scrollbar(self.root,command=self.moveScroll)
        self.scrollbar.bind("<MouseWheel>",self.moveScroll)
        self.scrollbar.pack(side=tk.RIGHT,fill=tk.Y)
    
        
        title=['1','2','3','4','5',]
        self.box = ttk.Treeview(self.root,columns=title,
                                yscrollcommand=self.scrollbar.set,
                                show='headings')
        self.box.bind("<MouseWheel>",self.moveScroll)
        
        self.box.column('1',width=50,anchor='center')
        self.box.column('2',width=200,anchor='center')
        self.box.column('3',width=300,anchor='center')
        self.box.column('4',width=150,anchor='center')
        self.box.column('5',width=50,anchor='center')
        
        self.box.heading('1',text='Range')
        self.box.heading('2',text='Flim Name')
        self.box.heading('3',text='Actor')
        self.box.heading('4',text='Time')
        self.box.heading('5',text='Score')
        
        #對(duì)象處理
        self.op = self.readdata()
        self.dealline(self.op)
        
        self.scrollbar.config(command=self.box.yview)
        self.box.pack()
 
        end=time.time()
        tk.Label(self.root,text=end-start,fg='red').pack()
        tk.Button(self.root,text='Look',bg='green',command=self.turn).pack()
        
        
    #翻頁(yè)模式,每點(diǎn)擊一次,加載多10條數(shù)據(jù)
    def turn(self):
#        self.scrollbar.set(0.89,0.99)    
#        print(self.scrollbar.get())
 
        self.dealline(self.op)
        
    #鼠標(biāo)滾動(dòng)模式,下滑時(shí)加載數(shù)據(jù)
    def moveScroll(self,event):
        if event.delta < 0:
            self.dealline(self.op)
               
    def dragScroll(self):
        #未實(shí)現(xiàn)
        pass
    
    def readdata(self,):    
        """逐行讀取文件"""    
        
        #讀取gbk編碼文件,需要加encoding='utf-8'
        f = open('result2.txt','r',encoding='utf-8')
        line = f.readline()
        while line:
            yield line
            line = f.readline()
            
        f.close()
       
    def dealline(self,op):
        self.cal = 0
        while 1:
            try:
                line = next(op)
            except StopIteration:
                break
            else:
                result = patch.match(line)
                self.box.insert('','end',values=[result.group(i) for i in range(1,6)])
                
                self.cal +=1
                if self.cal == 10:
                    break
 
 
 
if __name__ == '__main__':
    op = info()
    op.root.mainloop()

評(píng)注

這種模式的問(wèn)題:  
1、如果是數(shù)據(jù)是用來(lái)搜索的,而用戶沒(méi)有觸發(fā)加載,且所要搜索的數(shù)據(jù)并未在已經(jīng)加載的數(shù)據(jù)中,那么就會(huì)導(dǎo)致搜索不到。當(dāng)然,如果搜索時(shí)不基于控件中的數(shù)據(jù),而基于文件本身或者數(shù)據(jù)庫(kù)等,就不存在這種考慮的必要。另外,如果要求展
示搜索到的數(shù)據(jù)所在的行,那么就需要一旦搜索的數(shù)據(jù)行未加載,就要馬上加載到所搜索的數(shù)據(jù)為止的所有未加載數(shù)據(jù)。 

2、滾輪下滾時(shí),用戶還沒(méi)將數(shù)據(jù)翻到底端數(shù)據(jù),就觸發(fā)了加載。

新的想法

可以利用scrollbar控件的get()方法,獲得滑塊的位置,一旦滑塊的底端位置為1,則滑塊已經(jīng)到底端,此時(shí)觸發(fā)加載,又由于next()迭代器再?zèng)]有數(shù)據(jù)時(shí)會(huì)觸發(fā)stopiteration異常阻止加載,而若還有數(shù)據(jù)則加載。我們可以將這一過(guò)程實(shí)現(xiàn)為函數(shù),與scrollbar控件的command屬性綁定,這樣只要滑動(dòng)滑塊就會(huì)觸發(fā)函數(shù)調(diào)用。

但是我們已經(jīng)將其與treeview控件的yview函數(shù)綁定,聯(lián)動(dòng)實(shí)現(xiàn)滑塊滑動(dòng)列表框,所以我們需要把我們自己的實(shí)現(xiàn)嵌入這個(gè)yview函數(shù),或者yview函數(shù)嵌入我們實(shí)現(xiàn)的函數(shù)里,只是中間一些環(huán)節(jié)只有理解了yview函數(shù)的處理模式,才好做了。

到此這篇關(guān)于python tkinter控件treeview的數(shù)據(jù)列表顯示的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)python tkinter treeview列表顯示內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python中實(shí)現(xiàn)從目錄中過(guò)濾出指定文件類型的文件

    Python中實(shí)現(xiàn)從目錄中過(guò)濾出指定文件類型的文件

    這篇文章主要介紹了Python中實(shí)現(xiàn)從目錄中過(guò)濾出指定文件類型的文件,本文是一篇學(xué)筆記,實(shí)例相對(duì)簡(jiǎn)單,需要的朋友可以參考下
    2015-02-02
  • Python datetime時(shí)間格式化去掉前導(dǎo)0

    Python datetime時(shí)間格式化去掉前導(dǎo)0

    Python datetime時(shí)間格式化去掉前導(dǎo)0,在format string的%與flag之間,添加一個(gè)“-”即可
    2014-07-07
  • Python爬蟲之模擬知乎登錄的方法教程

    Python爬蟲之模擬知乎登錄的方法教程

    在爬蟲過(guò)程中,有些頁(yè)面在登錄之前是被禁止抓取的,這個(gè)時(shí)候就需要模擬登陸了,下面這篇文章主要給大家介紹了利用Python爬蟲模擬知乎登錄的方法教程,文中介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-05-05
  • Python遠(yuǎn)程創(chuàng)建docker容器的方法

    Python遠(yuǎn)程創(chuàng)建docker容器的方法

    這篇文章主要介紹了Python遠(yuǎn)程創(chuàng)建docker容器的方法,如果docker??ps找不到該容器,可以使用?docker?ps?-a查看所有的,然后看剛才創(chuàng)建的容器的STATUS是EXIT0還是EXIT1如果是1,那應(yīng)該是有報(bào)錯(cuò),使用?docker?logs?容器id命令來(lái)查看日志,根據(jù)日志進(jìn)行解決,需要的朋友可以參考下
    2024-04-04
  • Python中eval()函數(shù)的功能及使用方法小結(jié)

    Python中eval()函數(shù)的功能及使用方法小結(jié)

    python中eval(str)函數(shù)很強(qiáng)大,官方解釋為:將字符串str當(dāng)成有效的表達(dá)式來(lái)求值并返回計(jì)算結(jié)果,所以,結(jié)合math當(dāng)成一個(gè)計(jì)算器很好用
    2023-05-05
  • 利用Python裁切tiff圖像且讀取tiff,shp文件的實(shí)例

    利用Python裁切tiff圖像且讀取tiff,shp文件的實(shí)例

    這篇文章主要介紹了利用Python裁切tiff圖像且讀取tiff,shp文件的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-03-03
  • 解決python 文本過(guò)濾和清理問(wèn)題

    解決python 文本過(guò)濾和清理問(wèn)題

    文本過(guò)濾和清理所涵蓋的范圍非常廣泛,涉及文本解析和數(shù)據(jù)處理方面的問(wèn)題。這篇文章主要介紹了解決python 文本過(guò)濾和清理問(wèn)題,需要的朋友可以參考下
    2019-08-08
  • python scipy 稀疏矩陣的使用說(shuō)明

    python scipy 稀疏矩陣的使用說(shuō)明

    這篇文章主要介紹了python scipy 稀疏矩陣的使用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • pandas的resample重采樣的使用

    pandas的resample重采樣的使用

    這篇文章主要介紹了pandas的resample重采樣的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • Django操作session 的方法

    Django操作session 的方法

    這篇文章主要介紹了Django操作session 的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03

最新評(píng)論

炎陵县| 徐汇区| 疏附县| 耿马| 莱芜市| 伊宁市| 恩施市| 弥勒县| 昭苏县| 丘北县| 上栗县| 淮滨县| 冷水江市| 陵川县| 新乐市| 名山县| 涟源市| 无棣县| 云霄县| 邮箱| 黄冈市| 灵宝市| 舟山市| 广南县| 大安市| 衡东县| 娱乐| 定日县| 张家港市| 昌黎县| 宣城市| 龙川县| 新民市| 溧水县| 德兴市| 监利县| 逊克县| 莱芜市| 新密市| 祁连县| 交城县|