如何在 IDLE shell 中清除所有文本的屏幕?
How to clear the screen of ALL text in IDLE shell?
我想为 python 游戏创建基于文本的 GUI。我打算在多行文本之间移动一个字符。经过数小时的在线搜索,我发现的解决方案对此不起作用。我想要一些可以擦除屏幕上所有文本的东西,这样我就可以重新打印同一行,但字符移动了一个 space。需要说明的是,我要擦除的屏幕是您在空闲状态下点击 "run module" 时出现的屏幕。另外,我无法导入任何外部库,因为出于某种原因,它在我的计算机上损坏了。
我试过 ctrl+l。它什么也没做。
我尝试使用 os.system('cls')(我在 windows)它打开命令提示符,清除它,然后关闭它。不是我需要的。
print ("\n" * 50) 有效,但不清除屏幕。屏幕必须清晰,我不想打印一百万行。
这是我的代码:
import sys
valone = 5
valtwo = 5
# create line of text
sys.stdout.write(" a " * valone + " t " + " a " * valtwo)
# move t character 1 space
valone = valone -1
valtwo = valtwo + 1
# clear screen and redraw line with t moved 1 space.
IDLE 的 Python shell 无法做到这一点。
Shell never throws away output.
和
Tab characters cause the following text to begin after the next tab stop. (They occur every 8 ‘characters’). Newline characters cause following text to appear on a new line. Other control characters are ignored or displayed as a space, box, or something else, depending on the operating system and font.
这意味着它是一个非常基本的 shell,它以线性方式输出所有文本。您需要 运行 Python 在不同的 shell 中完成您想要的。
您可以使用 curses
来完成此操作。它是 built-in 在 Python 上 Linux,等等。 al,但对于 Windows,您需要安装 windows-curses
library.
完成后,您可以使用 .clear()
方法:
from curses import initscr
stdscr = initscr()
stdscr.clear()
stdscr.refresh()
当然,这取决于你安装外部模块的问题。如果不这样做,或者使用 Windows 以外的东西,恐怕你会被卡住。
此外,我不确定在空闲状态下 运行 这是否有效,但如果无效,那么只需从 cmd 提示符 运行 您的程序即可。
编辑:我最初提到了 UniCurses
库,但它似乎没有得到很好的支持,所以我将其更改为 windows-curses
,这似乎是 built-in curses
的补丁,用于 Windows.
一个text-based图形用户界面(GUI)应该是"based on a text widget of a GUI framework"的意思,比如Python自带的cross-platform tkinter模块,就是IDLE使用的.目前,IDLE shell 并不是为了方便你想做的事情而设计的。相反,您可以使用 Label 或 Text 小部件编写自己的 tkinter 程序。以下可以给你一个开始。
import tkinter as tk
r = tk.Tk()
f = 'TkFixedFont'
s = 'X '
sv = tk.StringVar(r)
l = tk.Label(r, font=f, textvariable=sv)
sv.set(s)
t = tk.Text(r, font=f, height=1, width=10)
t.insert('1.0', 'X')
n = 0 # index of marker
i = 200 # milliseconds between moves
def moveright():
global n, s
if n < 9:
s = ' ' + s[:-1]
sv.set(s)
t.insert('1.0', ' ')
n += 1
r.after(i, moveright)
else:
moveleft()
def moveleft():
global n, s
if n:
s = s[1:] + ' '
sv.set(s)
t.delete('1.0', '1.1')
n -= 1
r.after(i, moveleft)
else:
moveright()
l.pack()
t.pack()
r.after(i, moveright)
r.mainloop()
我想为 python 游戏创建基于文本的 GUI。我打算在多行文本之间移动一个字符。经过数小时的在线搜索,我发现的解决方案对此不起作用。我想要一些可以擦除屏幕上所有文本的东西,这样我就可以重新打印同一行,但字符移动了一个 space。需要说明的是,我要擦除的屏幕是您在空闲状态下点击 "run module" 时出现的屏幕。另外,我无法导入任何外部库,因为出于某种原因,它在我的计算机上损坏了。
我试过 ctrl+l。它什么也没做。 我尝试使用 os.system('cls')(我在 windows)它打开命令提示符,清除它,然后关闭它。不是我需要的。 print ("\n" * 50) 有效,但不清除屏幕。屏幕必须清晰,我不想打印一百万行。
这是我的代码:
import sys
valone = 5
valtwo = 5
# create line of text
sys.stdout.write(" a " * valone + " t " + " a " * valtwo)
# move t character 1 space
valone = valone -1
valtwo = valtwo + 1
# clear screen and redraw line with t moved 1 space.
IDLE 的 Python shell 无法做到这一点。
Shell never throws away output.
和
Tab characters cause the following text to begin after the next tab stop. (They occur every 8 ‘characters’). Newline characters cause following text to appear on a new line. Other control characters are ignored or displayed as a space, box, or something else, depending on the operating system and font.
这意味着它是一个非常基本的 shell,它以线性方式输出所有文本。您需要 运行 Python 在不同的 shell 中完成您想要的。
您可以使用 curses
来完成此操作。它是 built-in 在 Python 上 Linux,等等。 al,但对于 Windows,您需要安装 windows-curses
library.
完成后,您可以使用 .clear()
方法:
from curses import initscr
stdscr = initscr()
stdscr.clear()
stdscr.refresh()
当然,这取决于你安装外部模块的问题。如果不这样做,或者使用 Windows 以外的东西,恐怕你会被卡住。
此外,我不确定在空闲状态下 运行 这是否有效,但如果无效,那么只需从 cmd 提示符 运行 您的程序即可。
编辑:我最初提到了 UniCurses
库,但它似乎没有得到很好的支持,所以我将其更改为 windows-curses
,这似乎是 built-in curses
的补丁,用于 Windows.
一个text-based图形用户界面(GUI)应该是"based on a text widget of a GUI framework"的意思,比如Python自带的cross-platform tkinter模块,就是IDLE使用的.目前,IDLE shell 并不是为了方便你想做的事情而设计的。相反,您可以使用 Label 或 Text 小部件编写自己的 tkinter 程序。以下可以给你一个开始。
import tkinter as tk
r = tk.Tk()
f = 'TkFixedFont'
s = 'X '
sv = tk.StringVar(r)
l = tk.Label(r, font=f, textvariable=sv)
sv.set(s)
t = tk.Text(r, font=f, height=1, width=10)
t.insert('1.0', 'X')
n = 0 # index of marker
i = 200 # milliseconds between moves
def moveright():
global n, s
if n < 9:
s = ' ' + s[:-1]
sv.set(s)
t.insert('1.0', ' ')
n += 1
r.after(i, moveright)
else:
moveleft()
def moveleft():
global n, s
if n:
s = s[1:] + ' '
sv.set(s)
t.delete('1.0', '1.1')
n -= 1
r.after(i, moveleft)
else:
moveright()
l.pack()
t.pack()
r.after(i, moveright)
r.mainloop()