برق، الکترونیک، الکتروتکنیک، مکاترونیک، پزشکی، کشاورزی

برق، الکترونیک، الکتروتکنیک، مکاترونیک، پزشکی، کشاورزی و

برق، الکترونیک، الکتروتکنیک، مکاترونیک، پزشکی، کشاورزی

برق، الکترونیک، الکتروتکنیک، مکاترونیک، پزشکی، کشاورزی و

داده هایی در مورد برق، الکترونیک، الکتروتکنیک، مکاترونیک، پزشکی، کشاورزی و

تبلیغات
آخرین نظرات

۲۵ مطلب با موضوع «پروژه» ثبت شده است

اسپیکر، بلندگو، آمپلی فایر

ShahBaz | چهارشنبه, ۱۵ دی ۱۳۹۵، ۰۱:۱۹ ق.ظ

نکته اتصال امپلی به پخش خودرو

اتصال آمپلی فایر به پخش ماشین امکان پذیر است و شما می توانید باندهای قوی تری رو استفاده کنید. نکته‌ای که باید در نظر داشته باشید این است که ظبط ماشین روی امپدانس 4 اهم - وات 40 وات - 5 ولت خروجی می‌دهد. باید امپ توان ورودی ضبط خودرو که 5 ولت است را تحمل کند چون آمپلی فایرهای ضعیف توان تحمل آن را ندارند.

اتصال به بلندگو و امپدانس

نکته مهم این است که امپدانس خروجی یک امپلی فایر باید بلندگو یکی و برابر باشد. یعنی اگر امپلی فایر شما دارای 4 اهم امپدانس باشد به هیچ روی نباید آمپلی را به بلندگویی با امپدانس بالاتر وصل کنید از 

بهره ببرید.. مگر اینکه دو بلندگوی 8 اهمی را موازی یا دو بلندگوی 2 اهم را سری کنیم.
بهترین صدا را از بلندگو و آمپلی فایرهایی دریافت خواهیم کرد که وات بلندگو با وات آمپلی یکی باشد.

http://echista.ir/%D8%A2%D9%85%D9%BE%D9%84%DB%8C-%D9%81%D8%A7%DB%8C%D8%B1/219-%D8%A8%D8%B1%D8%AF-%D8%A7%D8%B3%D8%AA%D8%B1%DB%8C%D9%88-%D9%85%D9%88%D9%86%D9%88.html


کارایی آمپلی فایر 200W استریو

کاربرد آمپلی فایرها به صورت کلی تقویت صدای ورودی است. در واقع شما می توانید به وسیله ی آمپلی فایر و کیت برد آمپلی فایر صدای ورودی از پخش کننده های گوناگون از جمله ( 

) را تقویت کنید. برخی از آمپلی فایرها استریو و برخی دیگر مونو و تک کانال هستند.

همچنین برای راه اندازی سیستم صوتی ماشین نیز از این برد قدرتمند تقویت و ارتقا صوتی می توان بهره برد در صورتی که برق 12 ولت DC خودرو را به برق 24 ولت AC دوبل برای ورودی این آمپلی فایر تبدیل شود. برق ورودی این آمپلی فایر 24 ولت است.

نکته: سیم های ورودی IN و خروجی OUT را حتما از نوع شیلد مرغوب برگزینید. تصویر راهنمایی درباره ی کیت آمپلیفایر مورد نظر:

راه‌اندازی سیستم صوتی ماشین

توجه کنید که برای راه اندازی سیستم صوتی ماشین با این آمپلی‌فایر قدرتمند، شما باید برق 12 ولت DC خودرو را به برق 24 ولت AC دوبل برای ورودی این آمپلی فایر تبدیل کنید. ( با استفاده از مدار الکترونیک و ...)

برد آمپلی فایر 200 وات 24 ولت قیمت فروش خرید

خرید و قیمت برد آمپلی فایر 200 وات

توجه داشته باشید که انواع برد و کیت آماده و موتاژ شده آمپلی فایر با قیمت و توان و قدرت گوناگون در فروشگاه چیستا الکترونیک به صورت تخصصی عرضه می گردد.


usb خور کردن پخش پراید

usb خور کردن پخش پراید

usb خور کردن پخش پراید

سلام و درود خدمت کاربران و بازدیدکننده گان ای ال سی وان

امروز روش یو اس بی usb خور کردن ظبط هایی را که این قابلیت را ندارند (پخش پراید )به اشراک گذاشته ایم

هزینه تقریبی این کار 16000تومان میباشد

وسایل مورد نیاز:

پخش کننده mp3 ( یو اس بی خور)  12ولت

mp3_playere

حال شما نیاز به باز کردن ظبط ماشین دارید

ضبط ماشین را باز کرده و آیسی آمپلی فایر آن را پیدا کنید

سپس دیتاشیت ایسی را دانلود کنید و پایه های ورودی صدا ایسی را پیدا کنید

در بیشتر ظبط ها از ایسی lv47002 استفاده میشود

در مرحله بعدی شما باید خروجی های پخش کننده mp3 را به ورودی های ایسی وصل کنید

و تغذیه پخش کننده mp3 پ را هم از تغذیه ظبط بگیرید (روی قاب ظبط پین های برق 12 ولت را مشخص کرده که دو تا هستند  یکی از ان ها acc میباشد که با روشن شدن ظبط آن هم برق دار میشود )

اگر در صدا نویز مشاهده کردید یک خازن 470میکروفاراد 16 ولت با ولتاژ12ولت موازی کنید


بسمی تعالی
با سلام خدمت همه شما خوبان خوب ،امیدوارم روزهای خوبی داشته باشید و مثل ما کاسبیتون کساد نباشه،منو ببخشید ،که مطالبی که مطالب مفید سایت کمتر شده ،چون کمی کسالت افتاده به جونمون که انشالله همین روزها ،یا جونمون رو در میاره یا ما اون رو در میاریم .در کل امیدوارم مطالبمون بدرد بخور بشه و براتون مفید باشه.
مدتی هست که فلش خور کردن پخش های ماشین و رادیو و ضبط ها مد شده ،البته این داستان حداقل متعلق به دو سال قبل می شه ،
ولی امروز به درخواست یکی از دوستان عزیز سایت ما این مطلب رو به سایت اضافه می کنیم ،شاید که قبول اوفتد.
آقا این نکته رو اول از همه کارها بهتون بگم که با باز کردن پخش ماشین و جدا کردنش از باطری و دوباره وصل کردنش به منبع از شما پسورد راه انداز پخش رو می خواد ،پس مواظب باشین و تا پسورد پخش رو نمی دونید ،پخش رو غیر فعال نکنید(از باطری ماشین جدا نکنید) .
بحث فلش خور کردن پخش های ماشین رو می شه به دو بحث تقسیم کرد ، اولی فلش خور کردن پخش ماشین بدون برد مخصوص usb و دومی فلش خور کردن پخش ماشین و کلا هر چیزی به کمک همین بردهای usb
خوب در ابتدا مبحث اول رو به صورت سطحی و به کمک آقای حسین از کرج کاربر خوب انجمن تعمیرکاران، پیش می گیریم:
فلش خور کردن پخش های ماشین اون هم بدون برد های usb موجود در بازار ،یک بحث بزرگ و دقیق هست که می شه گفت بیشتر مربوط به آی سی سروو موتور می شه و بعد آیسی های برد اصلی (در واقع همون آیسی برد سی دی پلیر) .
%d8%b9%d8%b3%d8%b0

%d8%b9%d8%b3%d8%b01
پس در واقع فقط پخش هایی که سی دی خور هستند رو می شه بدون برد خاصی usb خور کرد،اما حالا چه وسایلی برای این کار نیاز هست.
مواد لازم:
دوعدخازن100/10 ولت و 220 / 16 ولت که بهتر smd هم باشن
یک عدد آی سی یا رگولاتور 7805
یک عددکابل افزایش طول USB

کابل را ازوسط میبریم و قرار هست ما با سمتیکه فلش بهش وصل بشه کار کنیم و سرسیم های سمت دیگه رو کمی لخت میکنیم
DMسیم سفید رنگ(اگرکابل اصلی باشه)به مقاومت R767که مقدارش 15 کیلو،لحیم میکنیم(مقاومت SMDروی بردسرووموتور)
DPسیم سبزرنگ به مقاومت R755 که مقدارش 15 کیلو هست ،وصل میکنیم. (مقاومت SMDروی بردسرووموتور)
نکته :سیم ها رو به سمت داخل مقاومت ها وص کنید (یعنی به سمت وست برد و نزدیک آیسی اصلی )
سیم مشکی را روی بردسروو به GNDلحیم میکنیم.
سیم قرمز که 5ولت فلش راتامین می کنه ،روی کفی که ایسی 7805 هست خودمان لحیم کردیم وصل میکنم البته جای این ایسی روی مین خالی است فقط بایدایسی لحیم شود.
خوب بعد از لحیم ایسی باید خازن 100/10 رابخروجی 5 ولت وصل کنیم شماره لوکیشن خازنC712روی مینه ک جاش خالیه وخازن220/16 را به ورودی ایسی7805,وصل میکنیم شماره لوکیشن خازنC708روی مینه وجاش خالیه همه روی عکسها مشخص کردم.
در اتمام کار و رعایت عدم اتصالی نداشت قطعات و سیم ها می ریم که فلش را متصل کنید،می بینیم که ،سریع usb لود میشه وعلامت USBروی مانیتور دیده میشه
منتها بر روی این مدلها SORدوحالته که رادیو و CDرو شامل می شه ، که بررویCDفلش رااجرامیکنه وتداخلی درکارCDصورت نمیگیره…..
imag0046

imag0047

imag0048

imag0050

imag0051

imag0052

imag0053
این هم عکس محل قرار دادن سوکت usb روی خود بخش و به جای دکمه bsm .
12345678
یک نکته ظریف دیگه هم هست که در بعضی مدل پخش ها سی دی خور رعایت نشده و مدار سویچ روی usb نصب نشده ،که از یک مقاومت و یک ترانزیستور تشکیل میشه:

ترانزیستور به شماره لوکیشن Q202 از نوع منفی هست ،که می تونید از مشابه BC847 استفاده کنید .
مقاومت به شماره لوکیشن R208 .
با قرار دادن این مقاومت و ترانزیستور و بقیه کارهایی بالا به هدفتون که فلش خور کردن پخش ها بدون برد usb برسید .
این هم عکس محل نصب ترانزیستور و مقاومت:
123

1234
این هم یک برد دیگه:
12345

123456
خوب بریم سراغ روش دوم که ،ریسک و دردسرش هم بسیار کمتر هست و روی هر وسیله ای که صدا از توش در میاد میشه اعمالش کرد ،از انواع اسپیکر بگیر تا انواع پخش و رادیو و ضبط .(بهتون توصیه هم می کنم از همین روش استفاده کنید و از همین بردهای usb استفاده کنید. حالا مدل هاش با هم فرق می کنه ولی همشون یک آشغال هستند:
dsc02013
بریم اول اتصالات این برد ها رو بررسی کنیم ،بعد بریم سراغ نصبش:
طبق معمول هر برد الکترونیکی نیاز به تغذیه یا منبع ولتاژ داره که ،در حال حاضر این برد ها در مدل های 5 ولت و 12 ولت فقط پیدا می شن و برای اینکه بفهمیم تغدیه برد 5 هست یا 12 هم می تونیم به نوشته های زیر برد که نزدیک سوکت تغذیه هست دقت کنیم و هم به رگولاتوری 7805که برای تبدیل ولتاژ12 به 5 و حداکثر آمپر 1.5 هست توجه کنیم.
photo_2016-12-05_08-40-26

dsc02015-copy
خوب بزارید بریم سر اصل ،شما باید صدایی تولیدی از این برد رو یک جوری به دستگاه تون وارد کنید تا بتونید صدا رو روی بلند گوها داشته باشید .
اول بحث رو روی اسپیکر ها یا رادیو ضبط ها بررسی می کنیم و بعد می ریم سراغ پخش ماشین ها .
dsc02017

dsc02018
برای رادیو ها با توجه به اینکه چه ابزاری دارن (مثل کاست ، سی دی پلیر یا فقط رادیو )به راحتی می تونید گزینه مورد نظرتون رو برای جایگزین کردنش با برد usb انتخاب کنید .
بله شما باید بیخیال یکی از این ابزار ها بشین تا هم نویز کمتری داشته باشین و هم گیج شدن کمتر برای کاربر استفاده کننده.
خوب شما به هر حال باید ولتاژ تغذیه بردتون رو که 5 تا 12 dc هست رو از هر جای برد رادیو ضبط تونستین تهیه کنید،جای مشخصی نمی تونم بهتون پیشنهاد کنم ولی عموما این ولتاژ برای موتور کاست همیشه هست ،و می شه با کلید پلی کاست هم فعالش کرد و تنها با قطع کردن سیم های موتور کاست و وصل کردنش به برد usb به راحتی ولتاژ برد رو تامین کرد .
پس اگر کاست رو دوست نداشتید از ولتاژ موتور کاست که با دکمه play کاست فعال می شه استفاده کنید تا به راحتی حتی برد usb تون رو خاموش و روشن کنید و البته مهم تر از همه صدا و همه چی بشه کاست و رادیو و سی هم غیر فعال می شه و بعد از اون دیگر اتصالات کاست رو هم که مربوط به صداش می شه رو هم قطع کنید تا صداو نویزی هم نداشته باشید ، حالا برید و خروجی چپ و راست صدای برد usb رو به ورودی کلید ولوم رادیو وصل کنید ،البته شما می تونید به محل اتصال خروجی کاست به برد اصلی هم این اتصال رو برقرار کنید ،ولی ما ترجیح می دیم که به ورودی ولوم وصل کنیم تا راحت تر هم باشیم .
ببخشید که خیلی تصویر نمی تونم بزارم ،چون هر مدلی یک شکل هست ،در کل شما باید ولتاژ تغذیه برد usb رو با رفتن به یکی از ابزار های پخش صدا فعال وخود اون ابزار رو غیر فعال و صدا ی خروجی برد usb رو به جای اون ابزار انتخاب شده به بلندگوها برسونید ،که ما کارمون رو راحت کردیم و یکسره به قبل از ولوم زدیم.
اما بریم سراغ پخش ماشین ها که دنیایی ست مشابه :
پخش ماشین ها دیگه حالت هاش کمتر می شه ،یا کاست خور هست یا سی دی خور و البته همشون رادیو رو دارن ،که همون مدار تیونر یا rf هست .
اما روش های کار بسیار متفاوت است .بزارید اولین و پرکاربردترین روش رو براتون بگم.
photo0006
شما باید از روی مدار های رادیو (تیونر)با اهمتر برقهای 8 ولت را پیدا کنی ،سپس قلع های روی مدار برق 8 ولت را برداری تا برق رادیو کلا قطع بشه سپس پخش را روشن میکنی سیم های بلندگو را به پخش وصل میکنی بعد با انگشت نم ناک روی پایه های قسمت تیونر رادیو میزنی (این پایه ها همون پایه های زیر برد قسمت تیونر می باشه که تو عکس بالا مشخص کردم.)تا وقتی که پایه های مربوط به صدای رادیو را پیدا کنی و صدای خش خش از توی بلندگو پخش بشه بعد از مشخص شدن پایه ای مربوط به صدای رادیو مدار های صدا را قطع میکنی، حالا که پایه های مربوط به صدا و برق را پیدا کردی برق 8 ولت را به مثبت کیت و برق منفی را به بدنه ی پخش وصل میکنی حالا سیم های صدا را به روی برد جایی که مدار های صدا را قطع کردی وصل میکنی تا اینجا کار تمام است. حالا برای اینکه رادیو خود پخش هم کار بکند دوباره برق رادیو که قلع هایش را برداشتی، لحیم میکنی تا برق رادیو وصل بشه .حالا مدار های مربوط به صدای رادیو که قبلا قطع کردی به aux کیت وصل میکنی تا بشه از رادیو خود پخش هم استفاده کنی ( زمانی که دکمه ی mode کیت را بزنی و در حالت line قرار بدی صدای رادیو خود پخش هم شنیده میشه ) گیج نشید خروجی خود تیونر رادیو رو به aux برد usb خودنون وصل کنید .(مثل اینکه یک جک تو ورودی aux برد usb زده باشین)
296b2d4cc91f339bdba93fba671bd309
اما این روش بالا زمانی کارایی داره که شما برد تیونر رو مثل تصویر که مشخص کردیم داشته باشیم ، (البته برای راحتی کار وگرنه بازم میشه یک کارایی کرد ).
اما شما می تونید به صورت کامل این برد تیونر رو هم از برد جدا کنید و پایه های 16 و 18رو به عنوان ورودی صدا از برد usb استفاده کنید و برق مورد نظرتون رو هم از سایر پایه ها تهیه کنید(این پایه های 16 و 18 عموما ثابت هست و طبق تجربه خودم می گم و البته عموما روی برد هم کار هر پایه تیونر نوشته شده )اما ،حالا فرض کنید شما این برد رو ندارید و یا برد تیونر با برد داخل خود پخش ترکیب شده ،حالا چه می کنیم :
پس الان ذهنیت براتون ایجاد شد که باید از خیر یکی از ابزار بگذرید تا خروجی شما خوب از کار دربیاد ،
طبیعتا در پخش های کاست خور می شه از خیر کاست گذشت و در پخش های سی دی خور از خیر مدار rf یا سی دی ،آخه واقعا ارزش cd player اونقدر زیاد هست که خرابش نکنیم .
پس اینجا باید ولتاژ راه انداز کاست رو پیدا کنید(از روی سوکت هایی که به کاست وارد می شن) و خروجی صدای مربوط به کاست رو هم با همین روش ضربه زدن روی پایه های سوکتش تشخیص بدین ،هر مدل یک شکل اتصالات خاص خودش رو داره در نتیجه از کاست برق و اتصالات صدا رو قطع و به برد usb همه این اتصالات رو وصل می کنید .
دوستان من عموما برد فلش ساز یا برد usb یا mp3car یا به هر اسم دیگه ای که می شناسید رو، روی کاست یا خود پخش سوار نمی کنم ،چون از خراب کردن ظاهر پخش اصلا خوشم نمی یاد (چون اصلا ظاهرش خوب در نمی یاد).
پس من طول سیم ها رو بزرگتر در نظر می گیریم و با یک دریل پشت پخش یا قسمت آلومنیومی رو سوراخ می کنم و سیم ها رو از اونجا خراج و برد usb رو تو جاسیگاری یا جاهای دیگه قرار می دم ،یا هم از usb car های باکس دار استفاده می کنم.
این هم مدرک یکی از کارهای نسبتا تمیزی که خودم انجام دادم.
photo_2016-12-05_12-08-53
دوستان دعا و صلوات یادتون نره ،تو رو جان هر کی دوست دارید ما رو دعا کنید ،بد محتاج دعاییم.


  • ShahBaz

اموزش gtk

ShahBaz | يكشنبه, ۱۴ شهریور ۱۳۹۵، ۱۲:۳۰ ب.ظ
اموزش برنامه نویسی با gtk

کار رو با یک مثال ساده شروع می کنم در این مثال مطالبی مطرح میشه که در بیشتر برنامه ها یی که بعدا می نویسیم استفاده می شه
مثال اول
کد پی‌اچ‌پی:
#include <gtk/gtk.h>
int main(int argc char *argv[] ) {
GtkWidget  *window ;
gtk_init( &argc , &argv);
window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_widget_show(window);
gtk_main();
Return 
0;



خط اول : همه برنامه هایی که از gtk استفاده می کنند شامل این خط می شوند که این سرفایل شامل تعریف متغییر ها توابع و ساختار ها و غیره می شه و باید در برنامه های خود انرا بگنجانیم .
خط چهارم : در این خط ما تابع gtk_init را فراخوانی کردیم که این خط هم در تمام برنامه ها استفاده می شه و برخی چیزها رو برای ما تنظیم می کنه مثل مقدار پایه و رنگ که نتیجه فراخوانی این تابع است و بطور کلی این کتابخانه رو بصورت خودکار برای ما مقداردهی اولیه می کنه.
خط پنجم و ششم : در این خطوط ما یک پنجره برای برنامه خود ایجاد کردیم که درصورتی که ما سایز انرا مشخص نکنیم بصورت پیش فرض 200 در 200 در نظر گرفته می شود زیاد نگران نحوه ایجادش و کدهاش نباشید به زودی همه انها را خواهید اموخت.
خط ششم : می گوید که ما widget خود را تنظیم کردیم و ویژگی های لازم را تنظیم کردیم و حال می خواهیم که انرا برای ما نشان دهد (widget یک شی هست مثلا یک دکمه یا یک تکست باکس)
خط هفتم : تابع gtk_main را فراخوانی می کنیم که ان نیز در تمام برنامه هایی که از gtk استفاده می کنیم باید در کد های ما قرار داشته باشه . وقتی برنامه به این نقطه می رسد gtk به حالت خواب میره و منتظر رویداد x می شه ( مثل کلیک موس یا فشار یک دکمه ) در واقع یک حلقه رو ایجاد می کنه که مدام اجرا میشه تا اینکه یک رویداد اتفاق بیفته و در برابر ان عکس العمل انجام بده .
انچه که از این مثال فهمیدیم
قالب کلی یک برنامه که از gtk استفاده می کند در اکثر موارد به شکل زیر می باشد

کد پی‌اچ‌پی:
#include <gtk/gtk.h>
int main(int argcchar &argv[]){
gtk_init(&argc,&argv);
 
gtk_main();
return 
0;


برای کامپایل برنامه در لینوکس می تونید از دستور زیر استفاده کنید
g++ `pkg-config --cflags --libs gtk+-2.0` -o name.cpp nameout
که بجای name.cpp مسیر جایی رو که در انجا برنامه رو ذخیره کردید می دید و nameout هم نامی هست که می خواهید برنامه کامپایل شده داشته باشه.
اگه تو ویندوز کد می نویسید می تونید دستوراتی که تو مقاله ای که تو سایت نوشتم بخونید
مقاله نحوه نصب gtk در ویندوز و پیکربندی ان برای کامپایل برنامه ها با ویژوال سی پلاس پلاس

اگه همه کار ها رو درست انجام داده باشید باید زمانی که برنامه خود را اجرا می کنید مثل شکل پایین باشه

[عکس: 11.png]

منبع

مثال دوم
در مثال قبل شما ساختار کلی یک برنامه رو که از gtk استفاده می کرد دیدید در این مثال من می خوام نحوه ایجاد یک widget رو به شما اموزش بدم
Widget چیه گفتم که منظور از widget یک شی هست و gtk در واقع کتابخانه ای که شامل یک سری widget ها مثل label یا button و ... هست که ما از اونها استفاده می کنیم برای ایجاد یک رابط گرافیکی و اما مثال
کد پی‌اچ‌پی:
#include <gtk/gtk.h>
int main(int argc char *argv[]){
gtk_init(&argc,&argv);
GtkWidget  *window;
GtkWidget  *button;
window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
button=gtk_button_new();
gtk_container_add(GTK_CONTAINER(window),button);
gtk_widget_show(window);
gtk_widget_show(button);
gtk_main();
return 
0;


با اجرای این برنامه شما یک پنجره و دکمه که در اون وجود داره رو می بینید

حال توضیح کد بالا : برخی از قسمت ها باید برای شما اشنا باشه چون اونها رو در مثال اول هم بکار بردیم و گفتیم که توابعی مثل gtk_init و gtk_main توابعی هستن که در تمام برنامه ها باید وجود داشته باشند حال توضیح قسمت های دیگر کد
ما برای ایجاد هر یکwidget ( در مثال بالا یک دکمه ) سه خط کد باید به برنامه خود اضافه کنیم ان سه خط اینها هستن
کد پی‌اچ‌پی:
GtkWidget name ;
name=gtk_namebase_new();
gtk_widget_show(name); 

این سه خط رو ما در اکثر موارد برای ایجاد widget دلخواه خود به کد هامون اضافه می کنیم
در خط اول ما یک اشاره گر از نوع gtk تعریف می کنیم که name در واقع نام اون اشاره گر هست در خط دوم ما برای اشاره گر خود تخصیص حافظه می کنیم و با استفاده از تابعی که در بالا اشاره شد اون widget که می خواهیم می سازیم در خط بعدش هم می گیم اون widget که ساختیم به ما نشون بده همین!! در کد بالا namebase اون نوع widget هست که می خواهیم بسازیم البته در مورد تابع gtk_namebase_new() باید گفت که این تابع یک الگوی عام هست و برای برخی widget ها کمی شکلش فرق می کنه که برای اطلاعات بیشتر می تونید به راهنمای کتابخانه مراجعه کنید یا اینکه صبر کنید تا من در پست های بعدی بگم خوب برای دست گرمی ما برای ایجاد یک label از کدهای زیر استفاده می کنیم
کد پی‌اچ‌پی:
GtkWidget Label1 ;
Label1=gtk_label_new();
gtk_widget_show(Label1); 

بر طبق مطالبی که در بالا ذکر کردم ما در مثال دوم 2 widget ساختیم یکی پنجره و یک دکمه که کدهاشون این بود
کد پی‌اچ‌پی:
GtkWidget  *button;
button=gtk_button_new();
gtk_widget_show(button); 

اگه بخوایم بر روی دکمه ای که ایجاد می کنیم مطلبی نوشته باشد می تونیم از تابع gtk_button_new_with_label(“string”) استفاده کنیم که بر این اساس کد های بالا بدین شکل میشه
کد پی‌اچ‌پی:
GtkWidget  *button;
button=gtk_button_new_with_label(“Welcome”);
gtk_widget_show(button); 


که یک دکمه ایجاد میکنه که روی ان عبارت Welcome نوشته شده . نگران این توابع نباشید من تک تک این widget ها رو با ویژگی ها و توابع انها بیان خواهم کرد من فقط می خوام شما شکل کلی کدها رو یاد بگیرید اینطوری کار راحت تر میشه .
خوب widget دیگر ما یک پنجره بود
کد پی‌اچ‌پی:
GtkWidget  *window;
window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_widget_show(window); 

که کد های بالا برای ایجاد اون بود در مورد پارامتر تابع gtk_window_new() باید بگم که تنها دو مقدار براش وجود داره عبارت GTK_WINDOW_TOPLEVEL برای ایجاد یک پنجره ساده و عبارت GTK_WINDOW_POPUP برای ایجاد یک پنجره پاپاپ .
خوب از توابع دیگه ای که برای تنظیم پنجره بکار میره می شه به توابع زیر اشاره کرد
کد پی‌اچ‌پی:
gtk_window_set_title(GTK_WINDOW(name),”string”  ); 

که برای تنظیم عنوان پنجره استفاده می شه و name نام اشاره گری هست که به پنجره اشاره می کنه و string هم عنوان پنجره میشه مثلا برای مثال دو میشه این

کد پی‌اچ‌پی:
gtk_window_set_title(GTK_WINDOW(window),”Welcome  ”); 

و با استفاده از تابع زیر هم می تونید خاصیت resize پنجره رو فعال یا غیر فعال کنید
کد پی‌اچ‌پی:
gtk_window_set_resizable(GTK_WINDOW(name),Boolean)  ; 

که مثلا اگه بخوایم در پنجره مثال دوم ما خاصیت resize غیر فعال بشه کد ما میشه این
کد پی‌اچ‌پی:
gtk_window_set_resizable(GTK_WINDOW(window),FALSE)  ; 

برای تعیین اندازه پنجره هم می تونید از تابع زیر استفاده کنید
کد پی‌اچ‌پی:
gtk_widget_set_size_request(GTK_WIDGET(name),width  ,hight); 

خوب برگردیم به مثال دوم در اونجا یه خط کد هست که هنوز توضیح ندادم
کد پی‌اچ‌پی:
gtk_container_add(GTK_CONTAINER(window),button); 

خوب با استفاده از این تابع به gtk می گیم که دکمه ما رو در درون پنجره قرار بده . این تابع تنها می تونه یک widget رو در پنجره قرار بده و اگه شما دوتا دکمه داشته باشید این تابع دیگه جواب گو نیست و باید از روشی به نام بسته بندی کردن widget استفاده کنیم که در پست بعدی به بیان اون می پردازم .

منبع

وقتی که ما یک برنامه کاربردی ایجاد می کنیم عمدتا بیش از یک widget رو در پنجره خود قرار می دیم .ما در مثال دوم یک دکمه رو در پنجره خود قرار دادیم که این کار رو با استفاده از تابع gtk_container_add() انجام دادیم که کار این تابع این هست که یک widget رو برای ما در پنجره قرار بده ولی حال اگه بخوایم بیش از یک widget رو در پنجره قرار بدیم باید چکار کنیم ؟ برای این کار ما از روش بسته بندی widget ها استفاده می کنیم . بسته بندی widget ها رو به دو طریق میشه انجام داد استفاده از جدول یا استفاده از جعبه .
که در این پست روش بسته بندی با استفاده از جدول رو اموزش می دم و روش بسته بندی با استفاده از جعبه ها رو در پست اینده اموزش می دم .
بسته بندی با استفاده از جدول ها
برای استفاده از این روش ابتدا ما یک جدول ایجاد می کنیم بعد هر یک از widget ها رو در خانه های اون قرار می دیم . برای رسم یک جدول از تابع زیر استفاده می کنیم
کد پی‌اچ‌پی:
gtk_table_new(rows columns Boolean); 


که پارامتر اول تعداد سطر های جدول پارامتر دوم تعداد ستون های جدول و پارامتر سوم اگر TRUE باشه جدول خاصیت resize پیدا می کنه و اندازه خونه های جدول برابر با اندازه بزرگترین widget می شه و اگر FALSE باشه دیگه این امکان وجود نخواهد داشت .
نکته ای که اینجا وجود داره نحوه شماره گذاری سطر ها و ستون ها در جدول هست که از صفر شروع می شه مثلا برای یک جدول 2 در 2 شماره سطر و ستون ها بدین شکل خواهد بود
[عکس: 22.bmp]
خوب هون طور که گفته بودم برای ایجاد هر widget به سه خط کد احتیاج داریم الان برای ایجاد یک جدول کدها مون می شه این
کد پی‌اچ‌پی:
GtkWidget  *table1;
table1=gtk_table_new(,,FALSE) ;
gtk_widget_show(table1); 
خوب حالا برای اینکه widget های خودمون رو در خانه های جدول قرار بدیم از تابع زیر استفاده می کنیم
کد پی‌اچ‌پی:
gtk_table_attach_defaults(GTK_TABLE(name) , widget name left_attach right_attach top_attach bottom_attach ) ; 
که به جای name نام جدول به جای widget name هم نام اون widget که می خوام در جدول قرار بدیم و پارامتر های دیگه اون هم مشخصات اون سلولی از جدول هست که می خوایم widgt رو توش قرار بدیم
استفاده از جدول برای قرار دادن widget ها کمی مشکل هست نه از جهت کد بلکه تنظیم مکان قرار گرفتن widget ها در خانه های ان به همین علت من زیاد به اون نمی پردازم فکر کنم در همین حد هم کافی باشه این هم یک مثال از کاربرد اون
کد پی‌اچ‌پی:
#include <gtk/gtk.h>
int main(int argc char *argv[]){
gtk_init(&argc,&argv);
GtkWidget *window ;
GtkWidget *table ;
GtkWidget *button1;
GtkWidget *button2;
windowgtk_window_new(GTK_WINDOW_TOPLEVEL);
table=gtk_table_new(1,2,FALSE);
gtk_container_add(GTK_CONTAINER(window),table);
button1=gtk_button_new_with_label(“BUTTON 1”);
button2=gtk_button_new_with_label(“BUTTON 2”);
gtk_table_attach_defaults(GTK_TABLE(table),button1  ,0,1,0,1);
  
gtk_table_attach_defaults(GTK_TABLE(table),button2  ,1,2,0,1);
 
gtk_widget_show(window);
gtk_widget_show(table);
gtk_widget_show(button1);
gtk_widget_show(button2);
gtk_main();
return 
0;


توجه کنید که شما اول باید با استفاده از تابع gtk_container_add جدول را در پنجره قرار دهید سپس هر یک از دکمه ها را در جدول
در ضمن بجای این چهار خط کد
کد پی‌اچ‌پی:
gtk_widget_show(window);
gtk_widget_show(table);
gtk_widget_show(button1);
gtk_widget_show(button2); 
می تونید از تابع زیر استفاده کنید که همون کار رو انجام میده
کد پی‌اچ‌پی:
gtk_widget_show_all(window);

روش دوم بسته بندی widget ها با استفاده از جعبه ها :
این روش پرکاربردترین روش بسته بندی هست که به دو شکل افقی یا عمودی صورت می گیره که برای قرار دادن اونها از چپ به راست یا برعکسش از جعبه افقی که با تابع gtk_hbox_new() ایجاد میشه و برای قرار دادن اونها در پنجره از بالا به پایین یا برعکسش از جعبه عمودی که با تابع gtk_vbox_new() ایجاد میشه انجام میشه . و برای قرار دادن widget ها در جعبه ها هم از توابع gtk_box_pack_start() برای قرار دادن widget ها از چپ به راست در جعبه افقی و از بالا به پایین در جعبه عمودی یا gtk_box_pack_end() برای قرار دادن widget ها از راست به چپ در جعبه افقی و از پایین به بالا در جعبه عمودی استفاده می کنیم . کار با جعبه ها کمی پیچیده هست و اپشن های فراوانی داره که من سعی می کنم تا اونجایی که خودم فهمیدم و بلدم اینجا بنویسم .
خوب برای ایجاد جعبه افقی از تابع زیر استفاده می کنیم

کد پی‌اچ‌پی:
gtk_hbox_new(Boolean int) ; 


که ارگومان اول بررسی می کنه که ایا سایز هر شی که در اون قرار می گیره یکسان باشه یا نه منظور از سایز در جعبه افقی پهنای هر widget می باشد و ارگومان بعدی میزان فاصله بین دو شی هست که در اون قرار می گیره .
همون طور که گفتم برای ایجاد هر شی نیاز به سه خط کد هست پس شکل کامل کدش میشه این
کد پی‌اچ‌پی:
GtkWidget *hbox ;
hbox=gtk_hbox_new(TRUE 5);
gtk_widget_show(hbox); 

خوب برای ایجاد یک جعبه عمودی هم از تابع زیر استفاده می کنیم
کد پی‌اچ‌پی:
gtk_vbox_new(Boolean int ); 
که ارگومان اول بررسی می کنه که ایا whdget هایی که در اون قرار می گیرند ارتفاع یکسانی داشته باشند یا خیر و ارگومان بعدی هم فاصله بین دو widget رو تنظیم می کنه .

خوب به توابعی می پردازیم که برای قرار دادن اشیا در جعبه ها استفاده می شن من فقط تابع gtk_box_pach_start رو می گم چون رایج تر هست خوب این تابع هم بشکل زیر هست
کد پی‌اچ‌پی:
gtk_box_pack_start (GTK_BOX(name) , widget name Boolean expand Boolean fill int padding ) ; 


ارگومان اول نام جعبه ما ارگومان دوم نام عنصری که می خوایم تو جعبه بزاریم ارگومان سوم می گه که ایا اون عناصر تمام فضای اضافی جعبه رو پر کنن یا نه فضای خالی وجود داشته باشه ( توضیحات بیشتر در مثال ها ) ارگومان چهارم می گه که فضای اضافی به سایز اشیا اختصاص داده بشه (TRUE ) یا به جعبه اختصاص داده شه و در اطراف هر شی پراکنده شود ( FALSE ) این گزینه زمانی کار می کنه که ارگومان سوم به TRUE ست بشه و ارگومان اخر هم یه مقدار فضای خالی در اطراف هر شی ایجاد می کنه . اوه تموم شد!!!!
اگه چیزی نفهمیدید نگران نباشید با شکل و مثال متوجه می شید
[عکس: packbox1.png]
در شکل بالا در نیمه اول ما جعبه های افقی رو ایجاد کردیم با این خصوصیات اول اینکه اشیا دارای سایز یکسان نباشند و دیگه اینکه بینشون فاصله نباشه . gtk_hbox_new(FALSE , 0 )
خوب حالا به کدی که برای قرار دادن هر شی در اون جعبه در ردیف اول استفاده کردیم توجه کنید
کد پی‌اچ‌پی:
gtk_box_pack_start (GTK_BOX(hbox) , buttonFALSEFALSE0) ; 

خوب در این کد ما ارگومان سوم رو False کردیم یعنی گفتیم که فضای اضافی به جعبه اختصاص داده بشه و ارگومان چهارم روهم False کردیم و گفتیم که این فضای خالی باقی مانده برای جعبه باشه .
در ردیف پایین ترش ما از کد زیر استفاده کردیم
کد پی‌اچ‌پی:
gtk_box_pack_start (GTK_BOX(hbox) , buttonTRUEFALSE0) ; 

در این کد ما ارگومان سوم را به TRUE ست کردیم یعنی گفتیم که فضای خالی باقیمانده به اشیا اختصاص داده بشه بدین شکل که فضای خالی باقی مانده جعبه بر تعداد اشیا تقسیم می شه و هر شی در وسط سهم خودش قرار می گیره مشاهده می کنید که در اطراف هر شی یک فضای خالی ایجاد شده .
کد ردیف پایین ترش بدین شکل هست
gtk_box_pack_start (GTK_BOX(hbox) , button, TRUE, TRUE, 0
کد پی‌اچ‌پی:
) ; 

ما ارگومان چهارم رو به TRUE ست کردیم این یعنی چی یعنی اینکه بر طبق ارگومان سوم فضای خالی به شی تخصیص داده شده حالا بر طبق ارگومان چهارم این فضایی که به هر شی تخصیص داده شده جزیی از سایز اون شی بشه که در شکل مشاهده می کنید که دیگه فضای خالی وجود نداره و اندازه اشیا بزرگ تر شده .

خوب در ادامه ما اومدیم یک جعبه ایجاد کردیم با خصوصیات زیر که اشیا سایز یکسانی داشته باشن و بینشون فاصله نباشه . gtk_hbox_new(TRUE , 0)
خوب در ردیف اول برای قرار دادن اشیا در اون کد زیر رو بکار بستیم

کد پی‌اچ‌پی:
gtk_box_pack_start (GTK_BOX(hbox) , buttonTRUEFALSE0) ; 


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

کد پی‌اچ‌پی:
gtk_box_pack_start (GTK_BOX(hbox) , buttonTRUETRUE0) ; 


یعنی اینکه فضای خالی به اشیا اختصاص داده بشه و فضای اختصاص داده شده جزیی از اندازه اون شی بشه در اینجا چون ارگومان اول جعبه ما به TRUE ست شده این فضا طوری بین اشیا توزیع می شه که همه دارای سایز یکسانی شن .
خوب دیگه فکر کنم در مورد این روش بسته بندی دیگه توضیح کافی باشه . امیدوارم مطلب رو فهمیده باشید !!!

منبع

اموزش gtk قسمت پنجم :
دیدم برای بسته بندی با جعبه مثال نزدم اینم مثال
مثال :
کد پی‌اچ‌پی:
#include <gtk/gtk.h>
int main(int argc char *argv[]){
gtk_init(&argc,&argv);
GtkWidget *window ;
GtkWidget *hbox ;
GtkWidget *button1;
GtkWidget *button2;
windowgtk_window_new(GTK_WINDOW_TOPLEVEL);
hbox=gtk_hbox_new(TRUE 0);
gtk_container_add(GTK_CONTAINER(window),hbox);
button1=gtk_button_new_with_label(“BUTTON 1”);
button2=gtk_button_new_with_label(“BUTTON 2”);
gtk_box_pack_start (GTK_BOX(hbox) , button1TRUETRUE0) ;
gtk_box_pack_start (GTK_BOX(hbox) , button2TRUETRUE0) ;
 
gtk_widget_show(window);
gtk_widget_show(hbox);
gtk_widget_show(button1);
gtk_widget_show(button2);
gtk_main();
return 
0;



حالا برای اینکه نکته ای رو هم گفته باشم این رو از من داشته باشید برای مخفی کردن یک widget در پنجره می تونید به جای استفاده از تابع gtk_widget_show(widget) از تابع gtk_widget_hide(widgt) استفاده کنید .
نکته ای دیگه اینکه وقتی شما دارید راهنمای gtk رو می خونید با انواعی رو به رو می شید مثل gint یا gchar اینها چی هستن اینها همان انواع معروف int یا char هستن که برای افزایش قابلیت حمل پذیری برنامه ها و برای اینکه بر روی انواع توزیع ها با معماری های مختلف قابل اجرا باشند بدین شکل دوباره تعریف شده اند و مال کتابخانه glib هستن که اون کتابخانه رو هم چون زیر مجموعه این gtk هستن در اینده ای نزدیک معرفی می کنم .

منبع
[عکس: www.Mojsazan.com.gif]

رویداد ها
مثال
کد پی‌اچ‌پی:
#include <gtk/gtk.h>
void hello(GtkWidget *widget gpointer data ){
g_print("WELLCOME TO MY PROGRAM");
}
 
int main(int argc char *argv[]){
gtk_init(&argc,&argv);
GtkWidget *window ;
GtkWidget *hbox ;
GtkWidget *button1;
GtkWidget *button2;
windowgtk_window_new(GTK_WINDOW_TOPLEVEL);
hbox=gtk_hbox_new(TRUE 0);
gtk_container_add(GTK_CONTAINER(window),hbox);
button1=gtk_button_new_with_label("BUTTON 1");
button2=gtk_button_new_with_label("BUTTON 2");
gtk_box_pack_start (GTK_BOX(hbox) , button1TRUETRUE0) ;
gtk_box_pack_start (GTK_BOX(hbox) , button2TRUETRUE0) ;
g_signal_connectG_OBJECT(button1) , "clicked" G_CALLBACK(hello),NULL) ;
g_signal_connect_swapped(G_OBJECT(button1),"clicke  d"  ,G_CALLBACK(gtk_widget_show) , G_OBJECT(button2));
gtk_widget_show(window);
gtk_widget_show(hbox);
gtk_widget_show(button1);
 
gtk_main();
return 
0;


قبل از بررسی مثال یه سری مطالب هست که باید گفته شه .
سیگنال و callback
هر دکمه ای که فشار داده میشه هر کلیک و امثال این رویداد ها یک سیگنال ایجاد میشه و تابع ای که به این سیگنال جواب میده یا به عبارتی مخاطب این سیگنال هست می گن callback این توضیح عامیانه و سادش هست .
برای اینکه برای یک widget تولید سیگنال کنیم توابع زیادی وجود داره که پرکاربرد ترین و عام ترین تابع برای این کار تابع زیر می باشد


اول دکمه 1 رو فشار بدید متنی در کنسول چاپ میشه دکمه دو رو فشار بدید از این لحظه به بعد هر چی دکمه یک رو فشار بدید دیگه کار نمی کنه .
کد پی‌اچ‌پی:
#define             g_signal_handlers_disconnect_by_func (object,func,data); 

این هم کار تابع قبلی رو انجام می ده فقط ارگومان هاش فرق داره که ارگومان دوم نام تابعی هست که مخاطب سیگنال ایجاد شده هست مثلا

کد پی‌اچ‌پی:
g_signal_handlers_disconnect_by_func (object hello NULL); 


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

• button_press_event
• button_release_event
• scroll_event
• motion_notify_event
• delete_event
• destroy_event
• expose_event
• key_press_event
• key_release_event
• enter_notify_event
• leave_notify_event
• configure_event
• focus_in_event
• focus_out_event
• map_event
• unmap_event
• property_notify_event
• selection_clear_event
• selection_request_event
• selection_notify_event
• proximity_in_event
• proximity_out_event
• visibility_notify_event
• client_event
• no_expose_event
• window_state_event


اگه تابع callback ما شامل این رویداد ها باشه برای ایجاد سیگنال برای انها از تابع g_signal_connect استفاده می کنیم و شکل تابع callback هم بصورت زیر میشه
کد پی‌اچ‌پی:
gint callback_funcGtkWidget *widgetGdkEvent  *eventgpointer   callback_data ); 


که پارامتر اول نام ان widget هست که براش این سیگنال رو ایجاد کردیم و پارامتر اخر هم اطلاعاتی هست که می خوایم به تابع ارسال کنیم اما پارامتر دوم مقدارش می تونه یکی از موارد زیر باشه این که کدوم به کدوم هست رو وقتی که دارم تک تک widget ها رو بررسی می کنم می گم
GDK_NOTHING
GDK_DELETE
GDK_DESTROY
GDK_EXPOSE
GDK_MOTION_NOTIFY
GDK_BUTTON_PRESS
GDK_2BUTTON_PRESS
GDK_3BUTTON_PRESS
GDK_BUTTON_RELEASE
GDK_KEY_PRESS
GDK_KEY_RELEASE
GDK_ENTER_NOTIFY
GDK_LEAVE_NOTIFY
GDK_FOCUS_CHANGE
GDK_CONFIGURE
GDK_MAP
GDK_UNMAP
GDK_PROPERTY_NOTIFY
GDK_SELECTION_CLEAR
GDK_SELECTION_REQUEST
GDK_SELECTION_NOTIFY
GDK_PROXIMITY_IN
GDK_PROXIMITY_OUT
GDK_DRAG_ENTER
GDK_DRAG_LEAVE
GDK_DRAG_MOTION
GDK_DRAG_STATUS
GDK_DROP_START
GDK_DROP_FINISHED
GDK_CLIENT_EVENT
GDK_VISIBILITY_NOTIFY
GDK_NO_EXPOSE
GDK_SCROLL
GDK_WINDOW_STATE
GDK_SETTING
کد پی‌اچ‌پی:
مثلا برای رویداد button_press_event شکل تابع سیگنال می شه

g_signal_connect 
(G_OBJECT (button), "button_press_event",
                  
G_CALLBACK (button_press_callback), NULL); 


و شکل تابع callback می شه
کد پی‌اچ‌پی:
static gint button_press_callbackGtkWidget      *widget,
                                   
GdkEventButton *event,
                                   
gpointer        data ); 

یکی نیست به من کمک کنه تکی ادم خسته می شه ؟ در ضمن فکر کنم زیاد اینجا gtk طرفدار نداره

منبع

مثال:

کد پی‌اچ‌پی:
#include <gtk/gtk.h>
 
void helloGtkWidget *widget,
            
gpointer   data )
{
    
g_print ("Hello World\n");
}
 
gint delete_eventGtkWidget *widget,
                   
GdkEvent  *event,
           
gpointer   data )
{
   
    
g_print ("delete event occurred\n");
   
    return 
TRUE;
}
 
void destroyGtkWidget *widget,
              
gpointer   data )
{
g_print("destroy event occurred");
    
gtk_main_quit ();
}
 
int mainint   argc,
          
char *argv[] )
{
     
    
GtkWidget *window;
    
GtkWidget *button;
    
gtk_init (&argc, &argv);
    
window gtk_window_new (GTK_WINDOW_TOPLEVEL);
    
g_signal_connect (G_OBJECT (window), "delete_event",
              
G_CALLBACK (delete_event), NULL);
    
g_signal_connect (G_OBJECT (window), "destroy",
              
G_CALLBACK (destroy), NULL);
    
gtk_container_set_border_width (GTK_CONTAINER (window), 10);
    
    
button gtk_button_new_with_label ("Hello World");
     
    
g_signal_connect (G_OBJECT (button), "clicked",
              
G_CALLBACK (hello), NULL);
 
    
g_signal_connect_swapped (G_OBJECT (button), "clicked",
                  
G_CALLBACK (gtk_widget_destroy),
                              
G_OBJECT (window));
     
        
gtk_container_add (GTK_CONTAINER (window), button);
     
    
gtk_widget_show (button);
    
gtk_widget_show (window);
    
gtk_main ();
    return 
0;


خوب این هم یک مثال کامل برای رویداد ها بیشتر قسمت های این مثال برای شما باید اشنا باشه و اما سایر قسمت ها

کد پی‌اچ‌پی:
gtk_widget_destroy(widget); 

این تابع برای حذف یک widget بکار میره ولی اگه widget ما یک پنجره باشه برای اجرای کاملش به یک تابع مثل شکل زیر نیاز داره
کد پی‌اچ‌پی:
void destroyGtkWidget *widget,
              
gpointer   data )
{
    
gtk_main_quit ();


چون تابع ما تنها می تونه اون widget رو حذف کنه ولی نمی تونه حلقه gtk_main رو به پایان برسونه وقتی این تابع اجرای میشه مقداری رو بر می گردونه که بر اساس ان تابع destroy وارد عمل میشه برای امتحان هم که شده شما تابع destroy رو از برنامه حذف کنید مشاهده می کنید که با اجرای برنامه و کلیک دکمه ظاهرا پنچره حذف و برنامه خاتمه می یابد ولی پنجره کنسول هنوز باز هست و اماده دریافت اطلاعات هست علتش هم این هست که ما هنوز از حلقه gtk_main خارج نشدیم از تابع زیر برای خروج از حلقه استفاده می کنیم
کد پی‌اچ‌پی:
gtk_main_quit (); 
خوب تابع دیگه ای که تو برنامه داریم
کد پی‌اچ‌پی:
gint delete_eventGtkWidget *widget,
                   
GdkEvent  *event,
           
gpointer   data )
{
   
    
g_print ("delete event occurred\n");
   
    return 
TRUE;



که چون ما از رویداد delete_event استفاده کردیم به همین علت تابع callback ما به شکل بالا هست و مقدار بازگشتی این تابع TRUE یا FALSE هست که اگه TRUE باشه دیگه تابع destroy اجرا نمی شه اما اگه FALSE باشه موجب اجرای تابع destroy و خروج از برنامه میشه تابع delete_event هنگامی فراخوانی میشه که شما دکمه close برنامه رو فشار بدید توجه داشته باشید که تابع destroy یا زمانی که شما دکمه موجود در برنامه رو فشار بدید و یا زمانی که شما دکمه close برنامه رو فشار بدید اجرا میشه با این مثال قضیه رویداد ها تموم شد هر widget رویداد های خاص خودش رو داره و شما هم می تونید خودتون یک widget یا یک رویداد جدید بسازید که در اینده اون ها رو هم توضیح می دم .

منبع

http://barnamenevis.org/showthread.php?71880-%D8%A7%D9%85%D9%88%D8%B2%D8%B4-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%A8%D8%A7-gtk
اموزش جی تی کا

برنامه glad رابط گرافیکی در گنوم
https://glade.gnome.org/

http://anjuta.org/

http://amirkouhkan.ir/%d8%af%d8%a7%d9%86%d9%84%d9%88%d8%af-%da%a9%d8%aa%d8%a7%d8%a8-%d8%a2%d9%85%d9%88%d8%b2%d8%b4-gtk-%d8%a8%d9%87-%d8%b2%d8%a8%d8%a7%d9%86-%d8%a7%d9%86%da%af%d9%84%db%8c%d8%b3%db%8c/#comment-8


  • ShahBaz

انجمن های به اشتراک گذاشته شده

ShahBaz | پنجشنبه, ۴ شهریور ۱۳۹۵، ۰۶:۱۶ ب.ظ
  • ShahBaz

لینک راهنمای opencv ورژن 3.1.0 به زبان c++

ShahBaz | يكشنبه, ۲۴ مرداد ۱۳۹۵، ۰۸:۲۸ ق.ظ
  • ShahBaz

پردازش تصویر-تشخیص چهره

ShahBaz | پنجشنبه, ۲۷ خرداد ۱۳۹۵، ۰۴:۱۶ ب.ظ

تشخیص پوست بدن با OpenCV

شنبه, ۱ خرداد ۱۳۹۵، ۰۱:۵۹ ب.ظ

   در پست قبلی (تشخیص رنگ با استفاده از OpenCV و Python)، نحوه تشخیص رنگ های مختلف درون یک تصویر را با استفاده از دستور inRange آموزش دادم. اکنون با استفاده از این آموزش و کمی فیلترهای مختلف، قصد دارم برنامه ای برای تشخیص پوست بدن بنویسم. برای امتحان درستی کد از دوربین Raspberry pi استفاده می کنم. کدها توسط OpenCV 3.0.0 و Python 2.7 نوشته شده اند.

# import the necessary packages
import numpy as np
import cv2

# define the upper and lower boundaries of the HSV pixel
# intensities to be considered 'skin'
lower = np.array([0,48,80], dtype = "uint8")
upper = np.array([189,224,255], dtype = "uint8")

   ابتدا پکیج های لازم را فراخوانی می کنیم. پکیج Numpy برای Numerical Processing و پکیج cv2 برای OpenCV است.

   برای تشخیص رنگ، ساده ترین روش استفاده از حالت HSV نسبت به BGR است. چون می خواهیم از دستور inRange برای ساخت ماسک استفاده کنیم به همبن دلیل باید محدوده ای برای رنگ پوست انتخاب کنیم. با کمی جستجو در اینترنت می توانید رنگ پوست مورد نظر را بدست آورید.

camera = cv2.VideoCapture(-1)

# keep looping over the frames in the video
while True:
    # grab the current frame
    success, frame = camera.read()
 
    #convert it to the HSV color space,
    # and determine the HSV pixel intensities that fall into
    # the speicifed upper and lower boundaries
    frame=cv2.resize(frame,(300,300),cv2.INTER_AREA)
    converted = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    skinMask = cv2.inRange(converted, lower, upper)

   چون می خواهیم از دوربین استفاده کنیم، پس با استفاده از دستور cv2.VideoCapture، استفاده از دوربین را آماده می کنیم.

   برای اینکه عملیات پردازش بر روی هر فریم سریع تر انجام شود، بهتر است ابعاد فریم ها رو کوچکتر کنیم. به همین جهت، ابعاد فریم ها را به 300 پیکسل کاهش می دهیم.

   در قسمت بعدی هر فریم را از حالت BGR به HSV تبدیل می کنیم و در آخر توسط دستور inRange یک ماسک براساس رنگ پوست می سازیم.

    # apply a series of erosions and dilations to the mask
    # using an elliptical kernel
    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (10, 10))
    skinMask = cv2.erode(skinMask, kernel, iterations = 2)
    skinMask = cv2.dilate(skinMask, kernel, iterations = 2)
 
    # blur the mask to help remove noise, then apply the
    # mask to the frame
    skinMask = cv2.GaussianBlur(skinMask, (3, 3), 0)
    skin = cv2.bitwise_and(frame, frame, mask = skinMask)

   در برخی مواقع ممکن است قسمت های کوچک و اشتباهی در تصویر مشخص شوند. برای از بین بردن این قسمت ها از فیلترهای erode و dilate استفاده خواهیم کرد. ولی قبل از آن یک ماتریس به شکل ellipse طراحی می کنیم و ابعاد آن را 10*10 انتخاب می کنیم. توجه کنید هرچه ابعاد ماتریس بیشتر باشد عملیات پردازش کندتر ولی نتیجه با کیفیت بالاتری خواهد بوذ.

   در مرحله بعدی با استفاده از دستور cv2.bitwise_and، هر فریم را باخودش و برحسب ماسک AND خواهیم کرد.

    # show the skin in the image along with the mask
    cv2.imshow("images", np.hstack([frame, skin]))      
    # if the 'q' key is pressed, stop the loop
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break
 
# cleanup the camera and close any open windows
camera.release()
cv2.destroyAllWindows()

   در آخر نوبت به نمایش نتیجه می رسد. برای خروج از برنامه از کلید q استفاده خواهیم کرد. فراموش نکنید که در پایان برنامه حتما دوربین را آزاد کنید. شکل زیر نتیجه نهایی را نشان خواهد داد.

   البته این روش مشکل های زیادی دارد. به عنوان مثال برای تشخیص رنگ افراد سیاه پوست نمی توان از این روش استفاده کرد. شاید یک روش علمی و بهتر استفاده از تشخیص چهره باشد. پس از مشخص شدن محدوده صورت می توان از رنگ چهره فرد یک نمونه گرفت و با آن یک محدوده برای ماسک ساخت. در پایان می توانید کد را از لینک زیر دریافت کنید.

دریافت

حجم: 489 کیلوبایت

توضیحات: Skin Detector

================================

    امروز تصمیم گرفتم یکی از پروژه های قدیمی که در مورد طراحی تقویت کننده دو طبقه با استفاده از ترانزیستورهای BJT هست، رو قرار بدم تا دوستانی که تمایل به طراحی تقویت کننده دارند، از اون بهره ببرند.

   
ویژگی های این تقویت کننده ترانزیستوری عبارت است از:

  • بهره ولتاژ حدود 100

  • امپدانس وروردی بالا

  • امپدانس خروجی پایین (در حدود 10 اهم)

   در طراحی این تقویت کننده از ترانزیستور BC107 استفاده شده است که از رایج ترین و ارزان قیمت ترین ترانزیستورهای BJT هست. همچنین از یک فیدبک ساده در این تقویت کننده استفاده شده است تا شکل موج خروجی با کیفیت بالا و تقارن بهتری تولید شود. برای شبیه سازی، از نرم افزار Pspice استفاده شده است.

دریافت

حجم: 5.01 مگابایت

توضیحات: Two Stage BJT Amplifier

============================

طراحی و ساخت برد Daisy

سه شنبه, ۱۷ فروردین ۱۳۹۵، ۱۰:۵۲ ب.ظ

   امروز تصمیم دارم شماتیک و PCB یکی از بردهایی که طراحی و ساختم رو قرار بدم. برای طراحی برد از نرم افزار Altuim Designer استفاده شده است. این برد دارای یک تراشه FPGA از خانواده Spartan-6 و یک میکروکنترلر ARM از خانواده stm32f103 می باشد، که از طریق 16 پایه با یکدیگر در ارتباط هستند. و ابعاد برد در حدود 12*5 می باشد.

  یک حافظه جانبی از شرکت ATMEL به منظور برنامه ریزی تراشه FPGA روی برد قرار داده شده است که نسبت به خود حافظه های شرکت xilinx ارزان تر و کوچکتر بوده است. کلاک مورد نیاز FPGA از طریق دو نوسان ساز تامین می شود. برای میکروکنترلر نیز یک کریستال 16MHz در نظر گرفته شده است. برنامه ریزی FPGA از طریق پروتکل JTAG انجام می شود. همچنین این روند برای میکرو از طریق پروتکل های JTAG و SW امکان پذیر می باشد. از طرفی، یک تراشه FT232 به منظور پروگرام کردن میکرو از طریق USB و BOOTLOADER استفاده شده است که در پست های آینده نحوه  این کار را توضیح خواهم داد.

   این برد از دو برد جدا از هم تشکیل شده است که طبقه اول شامل تراشه های پردازشی ، پورت های برنامه ریزی، پورت های منبع تغذیه و تعدادی LED است و برد دوم با در اختیار داشتن کلیدهای فشاری، LED، دیپ سوییچ جنبه آموزشی این برد را بر عهده دارد.

دریافت

حجم: 1.11 مگابایت

توضیحات: Daisy board-PCB & Schematic

=============================

  • ShahBaz

کتابخانه های پردازش تصویر

ShahBaz | شنبه, ۲۲ خرداد ۱۳۹۵، ۰۳:۳۴ ب.ظ
  •  OpenCV

      10.0   9.6

    Open source computer vision. [BSD]

  •  tesseract-ocr

     9.6  8.4

    An OCR engine. [Apache2]

  •  VTK

     7.2  9.9

    Open-source, freely available software system for 3D computer graphics, image processing and visualization. [BSD]

  •  OpenImageIO

      6.8   9.0

    Powerful image and texture wrangling library with support for a wide number of common lossy and RAW formats. [Modified BSD]

  •  libvips

      6.7   9.4

    A fast image processing library with low memory needs. [LGPL] website

  •  OpenEXR

      6.3   0.0

    Cross-platform library for high dynamic range imaging. [Modified BSDF]

  •  Magick++

      5.9   6.2

    ImageMagick program interfaces for C++. [Apache2]

  •  ITK

     5.7  9.6

    An open-source, cross-platform system for image analysis. [Apache2 from ITK 4.0]

  •  VIGRA

      5.5   9.2

    A generic C++ computer vision library for image analysis. [MIT X11]

  •  GD

      4.6  8.3

    GD Graphics Library, famously used in PHP for image loading/manipulation & thumbnail generation. [custom permissive license, requires mention in user docs] website

  •  Video++

      4.4   3.4

    A C++14 high performance video and image processing library. [MIT]

  •  CImg

      4.3   9.6

    A small, open source, C++ toolkit for image processing. [Own LGPL or GPL]

  •  GDCM

     3.6  9.3

    Grassroots DICOM library.

  •  CxImage

     3.3  0.0

    An image processing and conversion library to load, save, display, transform BMP, JPEG, GIF, PNG, TIFF, MNG, ICO, PCX, TGA, WMF, WBMP, JBG, J2K images. [zlib]

  •  Boost.GIL

     2.5  0.0

    Generic Image Library.

  •  FreeImage

     2.1  0.0

    An open source library that supports popular graphics image formats and others as needed by today's multimedia applications. [GPL2 or GPL3]

  • ShahBaz

دیتابیس تصاویر جهت انالیز

ShahBaz | شنبه, ۲۲ خرداد ۱۳۹۵، ۰۴:۲۴ ق.ظ
Aerial photographs/satellite images. Can you find your back yard?
http://terraserver.microsoft.com
Astrophotography Matt BenDaniel, Astrophotographer
http://starmatt.com/photographer.html 
Atlas Fotogr�fico OnLine Colecciones fotogr�ficas con breves referencias para ayudar a quienes no conocen de estas �reas.  Ideal para estudiantes.

Atlas de Hematolog�a On Line
http://orbita.starmedia.com/~forobioq/atlashemato.html

Atlas de Parasitolog�a On Line
http://orbita.starmedia.com/~forobioq/atlasparasito.html

Atlas de Nefrolog�a On Line
http://orbita.starmedia.com/~forobioq/atlasedimento.html

BioImage DataBase The aim of the BioImage Database project is to provide the general scientific community with a flexible and searchable database of multi-dimensional biological images.  www.bioimage.org 
Biometrics The Biometric Consortium, Research and Databases
Face, Fingerprints, Handwriting, Voice
www.biometrics.org/html/research.html
Brodatz Textures http://www.ux.his.no/~tranden/brodatz.html 
Color & Vision databases efg's Color Reference Library:  Databases
Color Charts efg's Color Reference Library:  Color Charts
Computer Vision Test Images www.cs.cmu.edu/afs/cs/project/cil/ftp/html/v-images.html
Database of Faces
ATTFaceDatabase.jpg (6138 bytes)
AT&T Research Labs, Cambridge, England 
(formerly Olivetti Research Labs)
www.uk.research.att.com/facedatabase.html 
ftp://ftp.uk.research.att.com/pub/data/orl_faces.zip (~3.7 MB) 
ftp://ftp.uk.research.att.com/pub/data/orl_faces.tar.Z (~4 MB) 

See efg's Interactive PGMP5 "viewer" to display PGM files (P5 format) or the command-line utilityConvertFaces to convert PGM files of the Olivetti and Oracle Research Laboratory's Database of Faces (400 images) to BMP or JPG: PortableGrayMap.ZIP

Faces of 16 people, 27 of each person under various conditions of illumination, scale, and head orientation.
ftp://whitechapel.media.mit.edu/pub/images     faceimages.tar.Z 
ftp://ftp.uk.research.att.com/pub/data/mit_faces.tar.Z (~5.7 MB) 

The Yale Face Database (size 6.4MB) contains 165 grayscale images in GIF format of 15 individuals. There are 11 images per subject, one per different facial expression or configuration: center-light, w/glasses, happy, left-light, w/no glasses, normal, right-light, sad, sleepy, surprised, and wink.
http://cvc.yale.edu/projects/yalefaces/yalefaces.html 

AR Face Database
This face database contains more than 130 people (around 70 males and 60 females). Everyone was asked to come twice to the Computer Vision Center, where the pictures were taken under strict controlled conditions. These two different sessions were separated in 14 days (two weeks time). 
http://rvl1.ecn.purdue.edu/~aleix/aleix_face_DB.html

See also Recognition in Algorithms for Face Recognition Home Page.

Demo Test Pattern Images Various test patterns including DisplayMate Master Test Pattern, Color Scales, SMPTE Color Bars, Fine Dot Moire and Gray-Scale Test Pattern at various resolutions including 640 x 480, 800 x 600, and 1024 x 768
www.displaymate.com/patterns.html
Edmund Optics Choosing the Correct Testing Target
www.edmundoptics.com/techsupport/displayarticle.cfm?articleid=249&search=1 

Test Targets
www.edmundoptics.com/onlinecatalog/Browse.cfm?categoryid=289 

Grain Test images about wheat grains, corn, weed seeds, fragments of plants (stem, leaf, etc.), string-pea, barley.  http://physics2.kee.hu/baranyai/image.htm 
Image Database Carnegie Mellon
www.ius.cs.cmu.edu/idb
IMINT Gallery www.fas.org/irp/imint/index.html
Infrared Images Thermology Image Gallery
www.thermology.com/infrared.htm 
Ishihara Test Charts efg's Color Reference Library:  Color Blindness
Kodak

Kodak
www.kodak.com/digitalImaging/samples/classic.shtml

ftp://ftp.kodak.com/www/images/pcd

Knots Database of Knots
ftp://ftp.ee.oulu.fi/pub/tklab/KNOTS 
LBNL Image Library Lawrence Berkeley National Lab's Image Library
http://www-itg.lbl.gov/ImgLib.project/homepage.html
Landsat 7

Landsat 7 scenes from Greece, Singapure and Israel. Browse and make false color composition with entire set of Landsat images.  www.inovagis.org

Mandrill Monkey   efg's Create Mandrill BMP Lab Report
efg's Show Image Lab Report
NASA's Visible Earth A searchable directory of images, visualizations, and animations of the Earth
www.visibleearth.nasa.gov 
NIST Special Databases and Software from the Visual Image Processing Group ftp://sequoyah.ncsl.nist.gov/pub/databases/catalog.txt 
Includes:
- Binary Images of Handwritten Segmented Characters
- 8-Bit Gray Scale Images of Fingerprint Image Groups

OCR, Face/Mug Shot, Fingerprint
www.itl.nist.gov/div894/vip/databases/defs/vip_dbases.html

NOAA National Oceanic and Atmospheric Administration's
Operational Significant Event Imagery Server.  
High-resolution, detailed imagery of significant
natural or anthropogenic environmental events that
which are visible in remotely-sensed data 
www.osei.noaa.gov/main5.html
Nyquist Chart Using a Nyquist Chart to Evaluate Digital Camera Systems
Part 1.
www.photobit.com/Technology/White_Papers/Using_a_Nyquist_Chart_1/using_a_nyquist_chart_1.htm 

Part 2.  
www.photobit.com/Technology/White_Papers/Using_a_Nyquist_Chart_2/using_a_nyquist_chart_2.htm 

Plants Plants Gallery, U.S. Department of Agriculture 
http://plants.usda.gov/gallery.html 
Precicion 
Optimal
Imaging, Inc.

Test Charts
www.precisionopticalimaging.com/standards/standards.asp?type=Test%20Charts 

Resolution Standards
www.precisionopticalimaging.com/standards/standards.asp?type=Resolution%20Standards 

Scanner Calibration Scanner Calibration Targets
www.targets.coloraid.de
 

SinePatterns, LLC

PIMA/ISO Camera Resolution Chart
PIMA/ISO Camera Contrast Chart
IEEE Resolution Chart
FBI SIQT Scanner Test Chart

www.sinepatterns.com

SinePatternsStarburst.gif (7118 bytes)

Skeletal Gene Database

http://sgd.nia.nih.gov 
SOFA Sequences for Optical Flow Analysis (synthetic test sequences with full ground truth), Heriot-Watt University
www.cee.hw.ac.uk/~mtc/sofa
Test Card Gallery BBC Test Cards
http://www.meldrum.co.uk/mhp/testcard/bbc_test.html 

The Television Test Card
www.test-cards.fsnet.co.uk 

Test Patterns Practical Handbook on Image Processing for Scientific Applications  p. 347-349
USC-SIPI Image Database University of Southern California Signal and Image Processing Institute:  The USC-SIPI image database is a collection of digitized images, which is maintained primarily to support research in image processing, image analysis, and machine vision. The first edition of the USC-SIPI image database was distributed in 1977 and many new images have been added since then.

Textures, high altitude aerial images, Lenna, baboon, other favorites, sequences (moving head, fly-overs, moving vehicles).  http://sipi.usc.edu/services/database/Database.html

Visible Human Project
VisibleHuman.gif (5126 bytes)
www.nlm.nih.gov/research/visible
Vismod Imagery MIT:  http://vismod.www.media.mit.edu/vismod/imagery/imagery.html
VisTex Vision Texture (MIT):  100+ reference textures, texture scenes
http://www-white.media.mit.edu/vismod/imagery/VisionTexture/vistex.html

  • ShahBaz

الگوریتم تشخیص عنبیه

ShahBaz | شنبه, ۲۲ خرداد ۱۳۹۵، ۰۴:۱۸ ق.ظ
Recognition, Iris
Iris Recognition Homepage
www.iris-recognition.org 

  • ShahBaz