Windows下的Curses替代方案

44 投票
7 回答
61452 浏览
提问于 2025-04-17 15:17

有没有什么可以在Windows上使用的Python替代curses模块的东西?我查了Python的文档,上面说这个模块是用在Unix系统上的。我对这些不太了解,所以想知道有没有办法在Windows上使用curses模块,或者有没有什么类似的模块专门为Windows准备的?
[我使用的是Python 3.3]

7 个回答

36

最开始的问题是,Windows上有没有可以替代curses的东西。

一个答案是使用Win32控制台API。如果你已经对控制台API有一定了解,可以直接用Python和很棒的pywin32包来编程。

不过,我发现这个方法对我最近的项目来说太底层了。我也不太想让我的用户去安装PDcurses,而且我觉得curses对于像Python这样的现代面向对象语言来说也太底层了。

因此,我整理了一个高层次的跨平台API,可以满足大多数人对终端/控制台的需求。asciimatics这个包可以提供你大部分的输入和输出需求。如果你在Linux上,这是一种更人性化的方式来编程curses。如果你在Windows上,同样的类也可以直接使用,不需要额外的二进制依赖。下面是一个示例截图:

示例输出

还有很多其他效果和小部件可以使用,你可以在画廊中找到。如果你需要额外的功能,告诉我,我会看看能不能帮你实现。

77

我很高兴地告诉大家,现在有一个适用于Windows的Curses扩展可以在Windows上的Python中使用,大家可以从这里下载。(这个扩展不是我写的,我也不知道是谁在维护它。)

你只需要运行安装程序,然后在你的代码中使用import curses就可以开始使用Curses了。(我在64位的Windows 7和Windows 8上验证过可以正常运行。)

@ArtOfWarfare提到,你也可以通过Pip来安装这个扩展,使用以下命令:

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

那你可能就没什么好运气了。实际上没有真正的跨平台版本或者移植版的curses/ncurses,虽然有一个叫“dialogue”的移植版可以用,但功能比较有限。

你最好的选择是使用CygWin或MinGW32,这两者可以简单理解为一个Linux系统加上终端模拟器,里面有很多你需要的程序。它们可以在终端里运行原生的Linux/Unix程序,并且随时访问你“主机”上的系统文件,所以就像是在Windows上加了一个很强大的终端,里面有你在Linux世界里所有的好东西。

不过,你还是需要对Linux有一些基本的了解,知道命令怎么用等等,但这些你都能搞定的。

MinGW和CygWin的截图

这是一个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()

这是那段代码的输出:

在这里输入图片描述

撰写回答