簡體   English   中英

在curses中打印線程函數,Python

[英]Print a threading function in curses, Python

在我的項目中,我必須在控制台上打印一些存儲在數據庫中的數據。 我有兩個返回字符串的函數。 我應該將這些數據打印在兩列中。 我想到了在python中使用模塊curses創建這兩列。 到目前為止,一切都很好。 另一件事是,我的兩個函數使用threading.Timer。 因此,例如,如果將Timer設置為10,則生成的字符串每10秒更改一次。因此,當我將函數的結果放在列的addstr()上時,它將正確打印第一個String,但是即使我的字符串也不會改變更改。 否則,當我調整控制台的大小時,我會注意到字符串發生了變化。 這是我的代碼:

import sys,os
import curses , curses.panel 
import datetime
import time
import threading



def time_func():
    printStr = threading.Timer(10,time_func)
    printStr.start()
    s = "Simple example that display datetime \n" + datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") 
    return s 

def draw_menu():


    k = 0
    cursor_x = 0
    cursor_y = 0


    # Clear and refresh the screen
    stdscr = curses.initscr()
    stdscr.clear()
    stdscr.refresh()

    # Initialize colors in curses
    curses.start_color()
    curses.init_pair(1, curses.COLOR_CYAN, curses.COLOR_BLACK)
    curses.init_pair(2, curses.COLOR_RED, curses.COLOR_BLACK)
    curses.init_pair(3, curses.COLOR_BLACK, curses.COLOR_WHITE)
    curses.curs_set(0)
    # Loop where k is the last character pressed
    while (k != ord('q')):

        # Declaration of strings
        statusbarstr = "Press 'q' to exit | STATUS BAR "

        '''Draw borders of the different columns'''
        height, width = stdscr.getmaxyx()
        stdscr.border()
        stdscr.vline(1, 3 * height // 4, '|', width - 2)
        stdscr.vline(1, height // 4, '|', width - 2)
        stdscr.refresh()

        '''Initialize the Statistics column'''
        column_one = curses.newwin(height - 2, 3 * width // 4, 1,
                                           1)
        _, a_x = column_one.getmaxyx()
        column_one.attron(curses.color_pair(1))
        column_one.attron(curses.A_BOLD)
        column_one.addstr(0, a_x // 2 - 2, "column one")
        column_one.hline(1, 0, '-', a_x)
        column_one.attroff(curses.color_pair(1))
        column_one.attroff(curses.A_BOLD)

        # I want to add my string here for example : 
        line = time_func()
        column_one.addstr(3,1, line)


        column_one.noutrefresh()

        '''Initialize the Alerts column'''
        column_two = curses.newwin(height - 2, width // 4, 1,
                                       3 * width // 4 )
        _, s_x = column_two.getmaxyx()
        column_two.attron(curses.color_pair(1))
        column_two.attron(curses.A_BOLD)
        column_two.addstr(0, s_x // 2 - 5, "column two")
        column_two.hline(1, 0, '-', s_x)
        column_two.attroff(curses.color_pair(1))
        column_two.attroff(curses.A_BOLD)

        column_two.addstr(3, s_x // 2 - 5,"test")

        column_two.noutrefresh()



        # Render status bar
        stdscr.attron(curses.color_pair(3))
        stdscr.addstr(height-1, 0, statusbarstr)
        stdscr.addstr(height-1, len(statusbarstr), " " * (width - len(statusbarstr) - 1))
        stdscr.attroff(curses.color_pair(3))

        # Turning on attributes for title
        stdscr.attron(curses.color_pair(2))
        stdscr.attron(curses.A_BOLD)

        # Rendering title


        # Turning off attributes for title
        stdscr.attroff(curses.color_pair(2))
        stdscr.attroff(curses.A_BOLD)

        # Print rest of text

        stdscr.move(height - 2, width - 2)

        # Refresh the screen
        stdscr.refresh()
        # Wait for next input
        k = stdscr.getch()

def main():
    curses.wrapper(draw_menu())

if __name__ == "__main__":
    main()

curses函數draw_menu在循環結束時正在等待輸入。 如果您調整終端的大小,那

k = stdscr.getch()

返回KEY_RESIZE ,然后再次運行循環。

你可以改變在放棄之前等待時間短getch 那將返回-1

通常,這是使用timeout (以秒為單位)(例如50毫秒)完成的。 Python中有一個包裝器 (順便說一句,它的描述不正確)。 您應該閱讀ncurses 手冊頁以了解timeout

有時人們會說使用nodelay ,這通常是一個糟糕的建議,因為這會使draw_menu線程draw_menu大部分CPU時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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