0

Pythonを使用して端末に複数のスクロール行を印刷しようとしています. コードは次のとおりです。

import os, sys, time
import threading

def scroll_text(content, line, scroll_limit, sleep_time):
    blank_line = "\r" + " " * scroll_limit
    buf = ""

    if line > 0:
        sys.stdout.write("\r\n" * line)
        sys.stdout.flush()
    for cindex in range(0, len(content), 1):
        sys.stdout.write(blank_line)
        sys.stdout.flush()
        buf = content[cindex:cindex + scroll_limit]
        for itr in range(0, len(buf), 1):
            if buf[itr] == "\n":
                buf[itr] = "-"
        buf = "".join(buf)
        if buf != "":
            sys.stdout.write("\r" + buf)
            sys.stdout.flush()

        time.sleep(sleep_time)

fd = open('chat.txt', 'r')
content = fd.read()

content_list = list(content)

fd.close()

thread1 = threading.Thread(target=scroll_text, args=(content_list, 0, 70, 0.05))
thread2 = threading.Thread(target=scroll_text, args=(content_list, 1, 70, 0.05))
thread1.start()
thread2.start()
thread1.join()
thread2.join()

2 番目のスレッドのみが呼び出され、テキストが 2 行目にスクロールしていることに気付きました。ここで何か間違ったことをしているかどうかはわかりません。私は初心者なので、コーディングの間違いを許してください

追加した:

以下は呪いのバージョンです。

import os, sys, time
import threading
import curses

def report(line_no, text):
        stdscr.addstr(line_no, 0, text)
        stdscr.refresh()

def scroll_text(content, line, scroll_limit, sleep_time):
    itr1 = 0
    for itr in range(0, len(content) - 1, 1):
        if content[itr] == "\n" or content[itr] == "\r\n":
            content[itr] = '-'

    report(line, "\r" + " " * scroll_limit + "\r")
    for itr in range(0, len(content), 1):
        buf = "".join(content[itr:itr + scroll_limit])

        buf = buf.rstrip()

        if buf != "":
            report(line, "\r" + buf)
        time.sleep(sleep_time)

fd = open('chat.txt', 'r')
content = list(fd.read())
fd.close()

stdscr = curses.initscr()
curses.noecho()
curses.cbreak()

try:
    thread1 = threading.Thread(target=scroll_text, args=(content, 0, 70, 0.05))
    thread2 = threading.Thread(target=scroll_text, args=(content, 1, 70, 0.05))
    thread1.start()
    thread2.start()
    thread1.join()
    thread2.join()

except:
    curses.echo()
    curses.nocbreak()
    curses.endwin()
finally:
    curses.echo()
    curses.nocbreak()
    curses.endwin()

これはcursesバージョンの出力のビデオです

4

1 に答える 1

0

いくつかの簡単な注意事項:

  • content_listas を複製してcontent1content2後でcontent1引数として 2 回渡す理由がわかりません。たぶん、2番目のスレッドでは使用content2しないでcontent1ください:

    thread2 = threading.Thread(target=scroll_text, args=(content2, 1, 70, 0.05))
    
  • 最後にファイルハンドルを閉じる必要があります。次に例を示します。

    fd.close()
    
  • おそらくsys.stdout.write()意図的に使用していますが、STDOUTに出力する次の方法について言及したいと思います。

    from __future__ import print_function   # python3 compatible, changes the syntax a little bit
    
    print (something)   # newline is inclusive, you don't need to add '+ \n'
    
于 2013-07-23T12:59:38.303 に答える