web-dev-qa-db-fra.com

Curses alternative pour windows

Existe-t-il une alternative au module curses pour python à utiliser dans Windows? J'ai cherché dans la documentation python, mais il est mentionné que c'est pour utiliser unix. Je ne les connais pas beaucoup, est-il possible d'utiliser le module curses dans Windows ou existe-t-il un module similaire spécialement conçu pour Windows?

33
Chandan

J'ai bien peur que vous n'ayez plus de chance ... Il n'y a pas vraiment de version multiplateforme ni de portage de curses/ncurses, il existe un port de "dialogue" qui fonctionne, mais ses capacités sont limitées.

Votre meilleur choix est d’exécuter CygWin ou MinGW32, les deux étant, en termes lâches, un émulateur système + terminal Linux qui contient la plupart des fichiers binaires dont vous avez besoin. Ils peuvent exécuter des fichiers binaires Linux/Unix natifs à l'intérieur du terminal et accéder à vos fichiers système "Hôte" à tout moment. Vous aurez donc l'impression de patcher Windows avec un terminal génial avec tous vos goodies du monde Linux. Vous avez besoin de connaissances de base de Linux et du fonctionnement des commandes, etc., mais vous le saurez.

Screenshot of MinGW and CygWin

Voici un exemple d'interface graphique Pyglet:

import pyglet
from pyglet.gl import *

class main (pyglet.window.Window):
    def __init__ (self):
        super(main, self).__init__(800, 600, fullscreen = False)
        self.button_texture = pyglet.image.load('button.png')
        self.button = pyglet.Sprite.Sprite(self.button_texture)

        ## --- If you'd like to play sounds:
        #self.sound = pyglet.media.load('music.mp3')
        #self.sound.play()

        self.alive = 1

    def on_draw(self):
        self.render()

    def on_close(self):
        self.alive = 0

    def on_mouse_press(self, x, y, button, modifiers):
        if x > self.button.x and x < (self.button.x + self.button_texture.width):
            if y > self.button.y and y < (self.button.y + self.button_texture.height):
                self.alive = 0

    def on_key_press(self, symbol, modifiers):
        if symbol == 65307: # [ESC]
            self.alive = 0

    def render(self):
        self.clear()
        self.button.draw()
        self.flip()

    def run(self):
        while self.alive == 1:
            self.render()

            # -----------> This is key <----------
            # This is what replaces pyglet.app.run()
            # but is required for the GUI to not freeze
            #
            event = self.dispatch_events()


x = main()
x.run()

Voici la sortie de ce code:

enter image description here

9
Torxed

Je suis heureux d'annoncer qu'il existe maintenant une version Windows de Curses disponible en tant qu'extension pour Python sous Windows, à partir de ici . (Je ne l'ai pas écrit et je ne sais pas qui le maintient.)

Vous pouvez exécuter le programme d'installation et import curses pour exécuter les curses. (Vérifié sur Windows 7 et Windows 8 64 bits.)

@ArtOfWarfare indique que vous pouvez l'installer via Pip avec cette recommandation:

pip install http://www.lfd.uci.edu/~gohlke/pythonlibs/xugyqnq9/curses-2.2-cp27-none-win32.whl
72
ashes999

La question initiale était de savoir s'il existe une alternative aux malédictions sous Windows. 

Une solution consiste à utiliser le API de la console Win32 . Vous pouvez programmer cela directement en Python en utilisant l'excellent paquet pywin32 si vous êtes déjà familiarisé avec l'API de la console. 

Cependant, j'ai trouvé ce niveau trop bas pour mon projet récent. J'étais également moins enclin à forcer mes utilisateurs à créer/installer des PDcurses et, de plus, je trouve également les curses trop faibles pour un langage OO moderne comme Python. 

J'ai donc mis au point une API multiplate-forme de haut niveau pour faire tout ce que la plupart des gens attendent de leur terminal/console. Le package asciimatics fournira la plupart de vos besoins en entrée et en sortie. Si vous êtes sur Linux, c'est une façon plus humaine de programmer des malédictions. Si vous utilisez Windows, la même classe fonctionne telle quelle, sans dépendance binaire externe. Voir ci-dessous pour un exemple de capture d'écran:

Sample output

Il existe de nombreux autres effets et widgets disponibles que vous pouvez trouver dans la galerie , mais s'il y a une fonctionnalité supplémentaire dont vous avez besoin, faites-le-moi savoir et je verrai ce que je peux faire.

24
Peter Brittain

Ce n'est pas une nouvelle solution, juste une modification d'une précédente.

Si la commande pip génère une erreur 404, vous pouvez essayer de télécharger le paquet depuis http://www.lfd.uci.edu/~gohlke/pythonlibs/#curses et ensuite écrire quelque chose comme 

pip install C:\..packetPath..\curses-2.2-cp35-none-win_AMD64.whl
1
Lossan

Vous pouvez essayer celui-ci. J'ai fait une fois le port Win64 pour cela (fusionné là dedans). Cependant, vous devez écrire votre code Python un peu différent. Celui-ci redirigera tous les appels curses vers la version Python native sous UNIX, mais appellera PDCURSES.DLL sous Windows (téléchargez le DLL séparément). Il supporte l'unicode pour autant que je m'en souvienne:

http://sourceforge.net/projects/pyunicurses/

1
Flo

Voici comment installer à quoi ashes999 lié dans leur réponse via pip:

pip install http://www.lfd.uci.edu/~gohlke/pythonlibs/xugyqnq9/curses-2.2-cp27-none-win32.whl

Cela devrait probablement être ajouté à PyPI pour rendre l'installation avec pip encore plus simple (afin de pouvoir l'installer par nom plutôt que par URL).

1
ArtOfWarfare

La doc officielle propose ce qui suit ( ici au bas du paragraphe):

La version Windows de Python n’inclut pas le curses module . Une version portée appelée UniCurses est disponible. Vous pouvez aussi try le module Console écrit par Fredrik Lundh, qui ne le fait pas .__ utilise la même API que les curses mais fournit une sortie de texte adressable par le curseur et prise en charge complète de la souris et du clavier.

0
JeromeJ