[英]Scheduling function calls in a Python curses UI
我正在嘗試編寫一個具有curses接口的程序(這樣我就可以隨時輕松地更改設置),並且還能夠調用並顯示在不同時間表上調用的函數的輸出。
我無法弄清楚如何在設定的時間段內有效地調用某些內容,而仍然使用curses循環,該循環可以隨時接收輸入。
這是一個嘗試執行我在說什么的小程序的示例。 (無效)
import curses, sched, time
from datetime import datetime
def show_time(sc):
screen.addstr(12, 12, datetime.now())
sc.enter(1, 1, show_time, (sc,))
screen = curses.initscr()
curses.noecho()
curses.curs_set(0)
screen.keypad(1)
screen.addstr("This is a Sample Curses Script\n\n")
s = sched.scheduler(time.time, time.sleep)
s.enter(1, 1, show_time, (s,))
s.run()
while True:
event = screen.getch()
if event == ord("q"): break
curses.endwin()
謝謝!
您的腳本似乎有兩個問題。
這行:
screen.addstr(12, 12, datetime.now())
由於addstr
期望str
不是datetime
,因此將引發TypeError
,因此您需要用以下內容替換該行:
screen.addstr(12, 12, time.strftime("%a, %d %b %Y %H:%M"))
第二個問題是遞歸調度調用:
sc.enter(1, 1, show_time, (sc,))
我從未使用過sched模塊,但是我擴展了我的知識,並且似乎.run()
會停止直到所有計划的事件完成為止。
如果您只想每秒更新一次屏幕,為什么不嘗試以下操作:
import curses
import time
import threading
def update_time(screen):
while 1:
screen.addstr(12, 12, time.strftime("%a, %d %b %Y %H:%M:%S"))
screen.refresh()
time.sleep(1)
screen = curses.initscr()
curses.noecho()
curses.curs_set(0)
screen.keypad(1)
screen.addstr("This is a Sample Curses Script\n\n")
screen.refresh()
clock = threading.Thread(target=update_time, args=(screen,))
clock.daemon = True
clock.start()
while 1:
event = screen.getch()
if event == ord("q"):
break
curses.endwin()
我認為解決此問題的最佳方法是對您的輸入使用GNU readline,而不是默認的curses輸入。 然后使用readline
的異步功能,以便您有一個select
循環,您可以從中調用函數。
首先,Python readline庫不支持異步readline函數調用,但是使用ctypes
將Python直接連接到readline很容易 。
這樣,您就可以始終控制選擇循環。 如果沒有輸入,請檢查時鍾以查看是否該運行該功能了。 如果不是,請睡眠幾毫秒,檢查是否有擊鍵,看看時鍾,然后再次睡眠。 time.sleep
可以處理小數秒。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.