2017-01-19 5 views
0

私はPython 2.7でcursesを使って単純なスクロール可能なメニューを構築しています。端末サイズが変更された場合も含めて(例えば、 mを押します)。私はこの問題を解明するために使っている簡単なテストコードを持っています。これが可能なら、私は本当に近いですが、私が見ているのは、(mRemoteNGを使って)端末ウィンドウのサイズを変更すると、スクリーンショットの一番下に表示されているように、私は、ウィンドウを垂直方向に拡張:Python Curses Border on Resize

resize-test_border-lines

を私は次のようにこれはテストするために使用していますコード:

import curses 
import os 

VERSION = "0.1-dev" #version number 

screen = curses.initscr() #initialize the curses window 

#Configure color pairs for showing select menu options as highlighted 
curses.start_color() #enable color for highlighting menu options 
curses.init_pair(1, curses.COLOR_BLACK, curses.COLOR_WHITE) #color pair 1 
highlightText = curses.color_pair(1) #color pair for highlighted menu option 
normalText = curses.A_NORMAL #color pair for non-highlighted menu options 

#Configure global variables for Curses 
curses.noecho() #disable the keypress echo to prevent double input 
curses.cbreak() #disable line buffers to run the keypress immediately 
curses.curs_set(0) 
screen.keypad(1) #enable keyboard use 
screen.addstr(2, 2, "Screen Resize Test" + VERSION, curses.A_UNDERLINE) 

#test screen resize 
def main_screen(): 
    escape = False 
    while escape == False: 
     maxY, maxX = screen.getmaxyx() 
     screen.border('|', '|', '-', '-', '+', '+', '+', '+') 
     screen.addstr(4, 2, "MaxY: " + str(maxY)) 
     screen.addstr(5, 2, "MaxX: " + str(maxX)) 
     screen.refresh() 

     x = screen.getch() 

     if x == ord("q"): 
      escape = True 




main_screen() 


curses.endwin() # *** CRITICAL *** this closes the curses menu and returns user to bash 
os.system('clear') #clears the screen to avoid curses remnants 

私はscreen.refresh()screen.clear()多くの異なる配置を試してみたが、それはそうありませんcursesウィンドウの端に残っている線を取り除きます。明らかに、これが可能であれば、私はこれらのどちらか/両方を配置するかを理解することができないか、正しい軌道にない。

答えて

1

プログラムでは、curses.KEY_RESIZEを戻り値getchからチェックし、その場合はscreen.eraseにコールする必要があります。

また、screen.refreshへの既存の呼び出しは不要です。これはscreen.getchとにかく実行されるためです。

これは私の作品:

import curses 
import os 

VERSION = "0.1-dev" #version number 

screen = curses.initscr() #initialize the curses window 

#Configure color pairs for showing select menu options as highlighted 
curses.start_color() #enable color for highlighting menu options 
curses.init_pair(1, curses.COLOR_BLACK, curses.COLOR_WHITE) #color pair 1 
highlightText = curses.color_pair(1) #color pair for highlighted menu option 
normalText = curses.A_NORMAL #color pair for non-highlighted menu options 

#Configure global variables for Curses 
curses.noecho() #disable the keypress echo to prevent double input 
curses.cbreak() #disable line buffers to run the keypress immediately 
curses.curs_set(0) 
screen.keypad(1) #enable keyboard use 
screen.addstr(2, 2, "Screen Resize Test" + VERSION, curses.A_UNDERLINE) 

#test screen resize 
def main_screen(): 
    escape = False 
    while escape == False: 
     maxY, maxX = screen.getmaxyx() 
     screen.border('|', '|', '-', '-', '+', '+', '+', '+') 
     screen.addstr(4, 2, "MaxY: " + str(maxY)) 
     screen.addstr(5, 2, "MaxX: " + str(maxX)) 

     x = screen.getch() 

     if x == ord("q"): 
      escape = True 
      curses.endwin() 
     elif x == curses.KEY_RESIZE: 
      screen.erase() 
      screen.addstr(2, 2, "Screen Resize Test" + VERSION, curses.A_UNDERLINE) 

main_screen() 
+0

私が追加した場合: 'ELIFのX == curses.KEY_RESIZE:サイズ変更に screen.erase()' を、ウィンドウはキー入力の原因になるまでブランクになりますすべてが再描画されます。私は 'elif'ブロックに' screen.refresh() 'を追加しようとしましたが、違いはありませんでした。しかし、あなたの提案は、私がサイズ変更時にゴースト・ラインにあった正確な問題を修正します。 – bradical987

+0

問題を引き起こしていたこの問題を自分で解決し続けながら、私が追加したいくつかの行を忘れてしまった。また、 'elif'ブロックに' screen.addstr() '行を追加していないので、一旦画面が消去されると、キーを押すだけですべてを再描画することができました。 – bradical987