#1
  1. No Profile Picture
    Registered User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Dec 2017
    Posts
    2
    Rep Power
    0

    python curses module fix


    Only version 1.4 of curses compiles correctly - coding from versions after 1.4 (note there is a version 1.5; but, it's the exact same 'working' code as version 1.4 - supposedly coded or modified by tim one (36560 2004-07-18 06:16:08Z tim_one) from Python 2.4 - present or as-of Python 3.6.3 is flawed, you can copy and past the bottom half (where the def of wrapper is started or the commented area describing wrapper) of the Python 3.6.3 code (curses version 2.2) into curses version 1.4 and it will compile correctly. If you are using ASCII in your program and are on a Windows machine, you can use the Command Prompt to execute the .py file and not from IDLE (Integrated Development and Learning Environment). - example G:\Python36-32>python tclock.py - just make sure the file (the file you are trying to run - tclock.py) is in the directory of the python.exe or the directory of python is in your path.

    How to set the path and environment variables in Windows
    https://www.computerhope.com/issues/ch000549.htm

    IDLE is Pythonís Integrated Development and Learning Environment.
    https://docs.python.org/3/library/idle.html


    Code:
    from _curses import *
    import os as _os
    import sys as _sys
    
    #######can not find a use for this########################
        # we call setupterm() here because it raises an error
        # instead of calling exit() in error cases.
    #    setupterm(term=_os.environ.get("TERM", "unknown"),
    #             fd=_sys.__stdout__.fileno())
    #######can not find a use for this########################
    
    
    # copy and pasted below from version curses version 1.4 from Python 2.3 to 3.6.3 by by Koten - 2017/12/12 
    
    # Some constants, most notably the ACS_* ones, are only added to the C
    # _curses module's dictionary after initscr() is called.  (Some
    # versions of SGI's curses don't define values for those constants
    # until initscr() has been called.)  This wrapper function calls the
    # underlying C initscr(), and then copies the constants from the
    # _curses module to the curses package's dictionary.  Don't do 'from
    # curses import *' if you'll be needing the ACS_* constants.
    
    def initscr():
        import _curses, curses
        stdscr = _curses.initscr()
        for key, value in _curses.__dict__.items():
            if key[0:4] == 'ACS_' or key in ('LINES', 'COLS'):
                setattr(curses, key, value)
        
        return stdscr
    
    # This is a similar wrapper for start_color(), which adds the COLORS and
    # COLOR_PAIRS variables which are only available after start_color() is
    # called.
     
    def start_color():
        import _curses, curses
        retval = _curses.start_color()
        if hasattr(_curses, 'COLORS'):
            curses.COLORS = _curses.COLORS
        if hasattr(_curses, 'COLOR_PAIRS'):
            curses.COLOR_PAIRS = _curses.COLOR_PAIRS
        return retval 
    
    # Import Python has_key() implementation if _curses doesn't contain has_key()
    
    try:
        has_key
    except NameError:
        from has_key import has_key
    # ^^copy and pasted above from curses version 1.4 from Python 2.3 to 3.6.3 by Koten - 2017/12/12 ^^ - End-Of-Line - EOL
    
        
        
    # Wrapper for the entire curses-based application.  Runs a function which
    # should be the rest of your curses-based application.  If the application
    # raises an exception, wrapper() will restore the terminal to a sane state so
    # you can read the resulting traceback.
    
    def wrapper(func, *args, **kwds):
        """Wrapper function that initializes curses and calls another function,
        restoring normal keyboard/screen behavior on error.
        The callable object 'func' is then passed the main window 'stdscr'
        as its first argument, followed by any other arguments passed to
        wrapper().
        """
    
        try:
            # Initialize curses
            stdscr = initscr()
    
            # Turn off echoing of keys, and enter cbreak mode,
            # where no buffering is performed on keyboard input
            noecho()
            cbreak()
    
            # In keypad mode, escape sequences for special keys
            # (like the cursor keys) will be interpreted and
            # a special value like curses.KEY_LEFT will be returned
            stdscr.keypad(1)
    
            # Start color, too.  Harmless if the terminal doesn't have
            # color; user can test with has_color() later on.  The try/catch
            # works around a minor bit of over-conscientiousness in the curses
            # module -- the error return from C start_color() is ignorable.
            try:
                start_color()
            except:
                pass
    
            return func(stdscr, *args, **kwds)
        
        finally:
            # Set everything back to normal
            if 'stdscr' in locals():
                stdscr.keypad(0)
                echo()
                nocbreak()
                endwin()
  2. #2
  3. No Profile Picture
    Registered User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Dec 2017
    Posts
    2
    Rep Power
    0
    Sorry about that:
    this is the file location: G:\PythonXX\Lib\curses\
    and file name of file for the code above:__init__.py

IMN logo majestic logo threadwatch logo seochat tools logo