2015-05-01 2 views
0

Оригинальный вопрос:Tkinter нажмите кнопку, чтобы запустить анимацию файл .py

У меня есть кнопка 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?

+0

Вы пытались использовать что-то вроде 'os.system()' или 'subprocess.call()'? В [doc для 'execfile'] (https://docs.python.org/2/library/functions.html#execfile) говорится:« Если оба словаря опущены, выражение выполняется в среде, где вызывается execfile() , «похоже, что это может вызвать проблемы. – TigerhawkT3

+0

Спасибо за лидерство! Я проведу вашу ссылку на 'execfile', а также узнаю о' os.system' и 'subprocess.call' больше. – user3852107

ответ

0

Я не смог воспроизвести поведение, с которым вы сталкиваетесь, выполнение прерываний в init.

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

Однако, вы можете перепроектировать приложение полагаться на более традиционные import выполнить код питона из другого файла. Вы можете изменить ваш 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() 
+0

Я проверил свой скрипт.py и, похоже, все в порядке. Может ли быть несовместимость версии? Я использую пакет Anaconda с Spyder, Python 2.7, NumPy 1.7.1, Matplotlib 1.3.1. Не могли бы вы рассказать мне об ошибках? Также я попробовал ваш метод, но фильм все еще не играет. Кроме того, первый кадр не будет рисоваться с помощью этого метода. Извините за обновление своего сообщения, чтобы отразить предлагаемое вами предложение. Я как-то понимаю, что то, как я это делаю, не является обычным, что я вижу из ответа @FabienAndre, в котором упоминается обычная часть 'import', а также комментарий @ TigerhawkT3. – user3852107

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 в своем ответе. Я просмотрел подпроцесс, но я все еще не уверен, как его использовать в этом случае.