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

       怎么实现呢?

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

        代码示例如下:

方式一:

import tkinter as tk
import time
import threading
#使用多线程中的定时器功能启动自循环的文字切片程序

i = 0

def gundong():
	global t1,i
	longtext = '''宽容似火。因为更进一层的宽容,不仅意味着不计较个人得失,还能用自己的爱与真诚来温暖别人的心。心平如水的宽容,已是难得;雪中送炭的宽容,更可贵,更令人感动。宽容,能融化彼此心中的冰冻,更将那股爱的热力射进对方心中。在这充满竞争的时代,人们所需要的不正是这种宽容吗?选择宽容,也就是选择了关爱和温暖,同时也选择了人生的海阔天空。'''
	while len(longtext)>= (i+6):
		text1 = ':  '+longtext[i:(i+6)]#不动的部分+滚动截取6个字
		time.sleep(1)
		i += 1
		if i+6 > len(longtext):
			i = 0
		var1.set(text1)	
							

t1 = threading.Timer(1,gundong)
t1.start()		

if __name__ == '__main__':
	text1 = '即将开始显示'
	window = tk.Tk()
	window.geometry('405x320+250+15')
	window.title('横向滚动文字')
	bg_label = tk.Label(window,width=70,height=24,bg='#ECf5EF').place(anchor='nw',x=0,y=0)
	var1 = tk.StringVar(value=text1)
	show_label1 = tk.Label(window,textvariable = var1,justify = 'left' , anchor = 'center',width = 17,height =3 ,bg = '#BFEFFF',font = '楷体 -40 bold',
						foreground= 'black').place(anchor = 'nw' , x = 21,y =0)
	window.mainloop()

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

方式二:

   

import tkinter as tk
import time
# 探索window.after()
i = 0
text1 = '即将开始显示'
longtext = '''宽容如水。宽容,即原谅他人的过错,不耿耿于怀,不锱铢必较,和和气气,做个大方的人。宽容如水般的温柔,在遇到矛盾时,往往比过激的报复更有效。它似一泓清泉,款款抹去彼此一时的敌视,使人冷静、清醒。
'''
def gundong():
	global i,text1,longtext
	if len(longtext) >= i+6:
		text1 = longtext[i:i+6]
		var1.set(text1)
		i += 1
		if i+6 > len(longtext):
			i = 0
	window.after(1000,gundong) # 函数每运行一次就新建一个定时器等待调用自身,以此实现间隔1秒循环运行
	#不用global window





if __name__ == '__main__':
	window = tk.Tk()
	window.geometry('405x320+250+15')
	window.title('横向滚动文字')
	bg_label = tk.Label(window,width=70,height=24,bg='#ECf5EF').place(anchor='nw',x=0,y=0)
	var1 = tk.StringVar(value=text1)
	show_label1 = tk.Label(window,textvariable = var1,justify = 'left' , anchor = 'center',width = 17,height =3 ,bg = '#BFEFFF',font = '楷体 -40 bold',
						foreground= 'black').place(anchor = 'nw' , x = 21,y =0)
	window.after(1000,gundong) # 先调用一次函数,然后函数内置该语句就会接着调用函数
    # 整点小活
	button1 = tk.Button(window,text = '开始鬼畜',command = gundong,width=14,height = 2 ,bg = '#A8A8A8',font = '楷体 -18 bold').place(
					anchor = 'nw' , x = 20,y =175) # 在已经有window.after()调用函数的情况下点击该按钮可以新建调用定时器,就会有鬼畜的效果,因为有多个文字切片程序在同时运行。
	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()的方式。

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

from tkinter import *
import time
import threading
import random

longtext1 = '''\
近日,美国一男子在自己农场干活时,居然挖到了700多枚美国南北战争期间的硬币。\
《纽约邮报》报道中提到,该男子挖出的700多枚硬币,是美国南北战争期间,这些硬币距今有近200年历史,价值至少数百万美元。\
据悉,这些硬币的命运将由这名男子决定,是自留还是选择捐出去。\
考古学家推测,硬币属于南北战争时期富有的肯塔基州人,他们在战争期间埋藏了大量金钱。\
这名美国男子的发现无疑是一夜暴富的机会。他不仅可以改变自己的命运,还可以影响整个家族的未来,不少网友直呼这位男子的运气真的是爆棚。'''

# 注意反斜杠\用来换行
longtext2 = '''\
网络交友需谨慎莫被小利骗昏头,湖北红安的凌女士是一名网络平台的主播,她在直播时,遇到了出手阔绰的“榜一大哥”熊某,\
经常为她刷礼物。两人关系日渐熟络,殊不知这只是熊某为日后对凌女士实施诈骗所做的铺垫。随着凌女士对熊某越来越信任,\
熊某开始上演一出出“借钱戏”。 二人交往期间,熊某以各种理由诈骗凌女士30余次,诈骗金额12万余元。'''

def gundong1(): # 第一种文字切片处理程序,通过Label.config()方法刷新界面,这里顺便把文字颜色也改一下
	global longtext1,Label1
	time.sleep(1)
	colors = {0:'hotpink',1:'navy',2:'slateblue',3:'limegreen',4:'turquoise',5:'olive',6:'tomato'}
	i = 0
	while True:
		if len(longtext1) >= i+9:
			text1 = longtext1[i:i+9]
			Label1.config(text= text1,fg = colors[random.randint(0,6)])
			i += 1
			if i+9 > len(longtext1):
				i = 0
		time.sleep(0.5)

def gundong2(): # 第二种文字切片处理程序,通过textvarible来刷新
	global longtext2,var1
	time.sleep(1)
	i = 0
	while True:
		if len(longtext2) >= i+9:
			text1 = longtext2[i:i+9]
			var1.set(text1)
			i += 1
			if i+9 > len(longtext2):
				i = 0
		time.sleep(0.5)



root = Tk() # 引用是from tkinter import *,所以不用root = tkinter.Tk()
root.title('文字滚动')
root.geometry('+300+200')
Label1 = Label(root,text='第一种文字刷新方法',width=20)
Label1.pack()
var1 = StringVar()
var1.set('第二种文字刷新方法')
Label2 = Label(root,textvariable=var1,width=20)
Label2.pack()

t1 = threading.Thread(target = gundong1)
t1.start()
t2 = threading.Thread(target = gundong2)
t2.start()
root.mainloop()

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