【问题标题】:Tkinter press a button to launch an animation .py fileTkinter 按下一个按钮来启动一个动画 .py 文件
【发布时间】:2015-05-01 07:39:38
【问题描述】:

原问题:

我有一个 Tkinter 按钮,按下它会执行一个 script.py 文件。

#-*- coding: utf-8 -*-
from Tkinter import *
master = Tk()
def callback():
    execfile("script.py")
b = Button(master, text="OK", command=callback)
b.pack()
mainloop()

script.py 是一个 2D 动画,它将打开一个动画窗口。

"""
A simple example of an animated plot
"""
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

fig, ax = plt.subplots()

x = np.arange(0, 2*np.pi, 0.01)        # x-array
line, = ax.plot(x, np.sin(x))

def animate(i):
    line.set_ydata(np.sin(x+i/10.0))  # update the data
    return line,

#Init only required for blitting to give a clean slate.
def init():
    line.set_ydata(np.ma.array(x, mask=True))
    return line,
ani = animation.FuncAnimation(fig, animate, np.arange(1,200),init_func=init,interval=25, blit=True)
plt.show()

当我运行上面的 Tkinter 代码并按下按钮调用动画时,动画只会显示第一帧。换句话说,动画将不会播放。但如果 script.py 从命令行运行,动画会正确播放。问题是,从 Tkinter 代码运行时如何播放动画?

【问题讨论】:

  • 您是否尝试过使用os.system()subprocess.call() 之类的东西? doc for execfile 表示“如果省略两个字典,则表达式将在调用 execfile() 的环境中执行”,这听起来可能会引起麻烦。
  • 感谢领导!我会检查您指向execfile 的链接,并了解更多关于os.systemsubprocess.call 的信息。

标签: python animation matplotlib tkinter execfile


【解决方案1】:

我无法重现您遇到的行为,init 中的执行中断。

File "script.py", line 19, in init
  line.set_ydata(np.ma.array(x, mask=True))

但是,您可以重新设计您的应用程序以依赖更传统的import 从另一个文件执行 python 代码。 您可以通过这种方式更改您的 script.py

#script.py
def script():
    #previous script.py content

if __name__ == '__main__':
    script()

这样,如果你运行文件,你 match __name__ == '__main__' 子句,你的文件将自行运行。导入时,script 函数将被定义但不执行。从您的 tkinter 程序中,您只需要

import script

def callback():
    script.script()

【讨论】:

  • 我检查了我的 script.py,它似乎没问题。会不会是版本不兼容?我正在使用带有 Spyder、Python 2.7、NumPy 1.7.1、Matplotlib 1.3.1 的 Anaconda 包。你介意告诉我错误信息吗?我也尝试了你的方法,但电影仍然无法播放。使用此方法也不会绘制第一帧。很抱歉更新您的帖子以反映您提出的建议。我确实明白我这样做的方式并不传统,我可以从@FabienAndre 的回复中看到提到传统的import 部分,也可以从@TigerhawkT3 的评论中看到。
【解决方案2】:

我意外地找到了解决这个动画问题的方法,并认为值得写下来。

如果在 script.py 文件中,我从 execfile 函数返回一个全局变量,TK 按钮的动画回调现在将正确播放。

from Tkinter import *
master = Tk()
def callback():
    variables= {} #add a variable with witch execfile can return
    execfile("simple_anime.py",    variables)
b = Button(master, text="OK", command=callback)
b.pack()
mainloop()

这样就可以了。而且,我刚刚意识到,这就是 TigerhawkT3 在他的回答中提到的。我查看了子进程,但我仍然不确定在这种情况下如何使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多