当终端的大小发生变化时,Curses会中断time.sleep()

时间:2016-10-04 12:18:53

标签: python python-2.7 ncurses python-curses

我遇到了一些我无法理解的行为。

import curses
import time

myscreen = curses.initscr()

y, x = myscreen.getmaxyx()
i = 0

while y >= 24 and x >= 80 and i <= 23:
    myscreen.addstr(i, 0, 'Python curses in action!')
    myscreen.refresh()
    y, x = myscreen.getmaxyx()
    i += 1
    time.sleep(1)

curses.endwin()

此代码将写入24个字符串,间隔为1秒,并且没问题。 但是当我在执行期间开始更改终端窗口的大小时,字符串将在屏幕上显示得比每秒1个字符串快得多。 你能否解释一下这种行为,也许可以得到建议如何保护&#34;我的time.sleep()? 感谢。

P.S。没有curses sleep()工作正常。

2 个答案:

答案 0 :(得分:0)

来自time.sleep()的文档:

  

暂停执行给定数量的当前线程   秒。参数可以是浮点数来表示a   更准确的睡眠时间。 实际停用时间可能小于   请求,因为任何捕获的信号将终止睡眠()   执行该信号的捕捉程序之后。而且,   暂停时间可能比任意数量的要求更长   因为系统中其他活动的安排。

答案 1 :(得分:0)

当您调整终端大小时,终端仿真器会向程序发送一个信号(SIGWINCH),用于输入/输出。在您的示例中,该中断time.sleep()

您可以使用curses函数time.sleep()(等待给定的毫秒数),而不是使用napms()

从您当前的程序开始,如果您将其打印出来,可以更好地查看时间行为(根据 Get current time in milliseconds in Python? 调整答案):

import curses
import time
from datetime import datetime
from datetime import timedelta

start_time = datetime.now()

# returns the elapsed seconds since the start of the program
def elapsed():
   dt = datetime.now() - start_time
   ms = (dt.days * 24 * 60 * 60 + dt.seconds) * 1000 + dt.microseconds / 1000.0
   return ms / 1000.0

myscreen = curses.initscr()

y, x = myscreen.getmaxyx()
i = 0

while y >= 24 and x >= 80 and i <= 23:
    myscreen.addstr(i, 0, 'Python curses in action ' + "%.3f" % elapsed())
    myscreen.refresh()
    y, x = myscreen.getmaxyx()
    i += 1
    time.sleep(1)

myscreen.getch()
curses.endwin()

curses有一个类似sleep的功能,但是在毫秒napms。使用它,您将获得更一致的行为,因为ncurses根据需要处理SIGWINCHrestarting napms以获得请求的时间延迟。当我将time.sleep(1)更改为

    curses.napms(1000)

当终端调整大小时,程序继续“休眠”一秒钟。