0

元の質問:

押すとscript.pyファイルを実行するTkinterボタンがあります。

#-*- 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 コードから実行したときにアニメーションを再生する方法です。

4

2 に答える 2

0

このアニメーションの問題を回避する方法を思いがけず見つけたので、書き留めておく価値があると思いました。

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 が彼の回答で言及したことであることに気付きました。サブプロセスを調べましたが、この場合の使用方法はまだわかりません。

于 2015-06-28T04:07:03.457 に答える
0

発生した動作を再現できませんでした。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()

このように、ファイルを実行すると、句が一致し、ファイルが単独で実行されます。__name__ == '__main__'インポートすると、script関数は定義されますが実行されません。あなたのtkinterプログラムから、あなたはただする必要があります

import script

def callback():
    script.script()
于 2015-05-02T12:27:33.433 に答える