[Tutor] How to use "curses.resizeterm(nlines, ncols)"

Mark Lawrence breamoreboy at gmail.com
Sun Feb 24 17:51:28 EST 2019


On 24/02/2019 22:39, Cameron Simpson wrote:
> On 24Feb2019 14:30, boB Stepp <robertvstepp at gmail.com> wrote:
>> On Sun, Feb 24, 2019 at 1:39 AM Cameron Simpson <cs at cskk.id.au> wrote:
>>> It looks like the resizeterm() function updates the curses _internal_
>>> records of what it believes the physcial terminal size to be.  When you
>>> physically resize a terminal the processes within it receive a SIGWINCH
>>> signal, and those which pay attention to that signal should then consult
>>> the terminal to find out its new size.
>>>
>>> The curses library notices this signal, and calls resizeterm() to update
>>> its own internal idea of the terminal size so that it knows how to draw
>>> correctly on the screen. It does _not_ change the terminal; it changes
>>> curses' beliefs _about_ the terminal.
> [...]
>>> The is_term_resized() function looks up the current physical size and
>>> reports False if that matches curses current beliefs, and True if it
>>> does not match, meaning that the physical size has changed since curses
>>> last set up its beliefs [...]
>>
>> What you say makes sense and supports much of what I had concluded
>> from my coding experiments.  However, I still cannot get the function
>> call, curses.resizeterm(), to do anything meaningful, which suggests
>> that I still do not truly understand its usage.
> 
> Likely so. The important thing you may be missing is that curses 
> _itself_ calls resizeterm() automatically when it gets a SIGWINCH, so in 
> normal situations you do not need to call this function.
> 
> Because of this, getmaxyx() is always correct for the size of the terminal.
> 
> Secondarily, resizeterm() does not make a change to the terminal itself.
> 
> Note that is_term_resized(y,x) is a _test_: it asks whether curses' idea 
> of the screen size does not match (y,x). (y,x) is a pair of numbers that 
> _you_, the programmer, is keeping track of.
> 
> If you set it once at the start of the programme:
> 
>     max_y, max_x = stdscr.getmaxyx()
> 
> and never update it then is_term_resized(max_y, max_x) will report True 
> if the terminal has changed size. If you update the (max_y,max_x) values 
> regularly from getmaxyx() then they will always match and 
> is_term_resized will always report False.
> 
>> I created the
>> following script to test things out:
> [...]
> 
> I've modified your script. Please try the script appended below. The 
> short answer is that resizeterm() is _not_ normally useful to you, the 
> programmer; it will only be useful if curses does not get to notice 
> terminal size changes - _then_ you could use it to provide that facility.
> 
> The script below is like yours: 'q' to quit, other keys to refresh and 
> retest. Notice that the version below does not update (max_y,max_x) or 
> call resizeterm(); initially you want to see what is_term_resized() 
> does. It also shows you what got tested.
> 
> Cheers,
> Cameron Simpson <cs at cskk.id.au>
> 
> #!/usr/bin/env python3
> 
> import curses
> 
> def start_cli(stdscr):
>     max_y, max_x = stdscr.getmaxyx()
>     stdscr.clear()
>     stdscr.border()
>     stdscr.addstr(2, 2, "This is the beginning!")
>     stdscr.refresh()
>     while True:
>         char = chr(stdscr.getch())
>         if char in 'Qq':
>             return
>         tested = "is_term_resized(max_x=%d, max_y=%d)" % (max_x, max_y)
>         internal = "getmaxyx() => y=%d, x=%d" % stdscr.getmaxyx()
>         resized = curses.is_term_resized(max_y, max_x)
>         result = "%s => %s" % (tested, resized)
>         stdscr.clear()
>         stdscr.addstr(max_y//2, max_x//2, result)
>         stdscr.addstr(max_y//2 + 1, max_x//2, internal)
>         if curses.is_term_resized(max_y, max_x):
>             ##max_y, max_x = stdscr.getmaxyx()
>             stdscr.addstr(max_y//2 + 2, max_x//2, "You resized the 
> terminal!")
>             ##stdscr.addstr(max_y//2 + 2, max_x//2, "Resizing your 
> window -- NOW!")
>             ##curses.resizeterm(max_y, max_x)
>         else:
>             stdscr.addstr(max_y//2 + 2, max_x//2, "Not resized.")
>         stdscr.border()
>         stdscr.refresh()
> 
> if __name__ == '__main__':
>     curses.wrapper(start_cli)

As I know squat about the curses module is this a time when a bug report 
could be put into the docs to clarify things, or do you have to know 
something about curses before you try using the Python wrapper?

-- 
My fellow Pythonistas, ask not what our language can do for you, ask
what you can do for our language.

Mark Lawrence



More information about the Tutor mailing list