unexpected error from Python 3.3.0

Alexis Lopez-Garcia alexis.lopezgarcia at gmail.com
Sat Sep 29 13:41:09 EDT 2012


Thanks for pointing me to the right direction.
It seems that GetConsoleScreenBufferInfo() is indeed returning 0 and
further investigation points to the error code 6 (ERROR_INVALID_HANDLE).
No idea why this is so but just doing a while loop until the call gets a
non-zero value seem to work as a fix.

On Sat, Sep 29, 2012 at 6:29 PM, Dave Angel <d at davea.name> wrote:

> On 09/29/2012 10:19 AM, Alexis Lopez-Garcia wrote:
> > Hi.
> >
> > I installed Python3.3.0 with python-3.3.0.amd64.msi on a win7 machine.
> >
> > While using this funcion (see below) from a script called by double
> > clicking on the .py file I get a "invalid variable "right" referenced
> > before assignment" error.
>
> You forgot to include the whole, actual error trace.
>
> > The weird thing is that launching the script from a cmd windows does no
> > give the error and if you repeactedly double click on the .py file
> > sometimes the error does not reproduce so I concluded it was a timing
> issue
> > between win7 and python.
> > So by trial and error I ended up fixing it by inserting a time.sleep(0.5)
> > on the function and now it works 100% of the time.
> >
> > These error did not show in Python3.2.3 and thus I don't know if I just
> > found a new bug or what.
> > I write it here so that more knowledgeable people could:
> >
> > 1. explains to me why the errors is happening
> see below.
> > 2. deems it a bug and maybe reports it on the Python site.
>
> Sure, report it to Microsoft.  For whatever reason, your call to
>
> GetConsoleScreenBufferInfo() is returning false (or something equivalent,
> like 0).  What does the Windows 7 documentation say about not attaching a
> console for a while?
>
>
> > below is the particular function giving the error with the fix line,
> which
> > is not in the original version
> >
> > def console_resize(width=80, height=24, buffer_height=600):
> >     '''Sets up the console size and buffer height.
> >
> >     @param width {int} Width of console in column value.
> >     @param height {int} Height of console in row value.
> >     @param buffer_height {int} Buffer console height in row value.
> >     '''
> >     from ctypes import windll, byref, create_string_buffer
> >     from ctypes.wintypes import SMALL_RECT, _COORD
> >     # Active console screen buffer
> >     # STD_OUTPUT_HANDLE -> -11, STD_ERROR_HANDLE -> -12)
> >     STDERR = -12
> >     # SMALL_RECT input
> >     LEFT = 0
> >     TOP = 0
> >     RIGHT = width - 1
> >     BOTTOM = height - 1
> >     # handle
> >     hdl = windll.kernel32.GetStdHandle(STDERR)
> >     csbi = create_string_buffer(22)
> >
> >     time.sleep(0.5)  # <--- FIX IS THIS LINE
> >
> >     res = windll.kernel32.GetConsoleScreenBufferInfo(hdl, csbi)
> >
> >     if res:
> >         import struct
> >         (bufx, bufy, curx, cury, wattr,
> >          left, top, right, bottom,
> >          maxx, maxy) = struct.unpack("hhhhHhhhhhh", csbi.raw)
>
> Your problem is you don't have an else clause.  How did you expect bufs,
> bufy, etc. to be initialized without executing that code.  So if the
> rest of the function doesn't make sense without a console, you should be
> skipping it, or throwing an exception, or returning, or something.
>
>
>
> >
> >     current_width = right - left + 1
>
> This happens to be the first time you tried to use one of those
> non-variables.  Naturally, it fails.
>
> >     current_height = bottom - top + 1
> >     current_buffer_height = bufy
> >
> >     if buffer_height < height:
> >         buffer_height = height
> >     # order of resizing avoiding some problems
> >     if current_buffer_height > buffer_height:
> >         rect = SMALL_RECT(LEFT, TOP, RIGHT, BOTTOM)  # (left, top, right,
> > bottom)
> >         windll.kernel32.SetConsoleWindowInfo(hdl, True, byref(rect))
> >
> >         bufsize = _COORD(width, buffer_height)  # columns, rows
> >         windll.kernel32.SetConsoleScreenBufferSize(hdl, bufsize)
> >     else:
> >         bufsize = _COORD(width, buffer_height)  # columns, rows
> >         windll.kernel32.SetConsoleScreenBufferSize(hdl, bufsize)
> >
> >         rect = SMALL_RECT(LEFT, TOP, RIGHT, BOTTOM)  # (left, top, right,
> > bottom)
> >         windll.kernel32.SetConsoleWindowInfo(hdl, True, byref(rect))
> >
> >
> >
> --
>
> DaveA
>
>


-- 
There are more things in heaven and earth, Horatio,
Than are dreamt of in your philosophy.

Alexis Lopez-Garcia
alexis.lopezgarcia at gmail.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20120929/3525869e/attachment.html>


More information about the Python-list mailing list