我遇到了一些我无法理解的行为。
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()工作正常。
答案 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根据需要处理SIGWINCH
,restarting napms
以获得请求的时间延迟。当我将time.sleep(1)
更改为
curses.napms(1000)
当终端调整大小时,程序继续“休眠”一秒钟。