简体   繁体   中英

Python - curses.window method addstr ignores x-coordinate on some lines

I am trying to display some formatted text in python using curses . I am having a strange issue with the curses.window object, specifically with the addstr method 1 . I want to call this method a few times, and with each call add a string to a different line. Here is a sample:

import curses

scr = curses.initscr()
curses.reset_shell_mode()
scr.clear()
scr.addstr(30, 30, "ABCDEFG")
scr.addstr(31, 30, "HIJK")
scr.addstr(32, 30, "LMNO")
scr.addstr(33, 30, "PQRS")
scr.move(35, 5)
scr.refresh()

What I am expecting is this:

[...empty lines go here...]
                              ABCDEFG
                              HIJK
                              LMNO
                              PQRS

What I get is this:

[...empty lines go here...]
                              ABCDEFG
                              HIJK
LMNO
PQRS

Why are the last two rows not indented by the same 30 spaces as the previous rows? I was able to come up with some other examples that affected a different number of lines, but I'm not sure why it's displaying like this. How can I do this using addstr without it ignoring the x-coordinate of some lines?

If it matters, I am running Linux x86 with KDE using the Konsole terminal emulator.


1: I get similar behavior with addch , so I am guessing the solution to one will apply to the other

This is caused by the use of curses.reset_shell_mode . To avoid this problem, call curses.reset_prog_mode before modifying the contents of a window, and then if you need to switch back to shell mode, call curses.reset_shell_mode again. You can call these two methods repeatedly to switch back and forth as needed during the life of the program.

Here is an example that will work correctly:

import curses

scr = curses.initscr()

# should display correctly
scr.clear()
scr.addstr(30, 30, "ABCDEFG")
scr.addstr(31, 30, "HIJK")
scr.addstr(32, 30, "LMNO")
scr.addstr(33, 30, "PQRS")
scr.move(35, 5)
scr.refresh()
curses.reset_shell_mode()

Note that reset_shell_mode is called at the end. If you then run this snippet, it will display incorrectly:

# should display wrong
scr.clear()
scr.addstr(30, 30, "ABCDEFG")
scr.addstr(31, 30, "HIJK")
scr.addstr(32, 30, "LMNO")
scr.addstr(33, 30, "PQRS")
scr.move(35, 5)
scr.refresh()
curses.reset_prog_mode()

And since we called reset_prog_mode at the end, running this snippet will show the correct output again:

# should display correctly
scr.clear()
scr.addstr(30, 30, "ABCDEFG")
scr.addstr(31, 30, "HIJK")
scr.addstr(32, 30, "LMNO")
scr.addstr(33, 30, "PQRS")
scr.move(35, 5)
scr.refresh()
curses.reset_shell_mode()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM