22057


python 2.7.10を使ってOSX(10.11.2)で  
<http://code.activestate.com/recipes/134892/>  
を参考にOSXでgetch()を実装しようとしたのですが、

AttributeError: 'module' object has no attribute 'EventAvail'  
というエラーが出てきます。

具体的なコードは下記の通りです。

[code]

    from Carbon import  Evt
    
    class _Getch:
        def __init__(self):
            import Carbon,Carbon.Evt
            Carbon.Evt
    
        def __call__(self):
            import Carbon
            if Evt.EventAvail(0x0008)[0]==0: # 0x0008 is the keyDownMask
                return ''
            else:
                (what,msg,when,where,mod)=Carbon.Evt.GetNextEvent(0x0008)[1]
                return chr(msg & 0x000000FF)
    
    getch = _Getch()
    
[/code]


CC BY-SA 3.0
2016-02-13T13:45:46.843
22049
2016-02-13T17:02:36.580
9517
question
python
python2.7.10,OSX(10.11.2)でCarbon.Evt.EventAvailが見つからない。


<https://docs.python.org/2/library/carbon.html#module-Carbon.Evt>  
マニュアルによると

> Most of the OS X APIs that these modules use are deprecated or removed  
>  in recent versions of OS X.

とのことで、使えなさそうです。コンソールで良いなら、次のようにselectを使えば、リアルタイム入力ができます。

[code]

    #!/usr/bin/env python
    import sys
    import select
    import tty
    import termios
    
    def main():
        while True:
            print "hit ESC key"
            r, w, e = select.select([sys.stdin], [], [], 0)
            if r and r[0] is sys.stdin:
                if r[0].read(1) == '\x1b':
                    break
    
    if __name__ == '__main__':
        term_settings = termios.tcgetattr(sys.stdin)
        try:
            tty.setcbreak(sys.stdin.fileno())
            main()
        finally:
            termios.tcsetattr(sys.stdin, termios.TCSADRAIN, term_settings)
    
[/code]


CC BY-SA 3.0
2016-02-13T17:02:36.580
22057
2016-02-13T17:02:36.580
7837
22049
answer