01/10/2018, 09:59

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

Thành Phạm viết 12:06 ngày 01/10/2018

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

Henry viết 12:10 ngày 01/10/2018

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

viết 12:13 ngày 01/10/2018

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.

Henry viết 12:12 ngày 01/10/2018

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.

Nguyễn Hồng Quân viết 12:01 ngày 01/10/2018

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.

Henry viết 12:06 ngày 01/10/2018

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

Hung Nguyen viết 12:03 ngày 01/10/2018

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

Cong 5 viết 11:59 ngày 01/10/2018

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

Ng Tr Lanh viết 12:15 ngày 01/10/2018

cool quá bạn ơi

Henry viết 12:11 ngày 01/10/2018

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

Cong 5 viết 12:15 ngày 01/10/2018

ý 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…

Henry viết 12:12 ngày 01/10/2018

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

Tynk Huynk viết 12:04 ngày 01/10/2018

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

Henry viết 12:13 ngày 01/10/2018

dạ không

Phan Ngoc viết 12:01 ngày 01/10/2018

good job bạn trẻ

Henry viết 12:11 ngày 01/10/2018

Em cám ơn ạ!

Bài liên quan
0