当前位置:   article > 正文

python小白文:在tkinter浮窗上滚动显示一段长文字的几种方式。_windows 桌面 逐行显示 文本 python

windows 桌面 逐行显示 文本 python

        假设想在一个Label或Message中显示一段长文本,因为文本中字数太多,一下全部放出来显示在界面上太占空间;于是只好把它做成一次显示几个字,随着时间推移循环向后刷新后面的文字,就像老商超门口上面的红色LED点阵文字显示屏一样。

       怎么实现呢?

       我们把要显示的长文本放到一个变量里,它做为一个长字符串,我们对其进行切片处理,随着时间推移切出tkinter界面上需要显示的短文字片,并将短文字片与tkinter的控件相关联。需要一个定时器和一个切片程序以及一个tkinter的文本变量关联可变字符串。

        代码示例如下:

方式一:

  1. import tkinter as tk
  2. import time
  3. import threading
  4. #使用多线程中的定时器功能启动自循环的文字切片程序
  5. i = 0
  6. def gundong():
  7. global t1,i
  8. longtext = '''宽容似火。因为更进一层的宽容,不仅意味着不计较个人得失,还能用自己的爱与真诚来温暖别人的心。心平如水的宽容,已是难得;雪中送炭的宽容,更可贵,更令人感动。宽容,能融化彼此心中的冰冻,更将那股爱的热力射进对方心中。在这充满竞争的时代,人们所需要的不正是这种宽容吗?选择宽容,也就是选择了关爱和温暖,同时也选择了人生的海阔天空。'''
  9. while len(longtext)>= (i+6):
  10. text1 = ': '+longtext[i:(i+6)]#不动的部分+滚动截取6个字
  11. time.sleep(1)
  12. i += 1
  13. if i+6 > len(longtext):
  14. i = 0
  15. var1.set(text1)
  16. t1 = threading.Timer(1,gundong)
  17. t1.start()
  18. if __name__ == '__main__':
  19. text1 = '即将开始显示'
  20. window = tk.Tk()
  21. window.geometry('405x320+250+15')
  22. window.title('横向滚动文字')
  23. bg_label = tk.Label(window,width=70,height=24,bg='#ECf5EF').place(anchor='nw',x=0,y=0)
  24. var1 = tk.StringVar(value=text1)
  25. show_label1 = tk.Label(window,textvariable = var1,justify = 'left' , anchor = 'center',width = 17,height =3 ,bg = '#BFEFFF',font = '楷体 -40 bold',
  26. foreground= 'black').place(anchor = 'nw' , x = 21,y =0)
  27. window.mainloop()

threading.timer启动切片程序,切片程序使用while维持自循环

方式二:

   

  1. import tkinter as tk
  2. import time
  3. # 探索window.after()
  4. i = 0
  5. text1 = '即将开始显示'
  6. longtext = '''宽容如水。宽容,即原谅他人的过错,不耿耿于怀,不锱铢必较,和和气气,做个大方的人。宽容如水般的温柔,在遇到矛盾时,往往比过激的报复更有效。它似一泓清泉,款款抹去彼此一时的敌视,使人冷静、清醒。
  7. '''
  8. def gundong():
  9. global i,text1,longtext
  10. if len(longtext) >= i+6:
  11. text1 = longtext[i:i+6]
  12. var1.set(text1)
  13. i += 1
  14. if i+6 > len(longtext):
  15. i = 0
  16. window.after(1000,gundong) # 函数每运行一次就新建一个定时器等待调用自身,以此实现间隔1秒循环运行
  17. #不用global window
  18. if __name__ == '__main__':
  19. window = tk.Tk()
  20. window.geometry('405x320+250+15')
  21. window.title('横向滚动文字')
  22. bg_label = tk.Label(window,width=70,height=24,bg='#ECf5EF').place(anchor='nw',x=0,y=0)
  23. var1 = tk.StringVar(value=text1)
  24. show_label1 = tk.Label(window,textvariable = var1,justify = 'left' , anchor = 'center',width = 17,height =3 ,bg = '#BFEFFF',font = '楷体 -40 bold',
  25. foreground= 'black').place(anchor = 'nw' , x = 21,y =0)
  26. window.after(1000,gundong) # 先调用一次函数,然后函数内置该语句就会接着调用函数
  27. # 整点小活
  28. button1 = tk.Button(window,text = '开始鬼畜',command = gundong,width=14,height = 2 ,bg = '#A8A8A8',font = '楷体 -18 bold').place(
  29. anchor = 'nw' , x = 20,y =175) # 在已经有window.after()调用函数的情况下点击该按钮可以新建调用定时器,就会有鬼畜的效果,因为有多个文字切片程序在同时运行。
  30. window.mainloop()

after函数启动文字切片程序,文字切片程序通过不断调用after函数来维持自身的间隔性循环运行,变相实现自循环效果

这两种方式的区别在于维持文字切片程序自循环的方式不一样。

类似的思路,还有threading.timer启动切片程序,切片程序不断新建after函数来实现循环(可以作为第三种方法)。

注意:

        一、不要使用threading.timer启动切片程序,切片程序使用threading.timer来实现自循环功能,它虽然也可以运行,但会不断创建新的线程,造成资源浪费

        二、 不要使用after函数启动切片程序,切片程序使用while函数实现自循环(需新加window.update()来刷新tk界面),虽然文字可以刷新显示,但tk的按钮无法使用,似乎由于主进程进入while循环无法返回到mainloop循环中。当切片程序使用while循环时,最好将其放到一个单独的线程中运行。

另外在TKinter界面的Label上动态更新文字也有两种方法,一种通过Label.config(text='新文字',fg='新颜色',bg='新背景颜色')来配置,这种方法支持更改很多Label的属性,另一种就是本文前两个演示代码片段使用的textvariable=StringVar()的方式。

下面代码把两种刷新方式同时展示:

  1. from tkinter import *
  2. import time
  3. import threading
  4. import random
  5. longtext1 = '''\
  6. 近日,美国一男子在自己农场干活时,居然挖到了700多枚美国南北战争期间的硬币。\
  7. 《纽约邮报》报道中提到,该男子挖出的700多枚硬币,是美国南北战争期间,这些硬币距今有近200年历史,价值至少数百万美元。\
  8. 据悉,这些硬币的命运将由这名男子决定,是自留还是选择捐出去。\
  9. 考古学家推测,硬币属于南北战争时期富有的肯塔基州人,他们在战争期间埋藏了大量金钱。\
  10. 这名美国男子的发现无疑是一夜暴富的机会。他不仅可以改变自己的命运,还可以影响整个家族的未来,不少网友直呼这位男子的运气真的是爆棚。'''
  11. # 注意反斜杠\用来换行
  12. longtext2 = '''\
  13. 网络交友需谨慎莫被小利骗昏头,湖北红安的凌女士是一名网络平台的主播,她在直播时,遇到了出手阔绰的“榜一大哥”熊某,\
  14. 经常为她刷礼物。两人关系日渐熟络,殊不知这只是熊某为日后对凌女士实施诈骗所做的铺垫。随着凌女士对熊某越来越信任,\
  15. 熊某开始上演一出出“借钱戏”。 二人交往期间,熊某以各种理由诈骗凌女士30余次,诈骗金额12万余元。'''
  16. def gundong1(): # 第一种文字切片处理程序,通过Label.config()方法刷新界面,这里顺便把文字颜色也改一下
  17. global longtext1,Label1
  18. time.sleep(1)
  19. colors = {0:'hotpink',1:'navy',2:'slateblue',3:'limegreen',4:'turquoise',5:'olive',6:'tomato'}
  20. i = 0
  21. while True:
  22. if len(longtext1) >= i+9:
  23. text1 = longtext1[i:i+9]
  24. Label1.config(text= text1,fg = colors[random.randint(0,6)])
  25. i += 1
  26. if i+9 > len(longtext1):
  27. i = 0
  28. time.sleep(0.5)
  29. def gundong2(): # 第二种文字切片处理程序,通过textvarible来刷新
  30. global longtext2,var1
  31. time.sleep(1)
  32. i = 0
  33. while True:
  34. if len(longtext2) >= i+9:
  35. text1 = longtext2[i:i+9]
  36. var1.set(text1)
  37. i += 1
  38. if i+9 > len(longtext2):
  39. i = 0
  40. time.sleep(0.5)
  41. root = Tk() # 引用是from tkinter import *,所以不用root = tkinter.Tk()
  42. root.title('文字滚动')
  43. root.geometry('+300+200')
  44. Label1 = Label(root,text='第一种文字刷新方法',width=20)
  45. Label1.pack()
  46. var1 = StringVar()
  47. var1.set('第二种文字刷新方法')
  48. Label2 = Label(root,textvariable=var1,width=20)
  49. Label2.pack()
  50. t1 = threading.Thread(target = gundong1)
  51. t1.start()
  52. t2 = threading.Thread(target = gundong2)
  53. t2.start()
  54. root.mainloop()

可能发布的时候会改变代码布局,有需要可以在评论区咨询。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/686907
推荐阅读
相关标签
  

闽ICP备14008679号