Lập trình giao diện GUI trong Matlab (Phần 1)

Mình viết bài này để tổng hợp lại các hướng dẫn về thiết kế giao diện GUI trong Matlab để các bạn dễ dàng thực hiện.

Phần mềm: Matlab R2007a

Bài đầu tiên mình sẽ giới thiệu các bạn giao diện GUI.

1. Mở phần mềm Matlab, gõ lệnh sau vào cửa sổ Command

>> guide

Trong cửa sổ GUIDE Quick Start có nhiều lựa chọn theo một trong các khuân mẫu sau:

Create New GUI: Tạo một hộp thoại GUI mới theo một trong các loại sau

  • Blank GUI (Default): Hộp thoại GUI trống không có một điều khiển uicontrol nào cả.
  • GUI with Uicontrols: Hộp thoại GUI với một vài uicontrol như button, ... Chương trình có thể chạy ngay.
  • GUI with Axes and Menu: Hộp thoại GUI với một uicontrol axes và button, các menu để hiển thị đồ thị.
  • Modal Question Dialog: Hộp thoại đặt câu hỏi Yes, No.

Open Existing GUI: mở một project có sẵn.

Trong hướng dẫn này, các bạn tạo một project mới nên sẽ chọn Blank GUI

2. Cửa sổ GUI hiện ra

Giao diện rất giống với các chương trình lập trình giao diện như Visual Basic, Visual C++, ... Các bạn di chuột qua các biểu tượng ở bên trái sẽ thấy tên của các điều khiển. Xin nói qua một vài điều khiển hay dùng:

  • Push Button: giống như nút Command Button trong VB. Là các nút bấm như nút OK, Cancel mà ta vẫn bấm.
  • Slider : Thanh trượt có một con trượt chạy trên đó.
  • Radio Button : Nút nhỏ hình tròn để chọn lựa
  • Check Box
  • Edit Text
  • Static Text
  • Pop-up Menu
  • List Box
  • Axes
  • Panel
  • Button Group
  • ActiveX Control
  • Toggle Button

Các bạn hãy thử gắp thả vài điều khiển vào trong giao diện bên phải xem hình dạng thế nào ?? Hình dạng ra sao nhỉ ??

Còn menu thì quan trọng nhất là menu Tools có:

  • Run (Ctr + T) : nhấn vào để chạy chương trình mà ta đã viết. Có lỗi là hiện ra ngày Big Grin
  • Align Object: dùng để làm cho các điều khiển sắp xếp gọn đẹp theo ý mình như cùng căn lề bên trái, ...
  • Grid and Rulers : dùng để cấu hình về lưới trong giao diện vì nó sẽ coi giao diện như một ma trận các ô vuông nhỏ, ta sẽ thay đổi giá trị này để cho các điều khiển có thể thả ở đâu tùy ý cho đẹp.
  • Menu Editor : trình này để tạo menu cho điều khiển
  • Tab Order Editor : sắp xếp Tab order là thứ tự khi ta nhấn phím Tab
  • Gui Options : lựa chọn cho giao diện GUI.

Các bạn nên vào menu Help để xem hướng dẫn thêm trong Help.

Các bạn save dưới tên: TUT01, khi đó đồng thời xuất hiện cửa sổ Editor và đang mở file TUT01.m của bạn. Trong thư mục bạn save sẽ có 2 file là:

  • TUT01.fig : file này chứa giao diện của chương trình
  • TUT01.m : file chứa các mã thực thi cho chương trình như các hàm khởi tạo, các hàm callback,... (sẽ nói chi tiết vào bài khác).

3. Kéo thả các điều khiển

Nói hơi nhiều nên các bạn ghét rồi, nên hãy làm một ví dụ đơn giản cho vui còn học tiếp nào.

Hãy kéo vào trong giao diện 2 edit box, 1 static box và 1 Push Button.

Chương trình có chức năng khi nhấn vào nút bấm thì kết quả của phép tính cộng giữa 2 số được gõ vào 2 ô sẽ hiện lên trong Static Text.

4. Thay đổi các thuộc tính của các điều khiển

Click đúp vào Edit Text bên trái để xuất hiện cửa sổ các thuộc tính của điều khiển. Có thể sắp xếp theo chức năng hoặc theo thứ tự A-Z của tên thuộc tính bằng nút hiện ở gõ bên trái.

Các thuộc tính này các bạn hãy thử thay đổi xem nó thế nào nhỉ ??

Thuộc tính quan trọng của Edit Box bao gồm:

  • Tag: đây là thuộc tính giống như Caption trong Visual Basic để đặt tên điều khiển. Dùng tên này có thể thao tác đến các thuộc tính của đối tượng. Mình đặt tên là: editStr1.
  • String : là xâu kí tự hiện lên Edit Box. Các bạn xóa cái này đi.

Tương tự, thay đổi thuộc tính tag của Edit Box thứ 2 thành editStr2. Static Box cũng tương tự thành staticStr3.

Push Button: thuộc tính tag = buttonCalculate, string = calculate

5. Viết lệnh cho chương trình

Chương trình có tác dụng khi nhấn vào nút Push Button sẽ hiện lên kết quả ở Static Box. Vì thế nên sẽ phải viết vào hàm nào mà khi nhấn vào Push Button sẽ gọi. Chính là hàm Callback. Điều khiển nào cũng có hàm callback, như hàm ngắt trong vi điều khiển vậy :D.

Click chuột phải vào nút Calculate chọn Callback. Trong này còn một số hàm nữa sẽ tính sau.

Nhìn vào định nghĩa của hàm trong Editor bạn sẽ thấy là: hàm này được thực hiện khi nhấn vào nút buttonCalculate.

Hàm có một số tham số:

  • hObject : handle của điều khiển buttonCalculate
  • eventdata
  • handles : là một cấu trúc chứa tất cả các điều khiển và dữ liệu người dùng. Dùng cái này để truy suất các điều khiển khác.

Qua thuộc tính tag của các điều khiển ta sẽ truy suất đến thuộc tính string của các điều khiển editStr1, editStr2,editStr3 bằng lệnh getset.

get(handles.tag_dieu_khien, 'ten thuoc tinh');

set(handles.tag_dieu_khien, 'ten_thuoc_tinh', gia_tri);

và hàm quan trọng nữa biến từ string sang số là hàm: str2num và num2str để biến trở lại.

Vậy chúng ta sẽ viết hàm như sau:

Nhấn nút Run kiểm tra kết quả xem nào:

Tham khảo

Ngô Hải Bắc, Lập trình GUI trong Matlab, www.dientuvietnam.net, 2005

Ngô Hải Bắc, Giao tiếp RS232 trên PC qua Matlab, www.picvietnam.com, 2006

{ 221 comments… add one }
  • thanhthoa October 30, 2010, 12:26 am

    Anh Bắc ơi giúp em với!
    Làm cách nào để đưa 1 matran vào Edit text và thực hiện các phép toán được vậy anh?
    Anh cho em 1 vi dụ nhập 2 matran và xuất ra matran tổng được không ạ?
    Em cảm ơn anh nhe!
    Giúp em với anh! Em đang cần gấp nè.

    Reply
  • lợi November 1, 2010, 8:22 am

    anh ơi em có cái tiểu luận làm phần con led đơn điều khiển sáng tắt dùng giao diện matlab,ngòai ra có thêm phần hiện lổi khi có sự cố phần cứng em không biết làm phần này thế nào anh chỉ giúp em được không

    Reply
  • yu-chan December 20, 2010, 3:27 pm

    Chào bạn. Cho mình hỏi làm sao vẽ được đồ thị y=a sin3x(b cosx + c sinx) trong gui được không.
    Mình còn một bài nhập năm rồi kiểm tra xem đó có phải năm nhuận không rồi in ngày tháng trong năm. Bạn giúp mình với

    Reply
  • NB December 29, 2010, 3:57 am

    Anh Bắc cho em hỏi? có phải bản Matlab nhà em bị lỗi không?
    em viết 1 chương trình đơn giản: nhấn nút pushbutton -> hiện lên chữ trên edit textbox. vậy mà nhấn nút chẳng thấy có gì xảy ra.

    function pushbutton1_Callback(hObject, eventdata, handles)
    % hObject handle to pushbutton1 (see GCBO)
    % eventdata reserved – to be defined in a future version of MATLAB
    % handles structure with handles and user data (see GUIDATA)
    set(handles.edit1,’String’,’12345′);

    em có down một số ví dụ,cả demo có sẵn cũng không chạy được.Nó không báo lỗi gì hết. chỉ có cái là không thấy nó thực thi lệnh gì hết.Không biết nó bị lỗi gì?

    Reply
  • sks March 4, 2011, 6:53 pm

    Các bạn có ai biết thiết kế tab trong GUIE của matlab ko vậy? chỉ cho mình với, cảm ơn nhiều!

    Reply
  • Tran Van Dien March 16, 2011, 11:01 pm

    Chao anh! giup em voi, em dang lap trinh GUI, muon 2 axes deu hien mot lan thi sao a.
    Em cam on!

    Reply
  • Nguyen Thang March 26, 2011, 10:47 am

    Các bạn cho mình hỏi, mình có một vần đề thế này.
    Mình muốn vẽ một hình, ví dụ như hình chữ nhật chẳng hạn, nếu muốn chú thích kích thước của chiều cao hình chữ nhật thì mình lệnh text là được rồi. Nhưng vấn đề là kích thước của chiều cao không nằm bám theo chiều cao mà lại nằm ngang. Mình muốn các bạn giúp mình đẻ chuyển chữ số đó nằm bám theo chiều cao hình chữ nhật.
    Mình xin cảm ơn mọi người!

    Reply
  • Kiên_Đào March 27, 2011, 6:53 pm

    Anh ơi em đang thực hiện đề tài môn học, đề tài đó là nhận dạng đối tượng. Thầy nói ví dụ cho 1 bức hình thì phân biệt được đâu là con người hoặc cái cây. Em chưa có ý tưởng gì. Mong anh và các bạn giúp đỡ. Xin cám ơn rất nhiều!

    Reply
  • viet April 9, 2011, 12:27 pm

    a Bac ơi, e đang dùng ver 7.0, k có chức năng add table vào trong guide(cái này trong matlab 2008) vậy làm cách nào để add cái table hay có cái table này trong guide vậy a
    nếu mua đĩa mới thì phỉa dùng loại version mấy? thanks a
    nhờ a chỉ giáo giúp vì e đang làm luận văn và muốn dùng chức năng này để hiển thị kết quả (ý tưởng),mong a chỉ giáo giúp

    Reply
  • mailinh June 8, 2011, 7:51 am

    anhBac oi.e dg lam bao cao ve tinh fuzzy logic ung dung trong Matlab,de tai cua e la may bay khong nguoi lai.a co the cho e hoi minh lam GUI nhu the nao k a?bay gio e da tao dc FIS,neu e vao rule de xem truc tiep thi ok.nhung y e la tu GUI,nhap so lieu cua bien dau vao de xuat ra gia tri dau ra.Xin a giup e voi…

    Reply
  • thanhtruc July 9, 2011, 7:00 pm

    Em đang đi vào ngõ cụt rồi các bác ơi. Em làm đề tài truyền nhận tín hiệu giao diện matlab. Nhận được nhưng không hiển thị lên edit_text mà chỉ hiển thị ở command windown. Ai biết lỗi này do đâu giúp em với. em làm theo chương trình của anh Bắc đó. Nhưng sao chương trình của anh hiển thị được mà chương trình của em không hiển thị được

    Reply
  • khanh August 13, 2011, 11:54 pm

    ban oi giup minh voi
    minh lam bai tap lon phan thiet ke guide ve dem so lan kich chuot

    Reply
  • hung September 30, 2011, 12:24 am

    em dang thiet ke bo dieu khien hoi tiep trang thai , cho ham nac don vi r(t), 1 bo dieu khien U va 1 doi tuong, ngo ra la C, voi u= -6×1+x2+r, va dieu khien doi tuong la c=x1;
    dx1/d=x1(x2-1)+u,
    dx2/d=x1^2 – x2 +u ,
    biet doi tuong ca bo dieu khien la 2 subsystem

    Reply
  • dinh luong October 6, 2011, 9:53 am

    các bác ơi giup em với .
    em dang làm bài tập lớn viết giao diện để giảu pt vi phân
    cho phép nhập1 số hàm tương tự như:
    vd: d^2x/d^2t+10*dx/dt+5x=11
    cho phép nhập các diều kiện đầu
    giải pt trên và hiện thị kết quả

    Reply
  • magiz433 October 19, 2011, 12:47 pm

    Anh bắc ơi giúp em về chọn vẽ đáp ứng với tín hiệu vào là hàm parabol đơn vị trong hệ thống điều khiển tự động. em lập Gui biểu diễn hàm truyền.từ hàm truyền chon vẽ đáp ứng. hàm nấc, hàm dốc, và hàm parbol. em dùng popupmenu để chọn đáp ứng vẽ. hàm nấc (lenh step(G)), hàm dốc ( Impulse ??? ) còn hàm parabol thì sao ah??

    Reply
  • linhnhi November 7, 2011, 4:20 pm

    Chào a Bắc, em xin phép được hỏi anh vấn đề sau, mong anh sớm trả lời:
    Làm thế nào để liên kết hai giao diện GUI ạ, tức là khi mình nhấn vào một nút nào đó sẽ mở giao diện khác lên, đồng thời tắt giao diện hiện tại đi ạ.
    Cám ơn anh trước nha

    Reply
  • vanchung December 8, 2011, 6:46 am

    em mới học matlap chưa biết gì nhiều,mong a admin giúp đỡ em trong thời gian tới,em cảm ơn!

    Reply
  • ruanyou December 14, 2011, 9:36 am

    a Bắc ơi!làm ơn chỉ giúp e làm thế nào để kết nối dữ liệu giữa 2 function dàng word

    Reply
  • quangha37 February 14, 2012, 6:57 pm

    anh ơi.anh có thể giúp em đề tài này dc ko ạ?tìm hiểu về UI controls trong matlab và ứng dụng”anh có thể cho em 1 số tài liệu để tham khảo dc ko ạ.

    Reply
  • Tien March 8, 2012, 9:33 pm

    kq = get(handles.edit_KQ,’String’);
    kq =[ kq,’1′];
    set(handles.edit_KQ,’String’,’kq’);

    em làm theo hướng dẫn cũa anh, nhưng khi ấn pus 1, nó lại hiện ra trên edit text la kq, và chĩ ấn được 1 lần, em đang dùng matlab 10. Cãm ơn anh

    Reply
  • Pham Quyet Tien April 10, 2012, 11:26 am

    Da chao anh Bac!
    Khi lap trinh phan gui trong matlab lúc trước em lưu lại có tên là TUT01 thì sẽ tạo ra 3file là:TUT01.m và TUT01.fig và TUT01.asv thì chương trình chạy rất tốt.
    Nhưng không biết bây giờ bị lỗi gì mà khi em lưu thì chỉ tao ra 2file là:TUT01.m và TUT01.fig nên chương trình không chạy được.
    Xin trả lời giúp em với.
    Em chân thành cảm ơn!

    Reply
  • Hoàn April 15, 2012, 8:46 am

    Em chào anh Bắc.Em đang làm đồ án về SC-FDMA trong LTE 4G,gặp vấn đề mô phỏng nhờ anh giúp đỡ.
    Em muốn thiết kế giao diện GUI để mô phỏng.
    Em muốn dùng popupmenu cho Modulation và một ô nhập giá trị cho Rolloff Factor
    Modulation la dạng String(có 2 giá trị là Q-PSK và 16QAM),Rolloff Factor có giá trị từ 0 đến 1.
    Sau đó gán dataType=giá trị của Modulation,Alpha=gia tri Roloff Factor và sử dụng dataType và Alpha làm giá trị biến đầu vào để chạy File.m khác.
    Nhờ anh chỉ giúp em với.Mail:hoan07dt3@gmail.com
    Cảm ơn anh nhiều!

    Reply
  • ngaongao April 24, 2012, 5:34 pm

    Chào anh! Em đang làm thực tập tốt nghiệp về sử dụng thuật toán di truyền để giải bài toán phi tuyến. Trong phần giao diện em muốn nhập một ma trận thì làm thế nào ạ?

    Reply
  • vuphuongsphn August 11, 2012, 2:39 pm

    Em chào bác admin và các cao thủ matlab!

    Em là dân trong lĩnh vực datamining.

    Bác có thể giúp em việc này được không ạ?

    1/Hiện tại; e đang dùng tool trong mạng noron. em muốn phá code tool đó; sửa theo ý của mình.

    e ko rõ cách bố trí file của 1 tool trong matlab như thế nào?

    Ví dụ; em đang dùng tool nprtool. Em có tìm được file nprtool.m; xong giờ e muốn tìm file xử lý giao diện .fig của nó? Vào đâu để tìm ạ? hay nó dùng cách khác tạo ra giao diện GUI của tool này?
    2/ Và như vậy, 1 tool trong matlab gồm những file nào; và tác động; vào file nào; đối tượng nào ở đâu để mình thêm bớt được ạ? Em giờ đang cần gấp; nên rất mong bác giúp

    Thanks bác và cả nhà trước

    Reply
  • Hồ Thành Luân October 14, 2012, 9:13 am

    Anh bắc ơi! Anh cho e hỏi tí được ko ?
    giờ em đang làm đề tài ‘giải phương trình bậc nhất’ ax+b=0 => x=-b/a
    Vậy anh cho e hỏi muốn tạo nút reset thì phải làm như thế nào ?
    Phải viết dòng lệnh ra sao ?
    Mong anh hồi âm sớm !
    e cảm ơn anh nhiều!

    Reply
  • gioheomay December 27, 2012, 9:53 pm

    a ơi.cho e hỏi. chạy 1 chương trình trên matlab thì như thía nào vây?các a giúp em với???????

    Reply
  • Nga nguyen June 11, 2013, 3:33 pm

    Em chào anh.
    Anh ơi, em học bên công nghệ sinh học nên ko rõ matlab nhiều, nhưng em đang làm tiểu luận trong đó có phải vẽ một đồ thị của phương trình mà em đã tính toán kết quả như sau:
    y = 0.411 + 0.125.Z1 – 0.075.Z2 – 0.017.Z3 + 0.005.Z2.Z3 – 0.0034.Z1.Z3
    trong đó: Z1 là nồng độ tinh dầu;
    Z2 là phân đoạn và hỗn hợp các phân đoạn tinh dầu
    Z3 là chủng loại VSV;
    Anh vẽ giúp em đồ thị của phương trình này với.
    Em cảm ơn anh rất nhiều. Mong nhận được thư trả lời của anh sớm ạ.

    Reply
  • trungthu August 6, 2013, 8:04 am

    anh bắc cho em hỏi một chút, em đang làm về nhận dạng chữ , em làm phần GUI,
    – bây giờ em muốn tạo một khung để vẽ ảnh vào đó, khi vẽ xong ảnh đó mình ấn nút nhận dạng thì nó hiện ra một khung để mình lưu tên ảnh đó lại, sau khi nó lưu thì nó sẽ nhân dạng ảnh đó luôn.
    – ý tưởng của em là vậy nhưng giờ cái chỗ vẽ khung ảnh kia, và lưu ảnh, em không biết. mong anh chỉ em với

    Reply
  • Khang October 11, 2013, 11:30 pm

    Anh ngohaibac ơi cho em hỏi chút, ví dụ giờ ô edit text em dùng hàm
    a=get(handles.edit1,’String’)

    Nếu mình ko nhập gì vào a hết, em muốn khi nhấn push button thì hiện lên static text chữ “Hello”

    if a==0
    set(handles.statictext,’String’,’Hello’)
    else
    end

    Nhưng em viết vậy thì không dc, em muốn hỏi là có cách nào lấy giá trị khi không gõ gì vào edit text không? Em cám ơn anh trước.

    Reply
  • phạm hồng ngọc December 19, 2013, 12:43 am

    anh có thể giúp em làm cái này được không ạ ?
    Viết chương trình có giao diện (GUI) chuyển đổi qua lại giữa các hệ đơn vị đo lường
    sau:
    – Nhiệt độ: Celsius, Fahrenheit, Kelvin.
    – Độ dài: Mét, Foot, Inch
    – Diện tích: Mét vuông, yard vuông.
    – Thể tích: Lít, Gallon.

    Reply
  • Hieu April 8, 2014, 2:44 pm

    Anh ơi, cho em hỏi làm sao để hiện thị file .mat trong matlab mà em sử dụng câu lệnh [filename pathname]=uiputfile(‘*.mat’, ‘Save as’) để lưu. Em không tìm được file đã lưu mặc dù đã chỉ đúng đường dẫn và tên file.
    Em cảm ơn anh!

    Reply
  • dương April 10, 2014, 3:32 am

    mình đang làm khóa luận tn có liên quan đến code matlab. có bạn nào giúp mình đc ko ạ. mình sẽ thuê các bạn. có gì liên hệ mail mình nhé

    Reply
  • Huynh April 10, 2014, 7:54 am

    Em có đề tài về nhận dạng vân tay.Mong admin giúp đỡ ạ. Ad có tài liệu gì về vấn đề này không ạ.

    Reply
  • thuy April 27, 2014, 1:26 pm

    anh ơi,cho em hỏi em kéo thả xong sau đó run nhưng các components không hiển thị lên ạ.

    Reply
  • thuy April 27, 2014, 1:32 pm

    anh ơi,cho em hỏi em kéo thả giao diện xong rồi run nhưng các components không hiển thị lên được ạ,

    Reply
  • NguyenThanh May 16, 2014, 5:30 pm

    Anh cho em hỏi cách để ghép xâu với ạ. Vì em làm giao diện khảo sát hàm số, và để hiển thị tất cả thông tin: Tập xác định, đạo hàm, chiều biến thiên,… lên edit thì em không biết làm thế nào.

    Reply
  • Trịnh Dung August 26, 2014, 10:10 am

    A ơi cho em hoi minh chon Font chữ Tiêng Việt chọn sao a

    Reply
  • Butto November 27, 2014, 9:20 pm

    A Hải ơi, e đang gặp vấn đề truyền gởi 1 ký tự xuống Pic16f877a. Do là e không biết thiết lập truyền gửi trong matlab. hy vọng a có thể giúp e. E cảm ơn a trước.

    Reply
  • Tiến Sinh April 6, 2015, 9:41 am

    E chào a !
    Em đang có 1 bài tập như sau nhưng chưa hiểu biết gì nhiều và dường như không biết gì luôn. Mong a có thể giúp em với.
    Đề bài : Viết một hàm có tên “dct” để chuyển đổi một bức ảnh I bằng phương pháp chuyển đổi Cosine rời rạc (DCT) rồi giảm độ phân giải của bức ảnh đó xuống còn 80% đầu ra của ảnh là một hàm có tên I.OUT

    Reply

Leave a Comment