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
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ứ đó
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
:V để link github ra text đê thím, để vào ảnh thế kia lười gõ lại lắm :V
em đâu có ý nghĩ về việc mọi người muốn xem code đâu
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ổ
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.
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.
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ệnhls
là ứng với chương trình ở /bin/ls.cám ơn đã khai sáng ạ
Hay lắm bạn, tiếp tục tiến tới thôi. Chúc bạn thành công.
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
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ạnelse {command not found;}
. Và sau đó bạn nhớ gán lại biếncmd
của bạn thành rỗng để tiếp tục nhận keyý 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
Cơ mà Python ko có switch case hả ?
dạ không
good job bạn trẻ
Em cám ơn ạ!