Windows下的Curses替代方案

44

在Windows中,有没有Python的curses模块的替代品?我在Python文档中查找了一下,但是只提到可以在Unix中使用。由于我对此不太熟悉,所以是否有一些方法可以在Windows中使用curses模块,或者是否有一些专门针对Windows的类似模块? [我正在使用Python 3.3]


2
我已经成功地使用这里发布的二进制文件:http://www.lfd.uci.edu/~gohlke/pythonlibs/#curses,但是它们没有Python 3.3的版本。 - Matt
1
这是你自己使用的吗?你能使用 Cygwin 吗? - salezica
1
如果你不使用Linux,那么考虑使用一个真正的GUI吧?Qt很棒。 - JBernardo
好的,还有PDCurses:https://dev59.com/questions/QXVC5IYBdhLWcg3w9GA9 - Ehtesh Choudhury
@JBernardo 暗示 Linux 没有 GUI,哈哈(开玩笑的,尽管你这么说...) - Thomas
显示剩余4条评论
7个回答

77

很高兴地报告,现在有一个 Windows 版本的 Curses 扩展可以供 Python 在 Windows 上使用,可以从这里下载。(我没有编写它,也不知道谁维护它。)

您可以运行安装程序,并使用 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

3
@MarcelWilson 我不能为提供这个选项而自认功劳。我很高兴我自己发现了这个选项 :) - ashes999
2
我在为我的 Python curses 项目寻找库的时候,偶然发现了同样的网站,里面有许多其他的库! - Cold Diamondz
此链接已失效。 - David Hoelzer
@DavidHoelzer 看起来对我来说是有效的。没有安装程序,但 whl 文件仍然存在。例如:http://www.lfd.uci.edu/~gohlke/pythonlibs/f9r7rmd8/curses-2.2-cp36-cp36m-win32.whl - ashes999
是的,很有趣... 前往页面可以正常工作,但直接访问URL会返回404错误。 - David Hoelzer
显示剩余5条评论

36

原问题是在windows上是否有与curses相似的技术 替代方案

一个答案是使用Win32控制台API。 如果您已经熟悉控制台API,可以直接使用优秀的pywin32包在Python中编程。

然而,我发现这对于我的最近项目来说太低级了。 我也不想强迫我的用户构建/安装PDcurses,并且除此之外,我还觉得像Python这样的现代面向对象语言的curses过于低级。

因此,我组合了一个高级跨平台API,可满足大多数人对其终端/控制台的需求。 asciimatics包将提供大部分的输入和输出需求。如果您使用Linux,这就是一种更加人性化的编程curses的方式。如果您正在使用Windows,则同一类别可以工作,无需外部二进制依赖项。请参见下面的示例截图:

Sample output

还有许多其他的效果和小部件可用,您可以在画廊中找到它们,但如果您需要额外的功能,请告诉我,我会看看我能做什么。


11
很抱歉,你的运气不太好。目前没有真正的跨平台版本或curses/ncurses的移植版本,有一个“dialogue”移植版本可以使用,但其功能有限。
你最好的选择是运行CygWin或MinGW32,它们都是“松散术语”下的Linux系统+终端模拟器,其中包含了你需要的大部分二进制文件。它们可以在终端内运行本地Linux/Unix二进制文件并随时访问你的“主机”系统文件,就像用来自Linux世界的好东西修补Windows的强大终端。 你仍然需要一些基本的Linux知识以及如何使用命令等方面的知识,但你会慢慢理解的。

Screenshot of MinGW and CygWin

这是一个Pyglet GUI的示例:

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()

这是该代码的输出结果:

enter image description here


1
实际上我想做的是一个带有自己GUI的程序。所以正如JBernardo所提到的,我认为Pyside会很好。 - Chandan
1
CygWin和MinGW将让您使用curses,这是您最初的问题描述 :)有很多出色的GUI(OpenGL)库可供选择,例如wxPython、PyGTK甚至Pygame和Pyglet :) - Torxed
哦,我明白了。我不知道它们。谢谢,我会去查看它们的。 - Chandan
你能帮我安装pyglet吗?我刚刚安装了它。但是当我写import pyglet时,它显示以下错误:File "C:\Python33\lib\site-packages\pyglet_init_.py", line 249 print '%s%s %s' % (indent, name, location) ^ SyntaxError: invalid syntax 你能帮忙解决一下吗? - Chandan
@Chandan 不客气,(顺便说一下,很可能是因为你正在使用Python3.X,而Alpha版本目前仅支持它):) 如果您认为问题已解决,请不要忘记将其标记为已解决 :) - Torxed
显示剩余4条评论

5

以下是通过pip安装ashes999在他们的答案中链接的内容的方法:

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

这个应该被添加到PyPI上,以便使用pip更加容易(这样可以通过名称而不是URL进行安装)。


我不确定为什么会被评为DV,但无论如何,我已经将其合并到我的答案中了。 - ashes999
此链接已失效。 - David Hoelzer

4
你可以尝试这个。我曾经为它做过Win64移植(已合并)。但是,你需要稍微改写一下你的Python代码。这个将把所有的curses调用重定向到UNIX上的本地Python版本,但在Windows上调用PDCURSES.DLL(需要单独下载DLL)。据我所记,它支持Unicode。

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


是的!就是Python官方文档中建议的那个。 - user26742873

4
这不是一个新的解决方案,只是对之前解决方案的编辑。
如果 pip 命令出现 404 错误,您可以尝试从 http://www.lfd.uci.edu/~gohlke/pythonlibs/#curses 下载包,然后写入类似于以下内容:
pip install C:\..packetPath..\curses-2.2-cp35-none-win_amd64.whl

2
官方文档提出了以下建议(在段落底部这里):

Windows 版本的 Python 不包括 curses 模块。 可以使用一个名为 UniCurses 的移植版本。您还可以尝试 Fredrik Lundh 编写的 Console 模块,它不使用与 curses 相同的 API,但提供光标可寻址的文本输出和完全支持鼠标和键盘输入。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接