2013-07-23 17 views
0

嘗試使用python在終端上打印多個滾動線。以下是代碼:使用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() 

注意到只有第二個線程被調用,並且文本在第二行上滾動。不知道我在這裏做錯了什麼。我是個新手,所以請原諒我的編碼錯誤

補充:

以下是詛咒的版本:

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() 

這裏是詛咒的版本

+0

你爲什麼'輸入curses'? –

+0

嗨簡,對不起,該行仍然嘗試使用curses打印而不是sys.stdout.write():)後刪除行 –

+0

curses版本實際上是在單CPU機器:) –

回答

0

幾個輸出video簡單的備註:

  • 我不明白爲什麼y ou複製content_list作爲content1content2以稍後通過content1兩次作爲論點。也許你的第二個線程應該使用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' 
    
+0

感謝adbar,作出更改由你建議。第二個線程似乎執行,但不是第一個線程 –

+0

以下是curses版本: –