【问题标题】:Python Curses showing segmentation faultPython Curses 显示分段错误
【发布时间】:2014-08-11 22:13:34
【问题描述】:

我正在尝试创建一个垫子,其中包含一堆文本,然后看起来会滚动浏览。 但是我只是遇到了分段错误?

import curses,sys
from curses import wrapper
import random,string

def main(stdscr):
    pad = curses.newpad(100, 100)
    pad_pos = 0
    exit = False

    a = ''.join(random.choice(string.lowercase) for x in range(5000))

    pad.addstr(0,0,str(a))
    pad.refresh(pad_pos,0, 0,0, 20,75)

    cmd = stdscr.getch()
    while not exit:
         if  cmd == curses.KEY_DOWN:
             pad_pos += 1
             try:
                 pad.refresh(pad_pos,0, 0,0, 20,75)
             except curses.error:
                 pass
         elif cmd == curses.KEY_UP:
             pad_pos -= 1
             try:
                 pad.refresh(pad_pos,0, 0,0, 20,75)
             except curses.error:
                 pass

wrapper(main)

编辑:我在 Centos 6 上的 Python 版本是 2.7.3。我认为这是通过 yum 安装的。

有什么想法吗?

【问题讨论】:

  • 你在哪个平台(包括版本)?你有什么 Python 版本,你是如何安装 Python 的? (具体来说,比如“我从 python.org 下载并运行了 3.4.1 64 位 Windows 安装程序”或“我正在使用 Apple 预装的 2.7.5”或“apt-get install python27 给了我 2.7.5 版" 或类似的。)
  • 另外,我假设wrapper(main) 被绑定到第 1 列,否则这个程序不会做任何事情。那么你剩下的缩进是对的,还是我们必须先猜测才能运行它?
  • 不用猜这是个错误,我已经更新了问题。
  • 我的第一个想法是,一旦你按下一个键,你的程序就会永远在那个循环中旋转,因为你再也不会调用getch(),而且可能你的平台不喜欢你调用refresh并以尽可能快的速度一遍一遍。 (显然,这将是 libcurses 或 Python 包装器中的错误,但仍然是您不应该触发的错误。)
  • 嗯。我尝试运行您的代码(在循环内移动 getch 调用之后),它对我来说很好。我看到乱码的文字很好,我可以滚动它。我在 Debian 上运行 python 2.7.3。

标签: python curses python-curses


【解决方案1】:

试试这个:

from __future__ import division  #You don't need this in Python3
import curses
from math import *



screen = curses.initscr()
curses.noecho()
curses.cbreak()
curses.start_color()
screen.keypad(1)
curses.init_pair(1,curses.COLOR_BLACK, curses.COLOR_CYAN)
highlightText = curses.color_pair(1)
normalText = curses.A_NORMAL
screen.border(0)
curses.curs_set(0)
box = curses.newwin(12,64,1,1)
box.box()


strings = ["a","b","c","d","e","f","g","h","i","l","m","n"]
row_num = len(strings)
max_row = 10
pages = int(ceil(row_num/max_row))
position = 1
page = 1
for i in range(1,max_row + 1):
    if row_num == 0:
        box.addstr(1,1,"There aren't strings", highlightText)
    else:
        if (i == position):
            box.addstr(i,2,strings[i-1], highlightText)
        else:
            box.addstr(i,2,strings[i-1],normalText)
        if i == row_num:
            break

screen.refresh()


box.refresh()

x = screen.getch()
while x != 27:
    if (x == curses.KEY_DOWN):
        if page == 1:
            if position < i:
                position = position + 1
            else:
                if pages > 1:
                    page = page +1
                    position = 1 + (max_row * (page - 1))
        elif page == pages:
            if position < row_num:
                position = position + 1
        else:
            if position < max_row+(max_row*(page-1)):
                position = position + 1
            else:
                page = page + 1
                position = 1 + (max_row * (page - 1))
    if (x == curses.KEY_UP):
        if page == 1:
            if position > 1:
                position = position - 1
        else:
            if position > (1 + (max_row*(page-1))):
                position = position - 1
            else:
                page = page - 1
                position = max_row + (max_row * (page - 1))
    if (x == curses.KEY_LEFT):
        if page > 1:
            page = page - 1
            position = 1 + (max_row * (page - 1))

    if (x == curses.KEY_RIGHT):
        if page < pages:
            page = page + 1
            position = (1 + (max_row * (page - 1)))


    box.erase()
    screen.border(0)
    box.border(0)

    for i in range(1+(max_row*(page-1)),max_row+1+(max_row*(page-1))):
        if row_num == 0:
            box.addstr(1,1,"There aren't strings", highlightText)
        else:

            if (i+(max_row*(page-1)) == position+(max_row*(page-1))):
                box.addstr(i-(max_row*(page-1)),2,strings[i-1], highlightText)
            else:

                box.addstr(i-(max_row*(page-1)),2,strings[i-1],normalText)
            if i == row_num:
                break



    screen.refresh()
    box.refresh()
    x = screen.getch()

curses.endwin()
exit()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-17
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 2013-10-08
    • 1970-01-01
    相关资源
    最近更新 更多