Comment actualiser correctement la fenêtre des malédictions ?
Question
while 1:
...
window.addstr(0, 0, 'abcd')
window.refresh()
...
window
la taille est la taille complète du terminal, assez grande pour contenir abcd
.Si 'abcd'
est modifié en chaîne plus courte comme 'xyz'
, puis sur le terminal je verrai 'xyzd'
.Qu'est-ce que je fais de mal exactement ?
La solution
addstr () n'imprime que la chaîne que vous spécifiez,Il n'efface pas les caractères suivants.Vous devrez faire cela vous-même:
-
Pour effacer les caractères jusqu'à la fin de la ligne, utilisez clrtoeol () ,
-
Pour effacer les caractères jusqu'à la fin de la fenêtre, utilisez clrtobot () .
Autres conseils
Supposons que vous ayez ce code et que vous vouliez simplement savoir comment l'implémenter draw()
:
def draw(window, string):
window.addstr(0, 0, string)
window.refresh()
draw(window, 'abcd')
draw(window, 'xyz') # oops! prints "xyzd"!
La solution la plus simple et la plus « malédiction » est certainement
def draw(window, string):
window.erase() # erase the old contents of the window
window.addstr(0, 0, string)
window.refresh()
Vous pourriez être tenté d'écrire ceci à la place :
def draw(window, string):
window.clear() # zap the whole screen
window.addstr(0, 0, string)
window.refresh()
Mais ne le faites pas !Malgré le nom sympathique, clear()
est vraiment seulement pour lorsque vous souhaitez que tout l'écran soit redessiné sans condition, c'est-à-dire "scintillement".Le erase()
la fonction fait la bonne chose sans scintillement.
Frédéric Hamidi propose les solutions suivantes pour effacer seulement une ou plusieurs parties de la fenêtre en cours :
def draw(window, string):
window.addstr(0, 0, string)
window.clrtoeol() # clear the rest of the line
window.refresh()
def draw(window, string):
window.addstr(0, 0, string)
window.clrtobot() # clear the rest of the line AND the lines below this line
window.refresh()
Une alternative plus courte et purement Python serait
def draw(window, string):
window.addstr(0, 0, '%-10s' % string) # overwrite the old stuff with spaces
window.refresh()
j'utilise oScreen.erase()
.Il efface la fenêtre et remet le curseur à 0,0