Ну почему, почему нейронки появились только сейчас?
Чисто, ради любопытства, спросил нейронку можно ли рисовать мышью в терминале. Говорит, можно. И не только рисовать, но и клавиши использовать.
То есть можно на питоне накидать код а-ля Нортон коммандер, терминальные приложухи, игры и прочее. Просто кайф для челиков, которые увлекаются ретро.
import sys
import termios
import tty
# ====== ANSI ======
def write(s: str):
sys.stdout.write(s)
sys.stdout.flush()
def goto(x: int, y: int):
write(f"\x1b[{y};{x}H")
def enable_mouse():
write("\x1b[?1000;1002;1006h") # click + drag SGR mode
def disable_mouse():
write("\x1b[?1000;1002;1006l")
def clear_screen():
write("\x1b[2J\x1b[H")
def hide_cursor():
write("\x1b[?25l")
def show_cursor():
write("\x1b[?25h")
# ====== Чтение события ======
def read_event():
ch = sys.stdin.read(1)
if ch == 'q':
return ('key', 'q')
if ch != '\x1b':
return ('key', ch)
ch2 = sys.stdin.read(1)
if ch2 != '[':
return ('other', None)
ch3 = sys.stdin.read(1)
if ch3 != '<':
return ('other', None)
buf = ""
while True:
c = sys.stdin.read(1)
if c in ('M', 'm'):
pressed = (c == 'M')
break
buf += c
try:
btn_str, x_str, y_str = buf.split(';')
btn = int(btn_str)
x = int(x_str)
y = int(y_str)
except ValueError:
return ('other', None)
return ('mouse', btn, x, y, pressed)
# ====== MAIN ======
def main():
if not sys.stdin.isatty():
print("Run in a real terminal (TTY).")
return
fd = sys.stdin.fileno()
old = termios.tcgetattr(fd)
drawing = False # признак зажатой кнопки
try:
tty.setraw(fd)
clear_screen()
hide_cursor()
enable_mouse()
write("🖱 Зажми и держи левую кнопку чтобы рисовать. Нажми q чтобы выйти.\n")
while True:
ev = read_event()
# выход
if ev[0] == 'key':
if ev[1] == 'q':
break
# мышь
elif ev[0] == 'mouse':
_, btn, x, y, pressed = ev
# левая кнопка (btn=0)
if btn == 0:
if pressed:
drawing = True # нажали — режим рисования включился
goto(x, y)
write("█")
else:
drawing = False # отпустили кнопку
# если мы в режиме рисования — рисуем даже при движении
if drawing and pressed:
goto(x, y)
write("█")
finally:
disable_mouse()
show_cursor()
termios.tcsetattr(fd, termios.TCSADRAIN, old)
goto(1, 9999)
write("\nВыход.\n")
if __name__ == "__main__":
main()
Хотел бы я такую игрушку ИИ в своё детство. Реально, не нужно быть книжным червём, чтобы все эти технические тонкости знать.
PETAI окончательно релизну в понедельник. Сегодня только промо подготовлю, в остальном весь код вылизал.
10 комментариев