views:

130

answers:

3

The following code runs fine in my IDE (PyScripter), however it won't run outside of it. When I go into computer then python26 and double click the file (a .pyw in this case) it fails to run. I have no idea why it's doing this, can anyone please shed some light?

This is in windows 7 BTW.

My code:

#!/usr/bin/env python
import matplotlib


from mpl_toolkits.mplot3d import  axes3d,Axes3D
import matplotlib.pyplot as plt
from matplotlib import cm
import numpy as np
from numpy import arange, sin, pi
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figure
from matplotlib.ticker import LinearLocator, FixedLocator, FormatStrFormatter

import Tkinter
import sys

class E(Tkinter.Tk):
    def __init__(self,parent):
        Tkinter.Tk.__init__(self,parent)
        self.parent = parent


        self.protocol("WM_DELETE_WINDOW", self.dest)
        self.main()

    def main(self):
        self.fig = plt.figure()
        self.fig = plt.figure(figsize=(4,4))
        ax = Axes3D(self.fig)



        u = np.linspace(0, 2 * np.pi, 100)
        v = np.linspace(0, np.pi, 100)

        x = 10 * np.outer(np.cos(u), np.sin(v))
        y = 10 * np.outer(np.sin(u), np.sin(v))
        z = 10 * np.outer(np.ones(np.size(u)), np.cos(v))





        t = ax.plot_surface(x, y, z,  rstride=4, cstride=4,color='lightgreen',linewidth=1)




        self.frame = Tkinter.Frame(self)
        self.frame.pack(padx=15,pady=15)

        self.canvas = FigureCanvasTkAgg(self.fig, master=self.frame)

        self.canvas.get_tk_widget().pack(side='top', fill='both')


        self.canvas._tkcanvas.pack(side='top', fill='both', expand=1)



        self.btn = Tkinter.Button(self,text='button',command=self.alt)
        self.btn.pack()

    def alt (self):
        print 9
    def dest(self):
        self.destroy()
        sys.exit()



if __name__ == "__main__":
    app = E(None)
    app.title('Embedding in TK')
    app.mainloop()

EDIT:

I tried to import the module in the command line and got the following warning.

Python 2.6.5 (r265:79096, Mar 19 2010, 21:48:26) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import matplotlib
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python26\lib\site-packages\matplotlib\__init__.py", line 129, in <module>
    from rcsetup import defaultParams, validate_backend, validate_toolbar
  File "C:\Python26\lib\site-packages\matplotlib\rcsetup.py", line 19, in <module>
    from matplotlib.colors import is_color_like
  File "C:\Python26\lib\site-packages\matplotlib\colors.py", line 54, in <module>
    import matplotlib.cbook as cbook
  File "C:\Python26\lib\site-packages\matplotlib\cbook.py", line 168, in <module>
    class Scheduler(threading.Thread):
AttributeError: 'module' object has no attribute 'Thread'
>>>

EDIT(2)

I tried what McSmooth said and got the following output.

Python 2.6.5 (r265:79096, Mar 19 2010, 21:48:26) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import threading
>>> print threading.__file__
threading.pyc
>>> threading.Thread
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'Thread'
>>>
+1  A: 

You most likely need to adjust your PYTHONPATH; this is a list of directories Python uses to find modules. See also How to add to the pythonpath in windows 7? .

Matthew Flaschen
This error never means you need to fiddle with PYTHONPATH. The module is a standard library module, which should always be accessible. Furthermore, a module of that name is found, it just doesn't have the right contents.
Thomas Wouters
@Thomas, look at the history. He changed the question after I answered. When I posted my answer, there was no mention of `threading`. I don't think that justifies a downvote.
Matthew Flaschen
Messing with PYTHONPATH is rarely necessary, and jumping to the conclusion is unwarranted. I can't help but consider it a bad answer, even with the original question.
Thomas Wouters
+1  A: 

From Windows command shell get into python shell by typing python binary (you should get something like '>>>'). Here type import matplotlib (your package name which you are trying to import), if you get an error like ImportError: No module named matplotlib that means as Matthew F suggested you need to update your PYTHONPATH (either in User specific env or in Windows System env) otherwise post the error message that you are getting while running the script.

nethood
+5  A: 

unless you've been messing around with your standard library, it seems that you have a file named threading.py somewhere on your python path that is replacing the standard one. Try:

>>>import threading
>>>print threading.__file__

and make sure that it's the one in your python lib directory (it should beC:\python26\lib). If it's not the right file that's getting imported, then you'll have to rename the fake one to something else. If it is the right file, then try:

>>>threading.Thread

and see if that throws an exception in the REPL.

update

That's weird. on my system, it gives the name of the source file. either save as a file or run at the command line the following code to find it.

import os.path as op
import sys

files = (op.join(path, 'threading.py') for path in sys.path)
print filter(op.exists, files)
aaronasterling
I tried what you said, see edit(2)
Anteater7171
@Anteater, see update.
aaronasterling
Your code bought up this ['C:\\Python26\\Lib\\threading.py'] and a program I made with the same name, however I changed it's name and still having problems.
Anteater7171
Rename the `threading.pyc` file in the same directory as the "program" you made "with the same name".
Thomas Wouters
Yep, works great!
Anteater7171