Python中的Curses库

0 投票
2 回答
1270 浏览
提问于 2025-04-17 22:47

我有一段C语言代码,它可以在屏幕的中央画出一条竖线和一条横线,如下所示:

#include<stdio.h>
#define HLINE for(i=0;i<79;i++)\
                  printf("%c",196);
#define VLINE(X,Y) {\
                     gotoxy(X,Y);\
                     printf("%c",179);\
                   }
int main()
{
  int i,j;
  clrscr();
  gotoxy(1,12);
  HLINE
  for(y=1;y<25;y++)
      VLINE(39,y)
  return 0;
}

我正在尝试把它直接转换成Python 2.7.6的版本:

import curses
def HLINE():
    for i in range(0,79):
        print "%c" % 45
def VLINE(X,Y):
    curses.setsyx(Y,X)
    print "%c" % 124
curses.setsyx(12,1)
HLINE()
for y in range(1,25):
    VLINE(39,y)

我有几个问题:

1. 在setsyx这个函数中,我们需要改变x和y的位置吗?也就是说,gotoxy(1,12)要变成setsyx(12,1)吗?

2. Curses模块只在Unix系统上可用,而在Windows上不行吗?如果是这样,那Windows(Python 2.7.6)该怎么办呢?

3. 为什么在Python中,字符值179和196显示为�,而在C语言中,它们分别是|和-呢?

4. 上面的Python代码是完全正确的吗,还是需要一些改进?

2 个回答

0
  1. 是的。
  2. 这个问题和Windows下的Curses替代方案是重复的。
  3. 你可能在用Python 2.x,所以你的字符是字节,这就和编码有关了。一个数字值的具体含义是由你使用的编码决定的。你在Linux上很可能用的是utf8编码,而在Windows程序中用的可能不是utf8,所以你不能直接比较这些值。在使用curses时,你应该用curses.ACS_HLINEcurses.ACS_VLINE
  4. 你不能把printcurses的函数混在一起用,这样会搞乱显示。应该用curses.addch或者其他类似的函数。
1
  1. 是的,你需要调整参数的位置。也就是说,setsyx(y, x)gotoxy(x, y) 这两个函数的参数顺序要换一下。

  2. 有一些Windows的库可以使用。我觉得这里有很多有用的二进制文件:链接

  3. 这很可能和unicode格式有关。你可以尝试在你的Python文件顶部添加以下一行(在#!/usr/bin/python那行之后),这样可以强制Python使用utf-8编码处理字符串对象:
    # -*- coding: utf-8 -*-
  4. 你的Python代码看起来还不错,我觉得没必要太担心。

撰写回答