スポンサーサイト

    上記の広告は1ヶ月以上更新のないブログに表示されています。
    新しい記事を書く事で広告が消せます。

    標準出力・標準エラーをテキストフィールドに出す

     最近すっかりポケモン販促ブログと化してましたんで、たまにはPythonネタでもやってみようかとw
     あ、また近いウチに販促しますけどねw

     今日のお題は、標準出力(printとかした時に出るヤツ)と標準エラー(エラーが起こったら出るメッセージとか)をQtのエディタに出力すると言うお話です。
     某会社でPyQt使ってウィンドウ作ってるんですが、Mayaから使用してる場合はそれら出力はScriptEditorに出るので問題ないのですが、Mayaを経由せず普通に起動した場合、それらprintされたものやエラー何かが何処にも出ません。(もちろんDOSから起動した場合は別ですが、普通のユーザーはDOS窓を親の仇の如く嫌がりますので・・・)


     その方法を色々調べてまして、まさにバッチリなサンプルコードを見つけたので、忘れないようにメモ。
     因みにそのサンプルコードを載せて下さっていた方のページが何処かわからなくなってしまった・・・おおぉぅ、ジャズ・・・


    それでは早速サンプルコードでございます。
    # -*- coding:utf-8 -*-
    import sys
    from PyQt4 import QtGui, QtCore
    
    # /////////////////////////////////////////////////////////////////////////////
    #                                                                            //
    # /////////////////////////////////////////////////////////////////////////////
    class Logger( object ):
        def __init__( self, editor, out=None, color=None ):
            self.editor = editor    # 結果出力用エディタ
            self.out    = out       # 標準出力・標準エラーなどの出力オブジェクト
            # 結果出力時の色(Noneが指定されている場合、エディタの現在の色を入れる)
            if not color:
                self.color = editor.textColor()
            else:
                self.color = color
    
        def write( self, message ):
            # カーソルを文末に移動。
            self.editor.moveCursor( QtGui.QTextCursor.End )
    
            # color変数に値があれば、元カラーを残してからテキストのカラーを
            # 変更する。
            self.editor.setTextColor( self.color )
    
            # 文末にテキストを追加。
            self.editor.insertPlainText( message )
    
            # 出力オブジェクトが指定されている場合、そのオブジェクトにmessageを
            # 書き出す。
            if self.out:
                self.out.write( message )
    # /////////////////////////////////////////////////////////////////////////////
    #                                                                            //
    # /////////////////////////////////////////////////////////////////////////////
    
    
    
    # /////////////////////////////////////////////////////////////////////////////
    # 標準出力・標準エラーの結果を出すウィンドウサンプル。                        //
    # /////////////////////////////////////////////////////////////////////////////
    class LogWindow( QtGui.QDialog ):
        def __init__( self, parent=None ):
            # ログウィンドウのサンプル本体の初期化。-------------------------------
            super( LogWindow, self ).__init__( parent )
            self.resize( 400, 500 )
            self.setWindowTitle( 'Log Window Exsample' )
            # ---------------------------------------------------------------------
    
            # メインレイアウト。
            layout = QtGui.QVBoxLayout( self )
    
            # 出力テストをするためのGUI。==========================================
    
            # テキスト出力用UI。
            self.outtextLE = QtGui.QLineEdit()
            self.outtextLE.textEdited.connect( self.outputText )
            outtextW       = QtGui.QLabel(
                'Type something into this field and press Enter'
            )
    
            # エラー出力用UI。
            raiseBtn       = QtGui.QPushButton( 'Raise' )
            raiseBtn.clicked.connect( self.error )
    
            layout.addWidget( self.outtextLE )
            layout.addWidget( outtextW )
            layout.addWidget( raiseBtn )
            # =====================================================================
            
            # 結果出力窓。=========================================================
            resultTE       = QtGui.QTextEdit()
            resultTE.setReadOnly( True )            # 編集不可に設定。
            resultTE.setUndoRedoEnabled( False )    # Undo・Redo不可に設定。
    
            # 標準出力と標準エラー出力の結果を結果出力窓に書き出すよう関連付ける。
            sys.stdout = Logger(
                resultTE, sys.stdout
            )
            sys.stderr = Logger(
                resultTE, sys.stderr, QtGui.QColor(255, 0, 0)
            )
    
            layout.addWidget( resultTE )
            # =====================================================================
    
    
    
        def outputText( self, text ):
            '''テキストフィールドに入力されたテキストを標準出力する。'''
            print( text )
    
        def error( self ):
            '''IOErrorを出す。'''
            raise IOError( 'Do nothing.' )
    # /////////////////////////////////////////////////////////////////////////////
    #                                                                            //
    # /////////////////////////////////////////////////////////////////////////////
    
    
    if __name__ == '__main__':
        app = QtGui.QApplication( sys.argv )
        win = LogWindow()
        win.show()
        
        sys.exit( app.exec_() )
    


    こんな感じです。
    stdoutStderrWindow.jpg
     上のテキストフィールドに文字を打つと、どんどん下のフィールドにプリントされて行きます。
    DOSからこれを起動するとわかりますが、DOS窓にも同じ内容がプリントされてます。
    またボタンをクリックするとエラー文が赤文字で出ます。

     因みに元ソースではエラー時の色変え処理をもっとスマートにやってたんですが、それだと自分の環境ではうまくいかなかったので、改悪しました。。。何故うまくいかんウワァァ-----。゚(゚´Д`゚)゚。-----ン!!!!



     兎にも角にも、これで自作ツールを作成して、エラーが起こった時や何かを出力したい時にわかりやすくなりますね~
    スポンサーサイト

    コメントの投稿

    非公開コメント

    プロフィール

    Eske

    Author:Eske
    萌えイラストレーターを目指す3DCGイラストレーター。
    現在ポケモンカードゲーム、ガンダムトライエイジ、ガンダムコンクエスト、妖怪ウォッチとりつきカードゲームなどで3DCGを使用したイラストレーターとして参加中。

    主にここでは日々気づいたメモなんかを残してます。
    イラストのお仕事も受け付けております。ココからアクセスできますので、お気軽にご相談下さい。

    最新記事
    最新コメント
    カテゴリ
    最新トラックバック
    月別アーカイブ
    検索フォーム
    リンク
    QRコード
    QR
    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。