首先,谢谢你对这篇文章感兴趣,
但是呢,这个版本只是一个证明,请不要将其应用到你的软件里。因为这个版本仍有许多不完善的地方,譬如你甚至无法设置要移动的长度!
如果你真的对这个程序感兴趣,请花一分钟看完这些文字,谢谢!
总之,我觉得这真是干(丧)得(心)漂(病)亮(狂)。
因为是初版Demo,我也没考虑太多,还是人太懒,直接用进度条表示位置了。
我提供了两种动画,不太好解释,可以自己看看。
播放完毕后,会在程序目录下生成Position.html和Speed.html,这两个文件都是程序绘制的折线图,展示了每一帧相关变量的变化。
使用前,你需要安装pyecharts,用pip安装即可。请注意你需要带上“--user”参数。
话不多说,代码永远在最后……
import time import tkinter as tk import tkinter.ttk as ttk from pyecharts.charts import * from pyecharts import options as opts def play(sec): global pg,pgl print('====================') pg['value']=0 pgl['value']=0 x=0 xs=[] spd=0.0001 spds=[] sspd=0 sspds=[] for i in range(1,50+1): print('----------(帧数'+str(i)+'/50)') print('速度:'+str(spd)) print('速度增加值(sspd):'+str(sspd)) print('位置:'+str(x)) x+=spd if i<=15: spd+=sspd+0.00001 sspd+=0.025 elif i>=35: spd-=sspd-0.001 sspd-=0.02 if spd<=0.00001: spd=0 print('此帧不移动') pg['value']=x pgl['value']+=2 win.update() xs.append(x) spds.append(spd) sspds.append(sspd) time.sleep(sec) #绘折线图 linex=Line(init_opts=opts.InitOpts(page_title='NLA in Tkinter',width='1800px',height='800px')) linex.add_xaxis(range(1,50)) linex.add_yaxis('Position',xs,label_opts=opts.LabelOpts(is_show=False)) linex.set_global_opts(title_opts=opts.TitleOpts(title='NLA in Tkinter',subtitle='Graph of Frames and Values'),toolbox_opts=opts.ToolboxOpts(is_show=True),datazoom_opts=opts.DataZoomOpts(is_show=True,range_start=0,range_end=100)) linex.render("Position.html") linespd=Line(init_opts=opts.InitOpts(page_title='NLA in Tkinter',width='1800px',height='800px')) linespd.add_xaxis(range(1,50)) linespd.add_yaxis('Speed',spds,label_opts=opts.LabelOpts(is_show=False)) linespd.add_yaxis('SSPD',sspds,label_opts=opts.LabelOpts(is_show=False)) linespd.set_global_opts(title_opts=opts.TitleOpts(title='NLA in Tkinter',subtitle='Graph of Frames and Speed, SSPD'),toolbox_opts=opts.ToolboxOpts(is_show=True),datazoom_opts=opts.DataZoomOpts(is_show=True,range_start=0,range_end=100)) linespd.render("Speed.html") def playnos(sec): global pg,pgl print('====================') pg['value']=0 pgl['value']=0 x=0 xs=[] spd=5 spds=[] sspd=0.5 sspds=[] for i in range(0,50+1): print('----------(帧数'+str(i)+'/50)') print('速度:'+str(spd)) print('速度增加值(sspd):'+str(sspd)) print('位置:'+str(x)) x+=spd if i>=5: spd-=sspd-0.001 sspd+=0.00025 if spd<=0.001: spd=0 print('此帧不移动') elif sspd<=0: sspd=0 spd=0 print('此帧不变速且不移动') pg['value']=x*1.3 pgl['value']+=2 win.update() xs.append(x) spds.append(spd) sspds.append(sspd) time.sleep(sec) #绘折线图 linex=Line(init_opts=opts.InitOpts(page_title='NLA in Tkinter',width='1800px',height='800px')) linex.add_xaxis(range(1,50)) linex.add_yaxis('Position',xs,label_opts=opts.LabelOpts(is_show=False)) linex.set_global_opts(title_opts=opts.TitleOpts(title='NLA in Tkinter',subtitle='Graph of Frames and Values'),toolbox_opts=opts.ToolboxOpts(is_show=True),datazoom_opts=opts.DataZoomOpts(is_show=True,range_start=0,range_end=100)) linex.render("Position.html") linespd=Line(init_opts=opts.InitOpts(page_title='NLA in Tkinter',width='1800px',height='800px')) linespd.add_xaxis(range(1,50)) linespd.add_yaxis('Speed',spds,label_opts=opts.LabelOpts(is_show=False)) linespd.add_yaxis('SSPD',sspds,label_opts=opts.LabelOpts(is_show=False)) linespd.set_global_opts(title_opts=opts.TitleOpts(title='NLA in Tkinter',subtitle='Graph of Frames and Speed, SSPD'),toolbox_opts=opts.ToolboxOpts(is_show=True),datazoom_opts=opts.DataZoomOpts(is_show=True,range_start=0,range_end=100)) linespd.render("Speed.html") win=tk.Tk() win.title('非线性动画测试') tk.Label(win,text='非线性动画测试',font=('微软雅黑',25)).pack(fill=tk.X) tk.Label(win,text='非线性',font=('微软雅黑')).pack(fill=tk.X) pg=ttk.Progressbar(win) pg.pack(fill=tk.X) tk.Label(win,text='线性对比(可视作进度条)',font=('微软雅黑')).pack(fill=tk.X) pgl=ttk.Progressbar(win) pgl.pack(fill=tk.X) tk.Label(win,text='每帧间隔(秒)',font=('微软雅黑')).pack(fill=tk.X) wtenter=ttk.Entry(win) wtenter.pack(fill=tk.X) wtenter.insert(tk.END,'0.05') ttk.Button(win,text='开始 >>',command=lambda:play(float(wtenter.get()))).pack(fill=tk.X) ttk.Button(win,text='开始(无起始加速) >>',command=lambda:playnos(float(wtenter.get()))).pack(fill=tk.X) #自动大小 win.update() win.minsize(350,win.winfo_height()) win.mainloop()