Khoe cái Terminal tự làm bằng Python

Tuy không lớn những hôm nay em vẫn muốn khoe với mọi người :smile:
Hôm trước vẫn như mọi ngày bình thường em bật Powershell lên gõ bậy vài chữ. Bỗng nhớ đến cái Terminal Linux hồi trước dùng nó cool thế nào. Thế là em thử làm một cái xem sao. Cũng lên forum của Pygame ngó vài cái rồi về tự xử.
Terminal của em thì cũng đơn giản như gõ lệnh rồi thực hiện command nhưng nó không bá sì đạo như Terminal Linux được mà chỉ ls, pwd, cd, move file/folder, make file/folder, remove file/folder, zip/unzip file/folder, get content file Hình như em chỉ mới làm những thứ đó :smile:
Cực nhất là phần code cho chữ nó không bị che khi bị thu nhỏ khi display. Nhân chia cộng trừ từng pixel.

Khi mở Terminal.

Tuy không có scroll như vẫn kéo lên kéo xuống được bằng “key up”, “key down”. Em cũng khá cực khi làm đoạn này khi phải tính height rồi chia số dòng tối đa. camBot, camTop.

Này là demo ạ

Link source: https://github.com/graktung/myterminal

15 Likes

:V để link github ra text đê thím, để vào ảnh thế kia lười gõ lại lắm :V

:smile: em đâu có ý nghĩ về việc mọi người muốn xem code đâu :smile:

2 Likes

terminal nó có set width bao nhiêu ký tự mà, dựa vào đó mà 1 line ví dụ 321 ký tự, width là 80 thì thành 5 dòng mỗi dòng 80-80-80-80-1 ký tự rồi vẽ thôi, nhân chia cộng trừ chi cho khổ :joy:

sợ người ta resize window thì code cái event resize sao cho nó snap vô 80-79-78-77 ký tự, đừng để lẻ 79.125 ký tự. 1 ký tự monospace có width bằng nhau hết, ví dụ 8 pixels thì window width chỉ có thể là bội của 8.

1 Like

em làm bằng cách là cứ len(dòng) mà * 8 # độ rộng của một chữ. > width thì em cắt nó tới khi nhỏ hơn thì thôi. Rồi chỉnh lại fullLine # số dòng tối đa display với height hiện tại.

1 Like

Thực ra thì trong Linux những lệnh như ls, pwd không phải thực hiện bởi Terminal. Terminal giống như “cửa trước” của shell thôi. Khi bạn gõ ls, Terminal đưa lệnh đó vào shell (/usr/bin/bash chẳng hạn), và shell sẽ kiểm tra coi đây có phải là 1 hàm của shell không. Nếu không phải thì shell sẽ chạy một chương trình cùng tên. Ví dụ lệnh ls là ứng với chương trình ở /bin/ls.

1 Like

:smile: cám ơn đã khai sáng ạ

1 Like

Hay lắm bạn, tiếp tục tiến tới thôi. Chúc bạn thành công.

1 Like

bạn ơi cho mình hỏi ví dụ như mình nhập lệnh passwd để đổi password của user thì làm sao để terminal nó nhận được dữ liệu mình nhập vào vậy (hoặc ví dụ đang cài cái gì đó và nó hỏi mình lựa chọn cấu hình thì làm sao mà nhập vào được) , vì mình cũng làm 1 cái terminal bằng C# nhưng comand thì mình toàn đưa từ textbox vào rồi cho nó excute nên tới đoạn nhận dữ liệu thêm mình khoogn biết phải làm thế nào

cool quá bạn ơi :slight_smile:

Nói tổng quát thì cách mình thế này.
Vòng lặp while chạy và vẽ ra cái terminal. (xóa và vẽ lại liên tục)
Nếu có dấu hiệu keypress thì mình get key đó và trả về.



Bắt đầu if else ở đây. Nếu nó trả về là các phím tắt ví dụ F1, tab, ctrl + một nút gì đó (nếu chức năng bạn có cái này thì bạn làm cho nó vào trong if)

Còn nếu không thuộc các trường hợp phím tắt mà là các chữ thì mình add vào một cái biến static.
Nếu như key bạn get được mà là enter thì bạn bắt đầu so sánh cái biến static đó.
Ví dụ key bạn get được là
có biến static string cmd
l -> cmd = 'l'
tiếp tục được key
s -> cmd = 'ls'
key tiếp theo là enter
bắt đầu phân tích biến cmd. Nếu nó có trong cái mục chức năng của terminal bạn thì bạn viết hàm cho chức năng đó. Nếu không thì bạn else {command not found;}. Và sau đó bạn nhớ gán lại biến cmd của bạn thành rỗng để tiếp tục nhận key

1 Like

ý mình là thế này : ví dụ bạn gõ : passwd user1 thì nó sẽ yêu cầu truyền password nhưng lúc này vẫn là trong câu lệnh đó làm sao mà truyền cái password vào , chứ mình mà chạy lại biến cmd là không truyền đc password vào…

thì bạn lại kiếm biến khác lưu vào :smile:

1 Like

Cơ mà Python ko có switch case hả ?

dạ không :joy:

2 Likes

good job bạn trẻ :slight_smile:

2 Likes

Em cám ơn ạ! :smile:

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?