# Native Code > برنامه نویسی موبایل > Symbian OS >  آموزش برنامه نویسی سیمبین  با پایتون

## ASedJavad

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

----------


## prespolis

دوست عزیز هیچ هم اینطور نیست!من خودم پایه ثابت تایپکت خواهم بود! :تشویق:  :لبخند گشاده!:  :قلب:

----------


## ASedJavad

سلام مجدد
علی رغم عدم استقبالی که صورت گرفت، به دلایلی که برای خودم هم مبهمه، تصمیم گرفت یه آموزش مختصری از پایتون سیمبین اینجا بذارم.
فقط همین اول کار گربه رو دم حجله بکشم و دو تا نکته خیلی مهم رو عرض کنم خدمتتون:
1- از اونجایی که حدود 40 روز دیگه کنکور ارشد دارم، نمیتونم تند و تند مطلب بذارم و شاید بین پست هایی که میذارم یک هفته یا بیشتر فاصله بیفته.
2- چون خودم هنوز یک ماه نمیشه که با پایتون اشنا شدم، طبیعتا نمیتونم به خیلی از سوالات جواب بدم.

*خب و اما مقدمه*
همون طور که میدونید زبان اصلی برای برنامه نویسی سیمبین C++‎ هست اما از اونجایی که یادگیری این زبان برای خیلیا مشکل هست، یه عده! تصمیم به توسعه زبونای اسکریپتی سطح بالا (که یکی از خاصیت های اصلیشون مستقل از سکو بودنه) برای استفاده در گوشی های سیمبین گرفتند
این جوری شد که مفاهیمی مثل pySymbian، rubySymbian، SymbainPrel، m-Shell و ... شکل گرفت.
به این ترتیب میشه با یادگرفتن اصول یکی از زبان های بسیار ساده روبی، پرل و پایتون به برنامه نویس سیمبین تبدیل شد.

خب من در اینجا شروع میکنم به آموزش پایتون سیمبین
سعی میکنم زبون شیرین m-shell رو هم به صورت موازی در اینجا آموزش بدم.
و خیلی خوشحال میشم اگه کسی بتونه در مورد برنامه نویسی سیمبین با روبی، پرل و علی الخصوص رودس (که بر پایه روبی بنا شده) هم توضیحاتی بیان کنه.

(تنها منبعی که من برا برنامه نویسی روبی رو سیمبین پیدا کردم http://www.developer.nokia.com/Commu.../Category:Ruby و تنها منبع پرل http://sourceforge.net/projects/symbianperl/ بود
در ضمن در مورد رودس هم در http://www.knowtechmag.com/archive-i...ile-agile.html مطلب مختصری ذکر شده.)

----------


## ASedJavad

این هم چند منبع در مورد پایتون:
پایتون چیست:
http://ashiyane.org/forums/showthread.php?t=43508

چند سایت و فروم فارسی در مورد پایتون
http://www.pylearn.com/fa/wiki/index...B5%D9%84%DB%8C
https://barnamenevis.org/forumdisplay...rl-Python-Ruby
http://ashiyane.org/forums/forumdisplay.php?f=184
http://netak.ir/forumdisplay.php?fid=79&page=1

چند منبع برای پایتون در سیمبین
http://www.pylearn.com/fa/forum//index.php?board=33.0
http://www.developer.nokia.com/Commu...gory:PySymbian
http://forum.mobilestan.net/forumdisplay.php?f=312


نرافزارهای موبایل تحت پایتون:
http://forum.mobilestan.net/forumdisplay.php?f=517

----------


## ASedJavad

و اما شروع کار:
اول ورژن 2 پایسیمبین رو برای سیمبین سری 60 از https://garage.maemo.org/frs/downloa....0.0_Setup.exe برای ویندوز و از https://garage.maemo.org/frs/downloa...0_2.0.0.tar.gz برای لینوکس دانلود کنید.
فایل فوق در حقیقت یه پک هست از ابزارهایی که برای نصب روی گوشی نیاز دارید. به اضافه یک راهنمای جامع برنامه نویسی سیمبین
خب
حالا لازمه  فایلهای Python_2.0.0.sis، pips.sis، ssl.sis و یکی از PythonScriptShell های موجود رو گوشیتون نصب کنید. وبه این ترتیب میتونید شروع کنید به برنامه نویسی!

تذکر ممکنه با نصب این ورژن از پایتون تعدادی از نرم افزارهای روی گوشیتون احرا نشن
در این صورت لازمه بعد از نصب فایلهای فوق الذکر  فایل معرفی شده در لینک زیر رو هم دانلود ونصب کنید

http://forum.mobilestan.net/showthread.php?t=108975

درضمن اگه میخواین رو گوشیتون برنامه نویسی کنید به یک ویرایشگر متن ساده که از فرمت utf-8 پشتیبانی میکنه رو گوشی نیاز دارید مثل DEdit

----------


## ASedJavad

خب
برای نوشتن و اجرای دستورات پایتون، اسکریپتشلی رو که نصب کردین باز کنید
حالا دو راه دارید
یکی اینکه از options گزینه Interactive console رو انتخاب کنید
جالا میتونید دستورات رو یکی یکی تایپ کنید، بعد دکمه وسط رو بزنید تا اون خط اجرا بشه
مثلا برا شروع میتونید بنویسید:
(بزرگ و کوچکی حروف مهمه!)
import appuifw
appuifw.note(u'Hello World')

راه دوم اینه که برنامه رو تو یه ویرایشگر متن ساده مثل notepad تو کامپیوتر یا DEdit تو گوشی تایپ کنید و اون رو با فرمت utf-8 و با پسوند py. ذخیرش کنید بعد منتقلش کنید به فولدر e:\data\python  یا اگه پایتون رو تو c نصب کردید به فولدر مشابه تو همین درایو.
حالا تو پایتون اسکریپت شل گزینه run script رو بزنید و بعد فایلتون رو انتخاب کنید

----------


## ASedJavad

سلام مجدد



> 1- نمیشه از نسخه های جدید (3) استفاده کرد ؟
>  آخرین نسخه قابل استفاده همون 2.6 ؟
> 2- فقط برای سری 60 قابل استفاده هست ؟
> 3-گوشیهای نوکیا شبیه ساز نداره ؟


1- نه متاسفانه.
آخرین نسخه از پایسیمبینی که نوکیا معرفی کرد(نسخه ورژن 2.0.0) (در تاریخ 11 فوریه 2010) بر مبنای پایتون Python 2.5.4 بود و بعد از اون، نسخه جدیدی ارائه نشد.

2-ظاهرا این نسخه مخصوص سیمبین سری 60 ورژن 3 و 5 هست. (اینجا رو نگاه کنید) اما ظاهرا برای سری 80 و 90 و سری 60 ویرایش 1 (و UIQ) نسخه قدیمی کار میکنه که بر مبنای پایتون 2.3.3 هست.(من که انگلیسی حالیم نمیشه ولی شما میتونید اینجا رو یه بررسی کنید)

3-چرا شبیه ساز داره . اینجا و اینجا 

رو شبیه سازش حتی میتونید خیلی از فایلهای جاوا ام ای رو نصب و اجرا کنید اما نمیتونید فایلهای سیس رو نصب کنید.
برای نصب پایتون روی این شبیه ساز شما نیاز دارید یکی از فایل های Python_2.0.0_SDK_3rdEdFP1 یا Python_2.0.0_SDK_3rdEdFP1.zip رو بسته به شبیه سازتون از https://garage.maemo.org/frs/?group_...elease_id=3264 دانلود و نصب کنید (برای سیمبین سری 60 ورژن 5 فایل دومی رو دانلود کنید.) 
(اگه sdk پایتون فایل setup نداشت، محتویات اون رو کپی پیست کنید تو فولدر نصب شبیه سازتون ( به طور پیشفرض \C:\Symbian\9.2\S60_3rd_FP1_2  یا مسیری مشابه این (بسته به ورژن شبیه سازتون))
به این ترتیب شما میتونید پایسیمبین رو رو ویندوزتون استفاده کنید (ظاهرا فقط مخصوص ویندوزه) البته بدیهیه که بعضی از قابلیتاش مثل تماسو پیامک و ... قابل استفاده نیست!
در ضمن بد نیست این نکته رو یادآوری کنم که ممکنه قبل از نصب شبیه ساز مجبور به نصب اکتیو پرل و جاوا رانتایم هم بر روی ویندوزتون بشید.




> یکی از بدیهای پایتون اینه که هنوز اقبال عمومی روی همون 2.7 هست درحالی که ورژن 3 اومده و تاکید بر اون هم هست وخب البته واقعا هم بهتر شده ولی تا پشتیبانی خوبی از ماژولها و اقداماتی که قبلا روی نسخه های قبلی صورت گرفته در نسخه جدید نیز ادامه پیدا نکنه اوضاع همینطوریه
> حتی تو همین فیلمی که جدیدا آپ کردم و تو سایت لینک دادم تو اندروید و SL4A هم از 2.6 استفاده شده
> البته شاهد تغییرات زیادی در صنعت موبایل ، تبلت و دستگاههای همراه هستیم و این تغییرات ادامه داره و در این بین سیمبین عقب مونده و خبرهایی مبنی برکنار گذاشتن اون توسط نوکیا به گوش میرسه


بله
ظاهرا حق با شماست
اگرچه نوکیا سیمبین رو کنار گذاشته ولی خب هنوز تو ایران گوشی سیمبین دار زیاده!

میخوام در دو سه مطلب بعدی آموزش مختصری از اصول برنامه نویسی پایتون بذارم
اگه کسی چنین آموزش مختصری رو سراغ داره خوشحال میشم با گذشتن اون کار من رو راحت کنه!

----------


## ehp_kz6597

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

----------


## ASedJavad

ممنون
تنها مشکلش نبود آموزش استفاده از مدول ها بود.

این هم یک جزوه آموزشی 14 صفحه ای از پایتون که البته کسی که این رو میخونه باید با اصول کلی برنامه نویسی اشنا باشه.
چون فقط گذرا همه چی رو شرح داده (بجز مباحث شی گرایی و چند نخی)
این جزوه برا کسایی خوبه که اولا برنامه نویسن (فرق نمیکنه با چه زبونی ) و در ثانی میخوانم یه روزه پایتون رو یاد بگیرن

----------


## ASedJavad

سلام مجدد
خب تقریبا مقدمات کار تموم شد
ان شاءالله در مطلب بعدی میریم سراغ اصل برنامه نویسی موبایل
فقط احتمالا باید تا اواخر بهمن صبر کنید.
چون تصمیم دارم این دو سه هفته رو کل وقتمو بذارم برا کنکور!

----------


## dodvaod

> سلام
> چند وقتیه رو اوردم به برنامه نویسی گوشی های سیمبین با پایتون
> و همچنین چند وقتیه به سرم زده یه سری آموزشی از اون رو اینجا بذارم
> ولی احساس میکنم کسی به این تاپیک سر  نمیرنه و زحمتم بیهوده خواهد بود
> خلا صه اگه به نظر شما خلاف اینه، یه جوری بهم بفهمونین تا شروع کنم.


 دوست عزیزم سلام 
خیلی کوتاه بگم: (اگه می خواهی که این تاپیک مفید واقع بشه شما شروع کن بقیه اش را بسپار به قانون طبیعت (خواستن توانستنه) مطمئن باش وقتی که آدم کاری رو بخواد بشه میشه به من ثابت شده چندین بار (شاید تو دلت بخندی ولی به خدا این موضوع شوخی نیست) من تازه وارد برنامه نویسی پایتون شدم قبلاً با Visual Studio کار میکردم راستش خیلی خوشم نیومد خیلیا دارن کار می کنن(نظر شخصیه و ربطی به کارا بودن یا نبودن اون نداره) بعد از یه مقدار تحقیق در مورد زبانهای برنامه نویسی و با توجه به اهدافم از یادگیری زبانهای برنامه نویسی و راهنماییهای دوستان به این زبان رو آوردم .
شخصاً نظرم اینه که آدما منحصر به فردند و باید کارها شون هم منحصر به فرد باشه.اگه توجه کرده باشی می بینی که آموزش برنامه نویسی به زبانهای عمومی زیاده ولی به زبانهای خاص کمه من خودم دوست دارم خاص باشم پس شما هم اگه دوست داری کار خاصی بکنی ادامه بده.درسته شاید به اندازه زبانهای دیگه بازدید کننده نداشته باشی ولی این دلیلی بر مفید نبودن کارت نیست. به هر حال امیدوارم موفق باشی و سربلند
 :تشویق:  :تشویق:  :تشویق:  :تشویق:  :تشویق:  :تشویق:

----------


## ASedJavad

سلام
و اما شروع برنامه نویسی موبایل
*قسمت اول: ورودی و خروجی – بخش 1*
خب؛ برای اینکه بتونیم اطلاعاتی رو از کاربر بگیریم یا اطلاعاتی رو به کاربر نشون بدیم، بطور پیش فرض پایتون، می تونیم از دستورات print و input و raw_input استفاده کنیم.
اما راه بهتر اینه که  از توابع گنجانده شده در دو کتابخانه appuifw  و globalui استفاده کنیم.
اول میریم سراغ مدول appuifw
برای اینکه بتونیم از این کتابخونه استفاده کنیم، طبیعتا باید اول اون رو به برنامتون وارد کنید:
impot appuifw
حالا برای نمایش دادن پیغام برای کاربر باید از دستور appuifw.note استفاده کرد. این دستور دو تا آرگومان میگیره.
اولیش اطلاعاتیه که میخواین نمایش داده بشه (دقت کنین که حتما باید از نوع رشته یونیکد باشه)
و دومیش که اختیاریه نوع پیغامه که یکی از مقادیر زیر هست: (دقت کنید که از نوع متنیه (متن معمولی نه یونیکد))
‘conf’ , ‘info’ , ‘error’
مثال:
import appuifw
appuifw.note(u"Hello World", 'conf')


Py1.jpg
این دفعه برا آشنایی این عکس رو گذشتم ولی سعی میکنم در موارد دیگه عکس نذارم تا خودتون امتحان کنید و یاد بگیرید.

*کار با یونیکد*
چون نکته مهمیه همین جا (یه بار برای همیشه) میگم و رد میشم:
در بیشتر مواقع لازمه که متنتون برای نمایش تو موبایل به صورت یونیکد باشه.
اگه متنتون انگلیسیه که مثل همین مثال بالا، قبلش یه u میذارید و تموم
اگه متنتون فارسی یا زبون دیگه ایه دو حالت داره
1-	اگه برنامه رو تو یه فایل جدا مینویسید و بعدا میخواید اجراش کنید، باز هم مثل متون انگلیسی یه u اولش مینویسید و تموم. فقط باید یادتون باشه که متنتون رو با فرمت  utf8‌ذخیره کنید.
2-	اما اگه تو خود محیط اینتراکتیو اسکریپت شل پایتون دارید برنامه رو خط به خط مینویسید و اجرا میکنید باید متنتون رو بنویسید و بعد متد decode اون رو با آرگومان ورودی ‘utf-8’ اجرا کنید. مثال:
appuifw.note("سلام عموجون".decode(‘utf-8’), ‘info’)
همچنین اگه میخواین مقادیری مثل اعداد، لیست ها و سایر متغیرهای غیر رشته ای رو نمایش بدید باید اول با تابع str اونا رو تبدیل به رشته کنید و بعد بهشون فرمت utf-8‌ بدید: مثال:
appuifw.note(str(12).decode(‘utf-8’), ‘error’)

*اما مدول globalui* که در این مورد، شباهت زیادی به مدول قبلی داره فقط عنوان تابعش از appuifw.note به globalui. global_note  تغییر میکنه و مقدار آرگومان دومش میتونه یکی از مقادیر زیر باشه:
'info' , 'error' , 'text' ,  'warn' ,  'warn'  , 'perm' ,  'confirm' ,  'charging' ,  'not_charging' ,  'battery_full' , 'battery_low' , 'recharge_battery'

خب فعلا فکر میکنم تا همین جا کافیه
تا آموزش بعدی!

----------


## ASedJavad

*ورودی و خروجی – بخش دوم*
سلام.
اما نحوه گرفتن اطلاعات از کاربر:
اول مدول appuifw رو import کنید.
حالا با اجرای دستور appuifw.query() پیغامی نشون داده میشه که کاربر میتونه اطلاعاتش رو وارد کنه:
این تابع سه تا آرگومان ورودی داره. اولیش توضیحیه که بالای کادر پیام نشون میده و باید از نوع یونیکد باشه، دومیش نوع اطلاع دریافتیمونه که از نوع رشته بوده و میتونه یکی از مقادیر زیر باشه:
'text' ، 'number' ، 'float' ، 'code' ، 'date' ، 'time' و 'query'
که 'text' برای دریافت رشته (با فرمت utf-8)، 'number' در یافت عدد صحیح، 'float' دریافت عدد اعشاری، 'code' دریافت پسورد (در حقیقت یک رشته یونیکد دریافت میکند اما کاربر در هنگام ورود اطلاعات بجای حرف تایپ شده * میبیند)، 'date' و  'time' برای دریافت تاریخ و زمان  میباشند و  'query' یک سوال با دو گزینه yes  و no نمایش میدهد.
آرگومان سوم این تابع (که اختیاری میباشد) مقدار پیشفرض را تعیین میکند. این آرگومان در نوع ‘code’ کاربرد ندارد.
مثال:
import appuifw
date = appuifw.query(u"Enter a date", 'date')

همچنین این مدول (appuifw) یه تایع داره به اسم multi_query که یه پیغام با دو تا کادر نشون میده (مثلا برای دریافت نام و نام خانوادگی) و خروجی اون هم یه tuple دو عضویه. این تابع دو تا ارگومان یونیکد میگیره که عنوان اون دو تا کادره. مثال:
first_name, last_name = appuifw.multi_query(u"Enter first name", u"Enter last name")
همچنین مدول globalui یه تابع داره به اسم: globalui.global_msg_query() که یه پیغام رو برای مدت محدودی (مثلا 5 ثانیه) نشون میده و کاربر میتونه اونه تایید کنه یا کنسل کنه. این تابع سه تا ارگومان میگیره. آرگومان اول پیغامیه که نشون میده، آرگومان دوم عنوان اون پیغامه (فکر نمیکنم لازم باشه باز تاکید بر یونیکد بودن این دو آرگومان بکنم) و آرگومان سوم که اختیاریه و از نوع عدده، مقدار زمانی که میخوای پیغام رو صفحه بمونه به ثانیه: مثال:
globalui.global_msg_query(u"File transfer will begin in 5 seconds", u"Confirm operation", 5)

میخواستم تو این پست این مبحث رو تموم کنم ولی نمی دونم چرا زود خسته شدم. در ضمن عدم استقبال از مطالبی که میذارم هم مزید بر علت شده تا نتونم طولانی تر بنویسم.
پس تا بعد...
در پناه حضرت حق

----------


## ASedJavad

*ورودی و خروجی – بخش سوم*

  سلام


  فرض کنیم شما میخواین که کاربر از بین چندتا گزینه مشخص یکی رو انتخاب کنه مثلا جنسیت که یا باید زن باشه یا مرد. برای اینکار اول یه متغیر از نوع لیست درست میکنید که اعضای اون عبارتند از گزینه های مورد نظر شما به یونیکد.
  حالا با استفاده از تابع appuifw.popup_menu() میتونید این لیست رو نمایش بدید. این تابع دو تا ارگومان ورودی داره که اولیش همون لیست شماست و دومیش عنوانیه که میخواین بالای گزینه ها برای کاربر نمایش داده بشه. خروجی تابع هم اندیس عضو انتخاب شده است. مثال:
colours = [u"Red", u"Green", u"Blue"]
  colour = appuifw.popup_menu(colours, u"Pick a colour")


علاوه بر این کار راه بهتری هم وجود داره و اون استفاده از تابع appuifw.selection_list هست که دوتا آرگومان ورودی داره. اولی لیست گزینه هاست و دومی (اختیاری) یا صفره یا یک که اگه یک باشه کاربر میتونه با تایپ حروفی از نام اون گزینه، بین گزینه ها سرچ کنه. خروجی این تابع هم مثل خروجی تابع قبله.
  ممکنه شما بخواین کاربر بتونه همزمان چند تا از گزینه ها رو با هم انتخاب کنه. برای اینکار شما باید از تابع appuifw.multi_selection_list استفاده کنید که سه تا آرگومان میگیره. اولیش لیست گزینه هاست، دومیش که اختیاری هست نوع لیستتون هست که از نوع متنی بوده و یکی از گزینه های "checkbox"  و "checkmark" میتونه باشه. آرگومان سوم هم مثل آرگومان دوم تابع قبله و میتونه صفر یا یک باشه.
  خروجی این تابع یک tuple بوده که شامل اندیس گزینه های انتخاب شده از لیست گزینه هاست. مثال:
entries = [u"Carrots", u"Potatoes", u"Onions", u"Tomatoes"]
  selected = appuifw.multi_selection_list(entries, "checkbox",1)
   

حالا فرض کنید میخواین از کاربر مشخصات سجلیشو بگیرید مثلا نیاز به دریافت دو تا رشته دارید به عنوان نام و نام خانوادگی، نیاز به یه لیست انتخابی دارید به عنوان جنیسیت، نیاز به دریافت یه عدد دارید به عنوان شماره ملی و ... یه راه اینه که دونه دونه بر ا کاربر پیغام های مختلف نشون بدید و دونه دونه اطلاعات رو ازش بگیرید، یه راه دیگه هم اینه که کل متغیرها رو تو یه فرم جاسازی کنید و همه رو یجا از کاربر بگیرید. برای این کار اول باید یه لیست بسازید که هر عضو اون بیانگر یکی از اطلاعاتیه که میخواین از کاربر بگیره. خب اما هر عضو این لیستتون خودش باید یک tuple دو یا سه عضوی باشه که عضو اول عنوان (برچسب) متغیریه که میخواین از کاربر بگیرین، عضو دوم نوع اون متغیره که یکی از عبارات
 'text'،  'number'،  'float'،  'date'،  'time' و 'combo' هست که با پنج تا مورد اول آشنایی دارید و مورد ششم رو در ادامه توضیح میدم. عضو سوم هم که اختیاریه، مقدار پیشفرض رو بیان میکنه. اما نوع combo برا وقتی بکار میره که بخوایم کاربر از بین چند تا گزینه فقط یکیشو انتخاب کنه (مثل همون جنسیت که گفتم) در این صورت عضو سوم tuple تون دیگه اختیاری نیست و خودش عبارته از یک  tuple دو عضوه که عضو اولش، لیست گزینه های مورد نظر شماست و عضو دومش که اختیاریه اندیس عضویه که که میخواین به طور پیشفرض انتخاب شده باشه. (چه list  تو tupleی شد! :گیج: ) خب حالا وقتی این لیست رو ساختید میتونید از کلاس Form (به بزرگی حرف اول دقت کنید) از مدول  appuifw‌ استفاده کنید. برای این کار اول با استفاده از دستوری مثل x = appuifw.Form() فرم مورد نظرتون رو به متغیر x نسبت بدید. این دستور دو تا ورودی میگیره که اولیش لیست ساخته شده شماست و دومی نوع فرمتونه که یکی از موارد زیر یا مجموع چند تا از اوناست:[/FONT]  appuifw. FFormViewModeOnly [/FONT]که باعث میشه فرمتون فقط خواندنی بشه و کاربر نمیتومه مقادیر اون رو تغییر بدهappuifw.FFormEditModeOnly که کاربر میتونه اطلاعات خواسته شده رو وارد کنهappuifw.FFormAutoLabelEdit که کاربر میتونه عنوان برچسب ها رو هم ویرایش کنهappuifw.FFormAutoFormEdit که کاربر میتونه فرم رو هم ویرایش کنه و فیلدهای مورد نظرش رو به / از فرم اضافه / کم کنهappuifw.FFormDoubleSpaced که هر فیلد رو در دو خط نمایش میده. یک خط برچسب اون و دیگری مقدارش روخب حالا شما میتونید با فراخوانی متد execute از فرمتون، اون رو نمایش بدید. پس از بسته شدن فرمتون، x مثل لیستیه که درون اون مقادیر فرم (عنوان برچسب و مقدار اون) قرار گرفته. مثال:import appuifw
jens = [u"Male", u"Female"]
fields = [(u"first name", 'text', u"ASedJavad"),
            (u"Last name",'text'),
            (u"jensiat", 'combo', (jens, 0)),
            (u"kode melli",'number', 0),
            (u"birth day", 'date', 0)]
 x= appuifw.Form(fields, appuifw.FFormEditModeOnly)
x.execute()
appuifw.note(u'your firstname is: ' + x[0][2])
appuifw.note(your jensiat is:  + jens[x[2][2][1]])    کلاس فر م چند متد داره که اینجا به دوتاشون اشاره میکنم. اولیش متد insert هست که دو تا آرگومان میگیره اولیش یک عدد هست و دومیش یک tuple هست که باعث میشه این tuple‌رو به عنوان فیلد شماره n ام (n مقدار آرگومان اول این متد هست) به فرم اضافه کنه مثال:
x.insert(2, ("your city",'text',u'Mashhad'))
دومین متد، متد pop هست که یک عدد رو به عنوان آرگومان ورودی میگیره (اختیاری) و فیلد n ام رو از فرم حذف میکنه (n همون آرگومان ورودیمونه). اگه این متد هیچ آرگومانی نگیره، آخرین فیلد رو حذف میکنه. مثال:
x.pop(1) 
 *یک نکته جا افتاده از بخش اول آموزش ورودی و خروجی:* تابع appuifw.note علاوه بر دو آرگومان گفته شده ارگومان اختیاری سومی هم میگیرد که از نوع عددی بوده و مقدارش یا صفره یا یک. اگه صفر باشه، پیغام رو فقط تو محیط برنامه میشه دید ولی اگه یک باشه حتی اگه برنامه تو بکگراند اجرا بشه، پیغام نشون داده میشه. تا مبحث بعدی در پناه حق...

----------


## ASedJavad

سلام

*مکالمات تلفني - بخش اول*

اصلي ترين کار تلفن همراه، برقراي تماس تلفني و نيز جواب دادن به مکالماته. و pys60 يک مدول رو به اين کار اختصاص داده به اسم telephone
اين مدول شش تا تابع داره که در ادامه باهاشون آشنا ميشيم:
telephone.dial() که يک رشته يونيکد رو به عنوان ورودي ميگيره که شامل شماره ايه که ميخوايد باهاش تماس بگيريد. بدیهیه که کار این تابع تماس با شماره ایه که به عنوان ورودی میگیره. مثال:
import telephone
telephone.dial(u'09355555555')
يا
telephone.dial(u"+989355555555")
تذکر: حتما بايد آرگومان ورودي اين تابع، اعداد انگليسي باشن و الا ارور ميده. براي تبديل اعداد فارسي به انگليسي ميتونيد از تابع زير استفاده کنيد:
def numFa2En(x):
 for i in range(1776,1785):
  a=x.replace(unichr(i),unichr(i-1728))
 return a


telephone.hang_up() اين تابع هيچ آرگومان ورودي اي نميگيره و کارش اينه که تماسي که با تابع telephone.dial گرفته شده رو قطع کنه.
تذکر 1: ظاهرا اين تابع فقط وقتي کار ميکنه که شخص مقابل (اون ور خط) هنوز به تماس شما پاسخ نداده باشه.
تذکر 2: اين تابع فقط مکالماتي رو ميتونه قطع کنه که توسط تابع dial پايتون برقرار شده باشند. يعني چنانچه شما به صورت دستي تماس برقرار کنيد و بخوايد با اين تابع اون رو قطع کنيد، ارور ميده.
تذکر 3: فرض کنيد شما با تابع dial يک تماس برقرار کرديد و به هر دليلي اين تماس قطع ميشه يا شما به صورت دستي اونو قطع ميکنيد. براي اينکه بتونيد دوباره با تابع dial تماس برقرار کنيد،بايد ابتدا تابع hang_up رو فرا بخونيد.
نتيجه تذکرات يک و دو: ميتونيد براي راحتي کار توابع dial و hang_up رو به صورت زير اصلاح کنيد:
def hangUp():
 try:
  telephone.hang_up()
 except RuntimeError:
 pass

def Dial(x):
 hangUp()
 telephone.dial(x)


خب به اين ترتيب با درج اين کد در برنامتون بجاي استفاده از دو تابع hang_up و dial ميتونيد از توابع hangUp و Dial استفاده کنيد.

تا بعد ...
در پناه حضرت حق

----------


## ASedJavad

سلام

*چند تابع مفيد:*

1- براي ايجاد وقفه در اجراي *خط به خط* برنامه ميتونيد از تابع  e32.ao_sleep() از مدول e32 استفاده کنيد که يک آرگومان ورودي از نوع اعشاري ميگيره که برابر با ميزان وقفه مورد نظر شما به ثانيه است.
اين تابع تا حدود زيادي مشابه با تابع time.sleep() از مدول time هست. مثال (چاپ اعداد 1 تا 3 با فاصله 1.5 ثانيه از يکديگر):
import e32, time
print 1
e32.ao_sleep(1.5)
print 2
time.sleep(1.5)
print 3
تذکر: اين توابع فقط در اجراي خط به خط وقفه ايجاد ميکنند و تاثيري تو توابع .... (نميدونم پايتون کارا چي بهش ميگن ولي به قول vb کارا روال هاي رويداد ) ندارن.

2- جهت بردن پايتون به وضعيت انتظار بايد از کد زير استفاده کنيد (مثل مواقعي که ميخواين برنامه اين قدر منتظر بمونه تا کاربر يه کليد رو بزنه يا براي کار با منو ها و ...)
import e32
a=e32.Ao_lock()
a.wait()

3- براي اتمام برنامه (و حتي خروج از اسکريپت شل پايتون) بايد از کد زير استفاده کنيد:
import e32
a=e32.Ao_lock()
a.signal()

4- تابع help() که اگه آرگومان وروديش نام يک مدول يا ... باشه، توضيحاتي رو در مورد اون (مثل ليست کلاسهاش، ليست توابعش و ليست ثوابتش و...) به شما ميده
فقط از اون جايي که صفحه اسکريپت شل پايتون محدوده، ممکنه بخش ابتدايي اين راهنمايي رو نتونيد بخونيد که براي حل اين مشکل ميتونيد فايلي رو که براتون ضميمه کردم از حالت فشرده خارج کنيد و فايل Help.py رو به مسير c:\resource\python25 تو گوشي منتقل کنيد (براي اين کار بايد گوشيتون هک شده باشه) حالا ميتونيد با استفاده از تابع Help.help2file() اون راهنمايي ها رو تو يه فايل متني ذخيره کنيد. اين تابع دو تا آرگومان ورودي ميگيره. اوليش نام مدول يا ... هست (اول بايد خود اون مدول ايمپورت شده باشه) و دوميش مسير و نام فايل ذخيره شونده است که اختياري بوده و به طور پيش فرض  'e:\help.txt' هست. مثال:
import Help,telephone
Help.help2file(telephone,'c:\1.txt')

تا بعد
در پناه حضرت حق

----------


## ASedJavad

یه تذکر :

غالب مطالبی که اینجا میذارم، بر اساس تجربیات شخصیمه و اونا رو فقط روی گوشی خودم تست کردم
در نتیجه ممکنه روی گوشیهای دیگه یه خورده تفاوت داشته باشه!

----------


## ASedJavad

سلام

*مديريت مکالمات تلفني - بخش دوم*

باتوجه به عدم استقبال از اين آموزش، قصد نداشتم ديگه ادامه بدم، ولي بعد با خودم گفتم اين قسمت (مدول telephone) رو هم تموم کنم، بعد با اين آموزش ها خداحافظي کنم.


خب؛ تو آموزش قبل گفتم که مدول telephon شش تا تابع داره که دو به دو با هم ارتباط تنگاتنگ دارن؛ و دو تا از اين توابع که براي برقراري تماس و قطع تماس برقرار شده بکار ميرفتن رو معرفي کردم.

اما يکي ديگه از کاربرد هاي مهم تلفن، پاسخ دادن به تماس هاي وروديه!
براي اين کار در اين مدول يه تابع به وجود داره با نام telephone.answer() که هيچ آرگوماني دريافت نميکنه و به محض فراخواني شدن، موجب پاسخ دادن به تماس ورودي ميشه.
البته قبل از اينکه اين تابع رو فراخواني کنيد، بايد به پايتون بگيد که بايد منتظر يک تماس ورودي باشه.
براي اين کار بايد از تابع incoming_call() استفاده کرد که هيچ آرگوماني دريافت نميکنه.
نحوه استفاده از اين دو تابع رو ميتونيد در مثال پاياني اين بخش ببينيد.

تذکر1 : فقط کافيه در هنگام شروع برنامه يک بار تابع telephone.incoming_call رو فراخوني کنيد. بعد از اون، هر چند بار که خواستيد مي تونيد از تابع thlephone.answer استفاده کنيد.
يعني اينکه براي چند بار جواب دادن به تماس هاي ورودي يک بار فراخواني تابع incomin_call کافيه.

تذکر2 : بعد از اينکه تماس ورودي برقرار شد (يعني بعد از اينکه گوشي شما شروع به زنگ زدن کرد) حتما بايد يه وقفه اي ايجاد بشه (ولو در حد يک صدم ثانيه) بعد تابع answer فراخوانده بشه. يعني اگه شما برنامه اي بنويسيد که به محض زنگ خوردن به تماس ورودي جواب بده، احتمالا برنامتون درست کار نکنه.
اين مطلب رو هم در مثال پاياني ميتونيد ببينيد.


خب؛ اما تابع پنجم که باعث ميشه نوشتن برنامه هاي مديريت تماس و ... با پايتون جذاب بشه، تابعيه تحت عنوان telephone.call_state.
(يخورده توضيح دادن اين تابع برام مشکله ولي اميدوارم که بتونم بخوبي از پسش بر بيام. البته با مراجعه به مثال پاياني ميتونيد به خوبي کارشو درک کنيد)
اين تابع يه آرگومان ورودي ميگيره که اين آرگومان نام تابعيه که قبل تر تعريف شده و خودش شامل يک ارگومان وروديه.
فرض کنيد شما تابع a1 رو با آرگومان ورودي x در ابتداي برنامتون به شکل زير تعريف کرديد:
def a1(x):
   ...
   ...
خب حالا مياين تابعي رو که گفتم به شکل زير فراخوني ميکنيد:
telephone.call_state(a1)
تا اينجا که مشکلي نيست؟!
اما کار اين تابع چيه؟
اين تابع منتظر ميشينه، هر تغيير وضعيتي تو خط تلفن (نميدونم تعبير بجاييه يا نه!) روي بده، تابع a1‌ رو فراخوني ميکنه.
مثلا فرض کنيد ميخواين يه شماره بگيرين: اول خط آزاده، بعد مشغول شماره گيري ميشه، بعد اتصال برقرار ميشه، بعد تلفن جواب داده ميشه، بعد اتصال قطع ميشه و در پايان مجددا خط آزاد ميشه.
يعني پنج تا تغيير وضعيت داريم پس تابع  a1‌ پنج بار فراخونده ميشه.

اما گفتيم که خود تابع a1‌ بايد يه آرگومان ورودي داشته باشه. اين آرگومان يه ليست دو عضويه که عضو اولش بيانگر وضعيت جديده و برابر با يکي از ثابت هاي زيره:
(تذکر: اين ثابت ها به ترتيب از اول تا پايين برابرند با اعداد صفر تا يازده)

telephone.EStatusUnknown وضعيت ناشناخته (يعني هيچ کدوم از وضعيت هاي ديگه نيست)

telephone.EStatusIdle خط آزاد شده. اين وضعيت پاياني ترين وضعيت پس از يک تماسه (چه خروجي و چه ورودي)

telephone.EStatusDialling تلفن در حال شماره گيريه. اين اولين وضعيت در هنگام زنگ زدن به ديگران است. (تماس خروجي)

telephone.EStatusRinging تلفن داره زنگ ميخوره. اين اولين وضعيت در تماس وروديه.

telephone.EStatusAnswering به تماس ورودي، جواب داده شد.

telephone.EStatusConnecting تلفن طرف مقابل شروع به زنگ خوردن کرد. (فقط در تماس هاي خروجي)

telephone.EStatusConnected ارتباط دو طرفه برقرار گرديد. اين وضعيت در تماس خروجي  هنگامي رخ ميده که طرف اون ور خط به تماس شما جواب بده؛ و در تماس ورودي بعد از telephone.EStatusAnswering اتفاق ميفته.

telephone.EStatusReconnectPending نميدونم کي اتفاق ميفته!

telephone.EStatusDisconnecting ارتباط قطع شد.

telephone.EStatusHold رفتن ارتباط به حالت انتظار

telephone.EStatusTransferring نميدونم کي اتفاق ميفته! (	the current call is being transferred)

telephone.EStatusTransferAlerting نميدونم کي اتفاق ميفته! (The remote phone is being alerted to the call being transferred )

اما عضو دوم اين آرگومانِ از نوع ليست، يک رشته است که فقط در هنگامي که وضعيت، telephone.EStatusRinging هست، شماره تلفن ورودي رو در خودش نگه ميداره.

(اميدوارم تونسته باشم اين تابع رو خوب توضيح داده باشم)

آخرين تابع مدول تلفن، تابع telephone.cancel() هست که هيچ ارگوماني نميگيره.
تابع telephone.call_state با يه بار فراخوني، براي تمامي تغيير وضعيت ها، تابعي رو که به هنوان آرگومان دريافت ميکنه، فرا ميخونه تا وقتي که شما تابع telephone.cancel رو فرا بخونيد.

*مشق شب:*
دو تا تمرين ميدم به عنوان مشق شب. که برا خودتون حل کنيد و اجرا کنيد.

1- تک زني: برنامه اي بنويسيد که يه شماره رو از کاربر دريافت کنه و پنج بار بهش تک زنگ بزنه.
راهنمايي: هنگامي که وضعيت telephone.EStatusConnecting شد بايد بلافاصله تماس قطع بشه.

2- تک گيري: برنامه اي بنويسيد که تک زنگ طرف مقابل رو بگيره (تلاش طرف مقابل رو براي missed call‌ به شما با شکست روبرو کنه.)

بعنوان يه مثالِ کلي از مدول telephone، تمرين دوم رو خودم براتون حل کردم:

import telephone, e32, appuifw
def newphonestate (stateInformation):
	newState = stateInformation[0]
	if newState == telephone.EStatusRinging:
		e32.ao_sleep(.01)
		telephone.answer()
		print u"\n شما يه تماس داريد از  %s\n" % stateInformation[1]
telephone.incoming_call()
telephone.call_state(newphonestate)

----------


## shahabby

اقا خداییش خیلی عالی بود پس چی شد ما بی صبرانه منتظریم متاسفانه منابع اینگلیسی و سخت میشه فهمید در ضمن دوست عزیز میشه اینجا مثالی و بزنی که یک شماره و بگیره و در صورت اشغال بودن مجددا بگیره تا وقتی که  گوشی برداشت یک   ارلامی بده ممنون

----------


## ASedJavad

> پس چی شد ما بی صبرانه منتظریم 
> میشه اینجا مثالی و بزنی که یک شماره و بگیره و در صورت اشغال بودن مجددا بگیره تا وقتی که  گوشی برداشت یک الارمی بده


سلام
راستش استقبال نشد؛ من هم دیگه بی خیال بقیش شدم. البته سیمبین هم دیگه دورش سر اومده!
در مورد مثالی هم که خواستین، یکی از مشکلاتی که پایتون داره (شاید هم قلقی داره که من نمیدونم) اینه که وقتی اون خانمه میگه "شماره مشغوله" نمیشه تماس رو قطع کرد و باید تا ته پیغام اون خانمه رو گوش کرد!
شما میتونید از نرم افزارهای دیگه استفاده کنید مثل:
تکرار شماره گیری سریع،زمانی که خط مشغول است Quick Redial. Version 0.1.3
و
اضافه کردن ردیال پیشرفته به گوشی i2tecnologia Call Drop Advisor (CDA) v1.00 S50v5

فقط به نظرم آلارم نمیدن که اون رو هم میشه با پایتون جبران کرد!

----------


## shahabby

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

----------


## manam.manam

سلام  پای سیمبین برای s60 v2 سراغ نداری

----------


## ASedJavad

سلام
معذرت که یخورده جوابت دیر شد. کاش پیام خصوصی میدادی!
برا s60v2 پایتون ورژن 2 نیومده ولی ورژن 1.4.5ش رو میتونی از جاهای مختلف دانلود کنی. مثل:

http://forum.mobilestan.net/showthread.php?t=76115

----------


## raminpaya07

سلام دوستان ، چنتا سؤال درباره پایتون سیمبین داشتم کسی میتونه راهنماییم کنه؟!لطفا بیاد خصوصی ممنون

----------


## ali1999

سلام دوست عزیز
چطور می توانم شبیه ساز سیمبین رو روی کامپیوتر اجرا کنم چون یه فایل .sis دارم و با برنامه IDA به سورس کدهاش دسترسی پیدا کردم و حالا میخوام اون برنامه رو به فایل نصبی .exe برای نصب در کامپیوتر و یا اجرا با همین شبیه ساز در داخل کامپیوترم اون بازی رو اجرا کنم، اگه راهنماییم کنید ممنون میشوم.
مطالب شما بسیار مفید است. :تشویق: 
اگه ممکنه برای کسانی که علاقه به بازی های نوشته شده به زبان سیمبین دارند و چون اون سیستم عامل سیمبین دیگه در اختیار ندارند و میخواند اون بازی رو در کامپیوتر اجرا کنند، لطفا این تدریس رو ادامه بدین.
باتشکر

----------

