簡體   English   中英

在Python curses UI中調度函數調用

[英]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()

謝謝!

您的腳本似乎有兩個問題。

  1. 這行:

     screen.addstr(12, 12, datetime.now()) 

    由於addstr期望str不是datetime ,因此將引發TypeError ,因此您需要用以下內容替換該行:

     screen.addstr(12, 12, time.strftime("%a, %d %b %Y %H:%M")) 
  2. 第二個問題是遞歸調度調用:

     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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM