如何在 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 无法做到这一点。

来自the documentation

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()