Hi Peter,

You have identified the crux of the matter. Basically what happens is that the 
import apparently locks the interpreter so that the graphics thread does not 
get a chance to run (import is atomic?). So any call into the graphics 
library (like creating a GraphWin) deadlocks, since the call cannot return 
until the thread runs, and the thread won't run until the import is complete.

I could "fix" this by having my graphics package delay the thread launch until 
the first graphics call is made. But that means _every_ graphics operation 
will have to check to see if the thread has been launched yet. Even if that's 
not a big efficiency issue (I'm not sure), it feels too ad hoc to me, so I've 
resisted doing it. I may resort to that in the next release.

By the way, I personally would pair the initGraphics() with a closeGraphics() 
operation that closes the window clean up at the end.

--John



On Monday 12 February 2007 10:59 am, Peter Drake wrote:
> I tried just tacking all of my procedural wrappers on to the end of
> your file so there would be no transitive import. Surprisingly, that
> didn't work. The trick you mention below DOES work, and I'll use that
> as a workaround.
>
> A clue, then: it's not the transitive importing that causes the
> problem, it's the importing of a file that calls GraphWin().
>
> Peter Drake
> Assistant Professor of Computer Science
> Lewis & Clark College
> http://www.lclark.edu/~drake/
>
> On Feb 9, 2007, at 1:09 PM, John Zelle wrote:
> > Peter,
> >
> > I should have caught this when you posted your file. There is a
> > bizarre import
> > interaction that I am aware of, but can't say that I fully understand
> > regarding my graphics library. It seems that Python imports are in
> > some-way,
> > somewhat atomic, and with the way my graphics library is set up
> > this can
> > produce this deadlock. I have a workaround for you. Move the
> > graphics setup
> > code in your module into a function:
> >
> > def initGraphics():
> >     global root
> >     root = z.GraphWin()
> >
> >     print "If you can't see the graphics window,"
> >     print "it's probably at the upper left"
> >     print "of your screen, behind this one."
> >
> > Then call this function once at the start of your graphics
> > programs. This is
> > what will now pop up the window. So your "junk" program becomes:
> >
> > from graphics2 import *
> > print "imported graphics2"
> > initGraphics()
> > background("red")
> >
> > If someone has a better understanding of Python module imports and
> > why that
> > causes a problem with my graphics package, I'd love to know how to
> > fix this
> > problem rather than working around it.
> >
> > --John
> >
> > On Friday 09 February 2007 1:36 pm, Peter Drake wrote:
> >> The graphics2.py file I supplied earlier (http://www.lclark.edu/
> >> ~drake/courses/cs0/graphics2.py) is a procedural front-end for
> >> Zelle's graphics.py.
> >>
> >> If I run the graphics2.py module, everything works fine, and I can
> >> issue commands interactively.
> >>
> >> A problem happens if I write ANOTHER program, say junk.py:
> >>
> >> from graphics2 import *
> >> print "imported graphics2"
> >> background("red")
> >>
> >> When I run this (within IDLE), it hangs trying to import graphics2.
> >> There is no error message or processor load, it just hangs.
> >>
> >> Can anyone explain (or reproduce) this behavior?
> >>
> >> Peter Drake
> >> Assistant Professor of Computer Science
> >> Lewis & Clark College
> >> http://www.lclark.edu/~drake/
> >>
> >>
> >>
> >> _______________________________________________
> >> Edu-sig mailing list
> >> Edu-sig@python.org
> >> http://mail.python.org/mailman/listinfo/edu-sig
> >
> > --
> > John M. Zelle, Ph.D.             Wartburg College
> > Professor of Computer Science    Waverly, IA
> > [EMAIL PROTECTED]          (319) 352-8360
> > _______________________________________________
> > Edu-sig mailing list
> > Edu-sig@python.org
> > http://mail.python.org/mailman/listinfo/edu-sig
>
> _______________________________________________
> Edu-sig mailing list
> Edu-sig@python.org
> http://mail.python.org/mailman/listinfo/edu-sig

-- 
John M. Zelle, Ph.D.             Wartburg College
Professor of Computer Science    Waverly, IA     
[EMAIL PROTECTED]          (319) 352-8360  
_______________________________________________
Edu-sig mailing list
Edu-sig@python.org
http://mail.python.org/mailman/listinfo/edu-sig

Reply via email to