آموزش GUI (قسمت چهارم) مشاهده در قالب PDF چاپ فرستادن به ایمیل
نوشته شده توسط مجتبی آیتی نیا   
شنبه, 27 شهریور 1389 ساعت 18:00

در قسمت دوم آموزش GUI ، طراحی یک GUI نسبتا کامل و در ارتباط با آنالیز سیستم‌های کنترلی را آغاز کردیم. در قسمت سوم آموزش نیز کدنویسی آن‌را شروع کردیم. حال می‌خواهیم در این قسمت ادامه‌ی کدنویسی آن‌را انجام داده و GUI نهایی را تست کنیم.

به Callback منوی Exit رفته و قطعه کد زیر را وارد کنید:

button = questdlg('Do you want to quit the ControlTool?', ...

'Quit the ControlTool','Yes','No','No');

switch button

case 'Yes',

close('ControlTool');

case 'No',

quit cancel;

end

توضیح کد:

این کد یک دیالوگ پرسشی را برای کاربر به نمایش درمی‌آورد. این دیالوگ معمولا دارای گزینه‌های Yes ، No و Cancel می‌باشد که در این مورد ما فقط از گزینه‌های Yes و No استفاده کرده‌ایم. اگر کاربر دگمه‌ی Yes را بفشارد، از برنامه‌ی ControlTool خارج می‌شود و اگر No را انتخاب کند، عملیات خروج، لغو می‌گردد.

به Callback منوی Reset رفته و همان کدی را که برای دگمه‌ی فشاری Reset در قسمت سوم آموزش شرح دادم، قرار دهید.

حال به Callback منوی Figure رفته و کد زیر را وارد کنید:

printdlg(ControlTool);

این کد از کل GUI‌ی ما پرینت می‌گیرد. درواقع این دستور از کل محتویات یک شیء گرافیکی(که در این مورد این شیء گرافیکی ControlTool نام دارد)، پرینت تهیه می‌کند.

سپس به Callback منوی Response of LTI System رفته و قطعه کد زیر را وارد کنید:

axes1fig = figure(10010);

axes1copy = copyobj(handles.axes1,axes1fig);

set(axes1copy,'Units','default','Position','default');

printdlg(10010);

close 10010

 

توضیح کد:

این کد ابتدا یک شیء گرافیکی ایجاد کرده و سپس axes موردنظر را بوسیله‌ی دستور copyobj در آن شیء کپی می‌کند. پس از آن واحدها و مکان axes کپی شده در شیء ساخته شده به حالت پیش‌فرض خود می‌روند. بعد از آن از شیء گرافیکی ایجاد شده، پرینت گرفته می‌شود و نهایت هم شیء گرافیکی بسته می‌شود.

درادامه به Callbackهای Roots analysis و Frequency response رفته و همان کد بالا را برای آنها بنویسید. فقط تنها تغییری که می‌دهید این است که برای هرکدام، axes مربوطه را قرار می‌دهید.

حال به Callback منوی Show grid رفته و قطعه کد زیر را وارد کنید:

grid(handles.axes1,'on');

grid(handles.axes2,'on');

grid(handles.axes3,'on');

 

همان‌طور که کاملا واضح است، این دستورات، نمودارها را شبکه‌بندی می‌کنند.

برای منوی Hide grid نیز عین این دستورات را به کار ببرید با این تفاوت که به‌جای on از off استفاده کنید. با این کار شبکه‌بندی کلیه‌ی نمودارها حذف می‌شود.

به Callback منوی Using the ControlTool رفته و کد زیر را وارد کنید:

helpdlg('This is a graphical user interface(GUI) that apply for analysis of linear systems.','Help');

 

توضیح کد:

این دستور یک دیالوگ کمک را برای کاربر به نمایش در‌می‌آورد. نویسنده‌ی GUI ، می‌تواند در این قسمت تمامی مواردی را که به کاربر در نحوه‌ی استفاده از برنامه کمک می‌کند، وارد کند. این دیالوگ را اگر یادتان باشد، می‌توانیم با کلیدهای Ctrl+H نیز باز کنیم.

درنهایت به Callback منوی About ControlTool رفته و کد زیر را وارد کنید:

helpdlg('Created by Mojtaba Ayati nia   Email: آدرس ایمیل جهت جلوگیری از رباتهای هرزنامه محافظت شده اند، جهت مشاهده آنها شما نیاز به فعال ساختن جاوا اسکریپت دارید ','About ControlTool');

 

توضیح کد:

این کد یک دیالوگ از نوع کمک را ایجاد می‌کند که شامل اطلاعاتی درباره‌ی سازنده‌ی برنامه و... می‌باشد. شما می‌توانید اسم و دیگر مشخصات خودتان را وارد کنید.

در این مرحله کدنویسی به پایان رسیده و می‌توانیم GUI را اجرا کنیم.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

اگر سؤالي داشتيد مي‌توانيد در بخش نظرات آن را مطرح كنيد.

از لینک زیر می‌توانید این GUI را دریافت کنید:

دانلود

 

براي رفتن به ديگر قسمت‌ها، به‌روي لينك‌هاي زير كليك كنيد:

آموزش GUI (قسمت اول)

آموزش GUI (قسمت دوم)

آموزش GUI (قسمت سوم)

آموزش GUI (قسمت چهارم)

 

  • alaleh  - ممنونم خیلی زیاد
    واقعا عالی بود
    ممنون از زحماتتون
  • AH  - Thanks a lot
    Vagaan dastetun dard nakone
    Ali Bud
  • azi  - تشکر
    سلام
    با تشکر خیلی مفید بود.
  • vahid  - سوال
    اگر بخواهيم همزمان بااجراي برنامه(زدن Run)، زمان را نيز به طور پيوسته در صفحه، نمايش دهيم چه کار بايد کرد :?: :?: :?: :?:
    ممنون :P :P :P :P :P :P
  • moj1001
    منظورت رو متوجه نمي‌شم؟ زمان منظورت ساعته يا زمان شروع برنامه؟
  • vahid  - سوال
    مظورم اينه که بازدن Run, دو کار همزمان انجام بشه!
    :roll: :roll: :roll:
  • moj1001
    شما با زدن دگمه Run در واقع يك سري دستورات را اجرا مي‌كنيد. حال اين دستورات مي‌توانند دو كار همزمان نيز انجام دهند.(البته من منظورتان را كاملا از دو کار همزمان متوجه نشدم!)
  • vahid
    مي خواهم از طريق GUI يه سري ورودي به يک M-File ياM_Functionبدهم و خروجي آن را به GUI برگردانم.
    چه کار بايد کرد؟؟
    ممنون ازوقت که ميگذاري که سوالات رو جواب بدي
    :wink: :wink: :wink: :wink:
  • vahid  - یافتن جواب
    در رابطه با ایجاد ارتباط ما بین GUI و M-file که سوال کردم فهمیدم که می توان از دستور evalیا evalin استفاده کرد.
    :idea: :idea: :idea: :idea: :idea:
    تشکر زیاد
  • آرمان  - انتخاب نقطه
    سلام
    چطوری میشه از روی نمودار نقطه ای رو انتخاب کرد و مختصات اون رو به برنامه فرستاد؟؟؟

    نمودار توی یک GUI البته
  • سلام  - وارد کردن scroll به gui
    می خواستم بدونم میشه صفحه gui را به صورت scroll دار در آورد تا اگه مثلا خواستیم 10 تا نمودار تو یه صفحه رسم کرد جا بشه؟
  • moj1001
    اگه مي‌خاي چند نمودار جداگونه داشته باشي خب چند تا axes مي‌ياري و اگه بخاي چند نمودار رو روي يك صفحه داشته باشي از دستور hold استفاده مي‌كني.
  • ناشناس  - re:
    moj1001 نوشت:
    اگه مي‌خاي چند نمودار جداگونه داشته باشي خب چند تا axes مي‌ياري و اگه بخاي چند نمودار رو روي يك صفحه داشته باشي از دستور hold استفاده مي‌كني.

    ببخشید فکر کنم منظورم رو متوجه نشدیداندازه مساحت صفحه gui محدوده. با دسگیره های کنار صفحه هم تا یه حدی صفحه رو بزرگ می کنه. نمیشه 10 تا نمودار رو توش جا کرد. منظورم اینه که مثل صفحه های اینترنت که scroll داره صفحه بالا پایین میره. صفحه gui بالا پایین بره و نمودار ها زیر هم کشیده بشه
  • moj1001
    ok
    Maximizing the Layout Area

    You can make maximum use of space within the Layout Editor by hiding the GUIDE toolbar, status bar, or both. To do this, deselect Show Toolbar and/or Show Status Bar from the View menu. Showing only tool icons on the component palette gives you more room as well. To show only tool icons on the component palette, select Preferences from the GUIDE File menu and deselect Show names in component palette. If you do all these things, the layout editor looks like this.
    http://s1.picofile.com/file/6991736416/gui.png
  • criceos  - re:
    moj1001 نوشت:
    مرسي


    با سلام
    من یک کد در mfile نوشتم که ورودی آن عدد و خروجی آن 4تا نمودار هستش که شامل ارتباط سریال و یک سری پردازش هست
    برای اینکه من ورودی و خروجی را در gui نشون بدم باید کل کد را در gui بنویسم؟ میشه یکم توضیح بدین؟
  • moj1001
    سلام
    هم مي‌توني كل كد رو تو gui بنويسي و هم قسمتي رو جدا در يك mfile نوشته و در gui از اون استفاده كني.
  • Real Madrid  - re: re:
    ناشناس نوشت:
    [quote=moj1001]اگه مي‌خاي چند نمودار جداگونه داشته باشي خب چند تا axes مي‌ياري و اگه بخاي چند نمودار رو روي يك صفحه داشته باشي از دستور hold استفاده مي‌كني.

    ببخشید فکر کنم منظورم رو متوجه نشدیداندازه مساحت صفحه gui محدوده. با دسگیره های کنار صفحه هم تا یه حدی صفحه رو بزرگ می کنه. نمیشه 10 تا نمودار رو توش جا کرد. منظورم اینه که مثل صفحه های اینترنت که scroll داره صفحه بالا پایین میره. صفحه gui بالا پایین بره و نمودار ها زیر هم کشیده بشه [/quote]
    این کار را می توان در محیط gui به فرم زیر انجام داد:
    Tools>gui options
    Resize behavior
    proportional
    با تنظیم مورد فوق بس از اجای gui گزینه های maximize و دستگیره های تغییر اندازه پنجره امکان پذیر است
  • moj1001
    سلام
    مرسي دوست عزيز از اطلاعاتي كه در اختيار ما گذاشتيد. اما نكته‌اي كه هست اون دوستمون منظورش scroll بود نه maximize!
  • ناشناس
    هر چی باشه بهتر از هیچی :D 8)
  • kani
    سلام
    من میخوام یه gui طراحی کنم که انتگرال معین یگانه رو حساب کنه.میشه لطفا کمکم کنید؟
  • فرزانه
    سلام
    ممنون از آموزشای خوبتون ، قسمت اولش رو خوندم برای آشنایی خوب بود من دارم رو یه پروژه پردازش تصویر کار می کنم . می شه یه جی یو آی مثال بزنید که بشه توش 2 تا عکس داشته باشیم یکی را کاربر وارد کند یعنی دکمه براوز داشته باشد و دومی نتیجه حستجو در پایگاه داده در مورد عکش مشابه باشه و درصد شباهت رو هم می خوام نشون بده .
    اگه راهنمایی هم بکنید ممنون می شم.
    :roll:
  • علی
    سلام خسته نباشید من میخوام بوسیله gui چراغ راهنمایی طراحی کنم امکان داره کمکم کنید با تشکر
  • moj1001
    سلام
    با دستور pause مي توني تاخير لازمه رو ايجاد كني
  • Muhammad  - با سلام
    ممنون از سايت بسيار خوبتون
  • الهه
    فیلتر انتگرال گیری به تصویررا جگونه اعمال کنیم؟
  • ahmadpashaei
    سلام من می خوام بدونم الان آموزش GUI شما تموم شده؟ میشه با GUI ربات و بازو طراحی کرد که حرکت کنه؟
    در ضمن خیلی ممنون از آموزش تصویری خوبتون هستم.
  • moj1001
    سلام
    بله فعلا تموم شده. هر برنامه‌اي كه بشه كدش رو نوشت و المان‌هاي گرافيكي اون موجود باشه ميشه طراحي كرد.خواهش مي‌كنم.
  • ناشناس
    سلام
    اگر ممکن آموزش منطق فازی با matlab رو هم داشته باشید
    ممنون
  • msjalali
    سلام دوستان. ممنون از راهنمائیهاتون.
    من میخوام بدونم چطوری میشه تو یک GUI مسیر یک فایل ورودی رو با Browser ایجاد کرد. دارم رو یک برنامه پردازش تصویر کار می کنم و لازمه که یک فیلم که یکجائی روی سیستم سیو شده رو به برنامه وارد کنم.
    لطفا راهنمائی کنید. ممنون
  • msjalali
    سلام دوستان
    من صبح یه چیزی پرسیدم ولی بعدش گشتم و جوابشو پیدا کردم. گفتم اینجا بیارم شاید به درد بقیه هم بخوره.
    دستور uigetfile به شما کمک میکنه. اجرای این دستور یک برنامه فراخوانی استاندارد رو اجرا می کنه و جوابش فایلی که شما انتخاب کردین. اینجوری میتونین یک Browser تو GUI درست کنین.
  • moj1001
    سلام
    آفرين به تو كه خودت پيداش كردي اومدن كه جوابت رو بدم ديدم خودت جواب رو نوشتي!
  • فرشته  - در خصوص ارتباط با تابع
    سلام...چطوری در محیط gui میشه یک button را با یک تابع ارتباط داد یعنی وقتی بر روی ان کلیک میشه اون تابع که نوشتیم و پسوند .m هست را اجرا کنه
    لطفا زود جواب بدین ممنوووووووووون
  • moj1001
    سلام
    نام اون تابع رو در كال‌بك ذكر مي‌كني.
  • ayob  - درخواست
    سلام خسته نباشین
    واقعااین مثالی که اوردین عالیه...
    می خواستم ببینم می تونم M-file این مثالتون رو داشته باشم???...
  • محمد عسکری  - کمک!
    سلام
    ممنون از لطفتون خیلی عالیه.
    من یک سوال داشتم
    چه طوری می تونم یک آرایه رو که در جایی به صورت m-file ذخیره کردم به عنوان ورودی به gui بدم ؟
  • moj1001
    سلام
    يعني چي در جایی به صورت m-file ذخیره کردي؟
  • محمد عسکری  - پاسخ
    ممنون که جوابم رو دادید.
    راستش واسه پروژه کارشناسی به دردم می خورد ، مشکل حل شد.
    حالا یه مشکل دیگه ای دارم ، به دلیل اینکه تو تابع تبدیل مطلب (tf) نمیشه تأخیر توی مخرج داد مجبورم از سیمولینک استفاده کنم.
    حالا چه جوری می تونم اطلاعات gui رو بفرستم به سیمولینک.
    با تشکر از توجه شما!
  • moj1001
    سلام
    دوست عزيز تو همون tf هم مي‌توني اين كار رو انجام بدي!
    كافيه يه منفي در s ضرب كني همين.
  • محمد عسکری
    عزیز دل ، نمیشه ،شاید من بلد نیستم ولی پس از اجرای دستور زیر پیغامی که میبینی رو میده، میگه عدد منفی برای تأخیر قابل قبول نیست !
    نمیشه ولی اگه بشه چی میشه!
    tf([1],[1 2 3],'inputdelay',-2)
    ??? Error using ==> tf.tf>tf.tf at 360
    The value of the "InputDelay" property must be a vector of nonnegative numbers.
  • moj1001
    سلام
    خب دليلش رو متوجه نشدي؟؟؟؟؟؟؟؟؟؟؟!!!!!!!!!!!! :idea:
    هنوز قضيه رو نگرفتي؟
    تاخير منفي كه نداريم عزيز!
  • محمد عسکری
    چرا میشه عزیزم!
    وقتی می خوایم یه پروسه ناپایدار رو با pid پایدار کنیم ، توی تابع حلقه بسته تأخیر میره تو مخرج و این یعنی تأخیر منفی و آغاز بدبختی من !
    تابع رو با سیمولینک پیاده سازی کردم ولی باید بدون سیمولینک این کار رو انجام بدم که بشه تو gui ازش استفاده کنم .
    ضمناً اگه بتونم از یک پاسخ پله تابع تبدیل به دست بیارم هم مشکلم حل می شه ، یعنی تابع معکوس step !
  • moj1001
    به هرحال من اولين باره كه مي‌شنوم كسي مي‌خاد تاخير منفي استفاده كنه! و شما ممكنه در حالت تئوري بتوني تاخير منفي ايجاد كني ولي در عمل غيرممكنه.
    براي كنترل‌كننده pid هم روش‌هاي مختلفي هست كه بتوني p و i و d رو محاسبه كني.
    در ضمن بعيد مي‌دونم تونسته باشي تاخير منفي در سيمولينك بدي؟!
  • reihaneh  - مشکل در زمینه ی محو و ایجاد یک المان
    سلام
    به خاطر سایت خیلی خوبتون و توضیحات کاملتون
    من دارم یه پروژه برای ثبت زمان عکس العمل افراد انجام می دم و می خواستم بدونم امکان داره که یکی از المان ها مثل
    static text یا push button
    را در مان برنانه به طریقی محو و ظاهر کرد؟
  • moj1001
    سلام - ممنون
    منظورت نوشته داخل static text هست؟
    اگه بله كه ميشه
    اگه نه كه بيشتر توضيح بده ميخاي چي رو محو كني.
  • reihaneh  - مشکل در زمینه ی محو و ایجاد یک المان
    ببینید
    من می خواهم به عنوان محرک یک علامت مثلا یک دایره ی قرمز را به کسی که دارد آزمایش را انجام می دهد نشان دهم و بعد از گذشت چند دهم ثانیه یک شماره که می تواند تصادفی باشد یا غیر تصادفی را به فرد نشان دهم و او عدد متناظر را بر روی صفحه کلیدی که در پنره وجود دارد وارد کند و من زمان بین تحریک و پاسخ را ثبت کنم.
    حالا مشکل من نشان دادن محرک و مشکل اصلی ترم نشان دادن اعداد مختلف است. عکس احداد مختلف را گرفته ام ولی به روشی که گفتید نمی توانم مثلا با دستوری مثل imshow این عکس ها را نمایش دهم.
    من این دستور را زده ام و خطا گرفته ام:
    (imshow(handles.axes1,im
    حالا نمی دانم چه طور این اعداد را نمایش دهم و مثلا می توانم به طریقی از یکی از عناصر GUI برای این منظور استفاده کنم یا نه.
    از این که جواب دادید و کمکم می کنید بی نهایت ممنونم.
  • moj1001
    سلام
    دستور imshow رو اشتباه به كار گرفتي!
    يه axes مياري و اندازش رو به قدري ميزاري كه ميخاي عكست به نمايش در بياد. سپس دستور imshow رو بصورت زير فراخواني مي‌كني:
    کد:
    imshow('filename.formatfile')


    به عكس زير نگاه كن:
    http://s1.picofile.com/file/7312199351/Untitled.png
  • reihaneh  - مشکل در زمینه ی محو و ایجاد یک المان
    سلام و بی نهایت ممنون و متشکر به خاطر راهنمایی های بی دریغتون
    چه طور می توان بین چند axes انتخاب کرد که توی کدوم axes رسم کنه؟
  • moj1001
    سلام
    به اين صورت كه اگه مي‌خاي تو axex3 بكشي كد زير رو قبل از دستور imshow قرار بده:
    کد:
    set(gcf,'CurrentAxes',handles.axes3)
  • reihaneh
    با سلام مجدد و تشکر بابت کمک های شما
    من الان برای این که بتوانم بعد از این که دکمه ی run (run push button) فشرده شد، زمان یا ترتیب بین فشردن یک سری از push button ها را به عنوان صفحه کلید قرار داده ام، اندازه گیری کنم مشکل دارم. در تمام برنامه هایی که لطف کرده بودید و برای آموزش قرار داده بودید، اولا تمام متغیرها به صورت محلی و با چک کردن اینکه چه گزینه ای انتخاب شده است یا ... در یکی از callback ها استفاده شده بود در حالی که من به نوعی متغیر global برای سنجش زمان بین فشردن push button ها و ترتیب آن ها احتیاج دارم. مشکل دومم این است که می خواهم بعد از این که برنامه run شد، push button های دیگر زده شوند و محاسبات من در یک برنامه اصلی انجام گیرد ولی اگر برنامه ی محاسبه را در callback مربوط به run بنویسم این تابع فقط در لحظه ی فشردن کلید فعال می شود. نمی دانم می توانم در callback های دیگر این تابع را فراخوانی کنم یا این که می توانم از تابع های دیگر مربوط به run یا push button ها مانند KeyPressFcn استفاده کنم تا بتوانم این مشکل را حل کنم یا راه حل دیگری وجود دارد.
    باز هم به خاطر راهن...
  • moj1001
    سلام
    خوب global استفاده كن با تيك تاك هم زمان رو بگير.
  • ناشناس
    سلام
    با تشکر از مطالب مفیدتون
    اگه خروجی GUI یک سری اعداد باشه آیا امکان دارد این اعداد را در یک فایل EXCEl به ما بدهد؟
    ممنون از وقتی که می گذارید
  • moj1001
    سلام
    بله با دستور xlswrite مي‌شه داده‌ها رو در فايل اكسل ذخيره كرد.
  • ali  - ttt
    mersi agha
    tashakor
    mikhastam bebinam age soali dashte bashim mitonim inja matrah konim va sarian javab begirim?
  • moj1001
    سلام دوست عزیز
    بپرسید اگه بلد باشم پاسختون رو میدم.
  • reza
    با سلام و تشکر از زحمات شما
    من gui رو اجرا میکنم وبا زدن دکمه run برنامه عملی رو انجام نمیده.
    در ضمن mfile که قرار دادید هم پر از error هست.
    آیا ما باید کار دیگری انجام بدهیم.
    ممنون
  • moj1001
    سلام - ممنون
    کاملا توضیح بدی که چه کار کردی تا بهت بگم که مشکلت کجاست(از زمان دانلود برنامه تا زمان اجرای برنامه).
  • ALI
    آموزشGUI عالی بود ازتون ممنونم
نوشتن نظر
Your Contact Details:
نظر:
[b] [i] [u] [url] [quote] [code] [img]   
:D:):(:0:shock::confused:8):lol::x:P:oops::cry:
:evil::twisted::roll::wink::!::?::idea::arrow:
Security
کد آنتی اسپم نمایش داده شده در عکس را وارد کنید.
آخرین بروز رسانی در جمعه, 01 اردیبهشت 1391 ساعت 19:56