1

これができるかどうかはわかりませんが、いくつかのスクリプトでこれを見たと確信しているので、質問しています。

次のような文字列を出力する必要があります。

++++++++++++++++++++++++++++++     +++++++++++++++
+     A 1     ++     A 2     +     +     A n     +
+-------------++-------------+     +-------------+
+     B 1     ++     B 2     + ... +     B n     +
+-------------++-------------+     +-------------+
+     C 1     ++     C 2     +     +     C n     +
++++++++++++++++++++++++++++++     +++++++++++++++

ここで、n は列の数であり、ユーザーの入力によって異なります。A 行は固定されていますが、B と C はプログラムの実行中に変更する必要があります。

したがって、まず、この種の文字列を出力する方法が必要です。A と B は長さ 8 の文字列ですが、C は 8 文字から 1 文字になることを知っています。

さまざまな「フォーマッター」ソリューションと to を調べましたpprettyが、それらは必要なものとはかけ離れているようです (そして、多くの例が見つかりませんでした!)。(私はJavaから来ているpprettyので、他のソリューションではデータを取得しているときにデータソースのようなものが必要だったので、試してみました!)class.getData()

ここで、この文字列を印刷した後、B と C の変更に応じて更新する必要があります。多くの印刷物を避け、すべてを整理して読みやすくするために、再度印刷する必要はありません。

それを行う方法はありますか?

編集:

これは私が試したことです(成功しませんでした)

def printCrackingState(threads):
info_string = '''
++++++++++++++++++++++++++++++++++
+ Starting password = s.%08d +
+--------------------------------+    
+ Current pin       = s.%08d +
++++++++++++++++++++++++++++++++++
+ Missing pins      =   %08d +
++++++++++++++++++++++++++++++++++
              '''
while 1:
    for t in threads:
        printed_string = info_string % (t.starting_pin, t.testing_pin, t.getMissingPinsCount())
        sys.stdout.write(printed_string)
    time.sleep(3500)

これが結果です。

++++++++++++++++++++++++++++++++++
+ Starting password = s.00000000 +
+--------------------------------+    
+ Current pin       =   00000523 +
++++++++++++++++++++++++++++++++++
+ Missing pins      =   01249477 +
++++++++++++++++++++++++++++++++++

++++++++++++++++++++++++++++++++++
+ Starting password = s.01250000 +
+--------------------------------+    
+ Current pin       =   01250491 +
++++++++++++++++++++++++++++++++++
+ Missing pins      =   01249509 +
++++++++++++++++++++++++++++++++++

++++++++++++++++++++++++++++++++++
+ Starting password = s.02500000 +
+--------------------------------+    
+ Current pin       =   02500465 +
++++++++++++++++++++++++++++++++++
+ Missing pins      =   01249535 +
++++++++++++++++++++++++++++++++++

++++++++++++++++++++++++++++++++++
+ Starting password = s.03750000 +
+--------------------------------+    
+ Current pin       =   03750564 +
++++++++++++++++++++++++++++++++++
+ Missing pins      =   01249436 +
++++++++++++++++++++++++++++++++++

++++++++++++++++++++++++++++++++++
+ Starting password = s.05000000 +
+--------------------------------+    
+ Current pin       =   05000592 +
++++++++++++++++++++++++++++++++++
+ Missing pins      =   01249408 +
++++++++++++++++++++++++++++++++++

++++++++++++++++++++++++++++++++++
+ Starting password = s.06250000 +
+--------------------------------+    
+ Current pin       =   06250579 +
++++++++++++++++++++++++++++++++++
+ Missing pins      =   01249421 +
++++++++++++++++++++++++++++++++++

++++++++++++++++++++++++++++++++++
+ Starting password = s.07500000 +
+--------------------------------+    
+ Current pin       =   07500577 +
++++++++++++++++++++++++++++++++++
+ Missing pins      =   01249423 +
++++++++++++++++++++++++++++++++++

++++++++++++++++++++++++++++++++++
+ Starting password = s.08750000 +
+--------------------------------+    
+ Current pin       =   08750555 +
++++++++++++++++++++++++++++++++++
+ Missing pins      =   01249445 +
++++++++++++++++++++++++++++++++++

sys.stdout.write()はそれらを同じ行に持っていましたが、うまくいきません!

編集2:

返信で示唆されているように、私の2番目の試みは呪いです。

同じ行に書くことはできますが、更新されません。

これが私のコードです:

import curses
import time
import threading

class CursesPrinter(threading.Thread):
    windows = []
    screen = None 
    processes = []   

    info_string = '''
    +++++++++++++++++++++++++
    + Starting = s.%08d +
    +-----------------------+    
    + Current  = s.%08d +
    +-----------------------+
    + Missing  =   %08d +
    +++++++++++++++++++++++++
                  '''            

    def _makeWindows(self, numWindows):
        x = 0
        y = 0
        height = 15
        width = 30        
        for i in range(numWindows):
            win = curses.newwin(height, width, x, y)
            #win.border(1)
            y+=width
            if y>self.screen.getmaxyx():
                #This should make a new line if we reach the end of the terminal
                y = 0
                x+=height
            self.windows.append(win) 

    def run(self):
        while 1:
            for i in range(len(self.processes)-1):
                print_string = self.info_string % (self.processes[i].starting_pin, self.processes[i].testing_pin, self.processes[i].getMissingPinsCount())                
                self.windows[i].addstr(0,0, print_string)
                self.windows[i].refresh()
        #time.sleep(60)                            


    def __init__(self, threads, processes):
        super(CursesPrinter, self).__init__()
        self.screen = curses.initscr()
        curses.curs_set(0)
        self.processes = processes
        self._makeWindows(threads)       
        #curses.endwin()  
4

2 に答える 2

1

VT100 エスケープ シーケンスを処理する端末に依存する手っ取り早い方法は、出力を印刷する前に画面をクリアし、カーソルをホーム ポジションに移動することです。

簡単なデモ:

import sys
import time
import random

ESC = "\x1b"

def home():
    sys.stdout.write(ESC + '[0;0H')
    sys.stdout.flush()

def cls():
    sys.stdout.write(ESC + '[2J')
    sys.stdout.flush()

def print_status():
    w = 8
    print('+' + '-'*w + '+')
    for row in range(3):
        fmt = '|%%%dd |' % (w - 1)
        print(fmt % random.randint(0, 1000))
        print('+' + '-'*w + '+')
    sys.stdout.flush()

if __name__ == "__main__":
    cls()
    for k in range(16, 0, -1):
        home()  # or use cls()
        print_status()
        time.sleep(0.5)

「ホーム」シーケンスを使用する代わりに、印刷した行数を追跡し、次の更新を印刷する前にその数の「カーソル上」エスケープ シーケンスを印刷することができます。

より手の込んだものにしたい場合は、python curses モジュール祝福、またはurwidをチェックしてください。

通常の Windows 端末ではこれらのいずれも機能しないと思います。そのため、ターゲットにしている OS について尋ねました。

于 2013-03-29T12:32:13.187 に答える