ساخت سریع UI در پایتون | به زبان ساده
بزرگترین مزیت پایتون، سهولت استفاده و فراوانی کتابخانهها برای همه کارها است. بدین ترتیب با نوشتن چند خط کد همه کاری میتوان انجام داد. تا زمانی که اسکریپتهای پایتون را برای استفاده شخصی مینویسید یا مخاطبان هدف شما به قدر کافی فنی هستند، نیاز نیست در مورد «رابط کاربری» (User Interface) یا به اختصار UI نگران باشید. اما برخی اوقات مخاطبان ما اطلاعات فنی چندانی ندارند. آنها به استفاده از اسکریپتهای پایتون تا زمانی علاقه دارند که مجبور نباشند به یک خط کد نگاه کنند. در این موارد ارائه اسکریپتهای خط فرمان کار مفیدی محسوب نمیشود و باید یک UI برای آنها تدارک ببینیم. با این که برخی از افراد از کلاینتهای دسکتاپ به جای UI مبتنی بر وب استفاده میکنند، اما ما در این مقاله روی ساخت سریع UI در پایتون تمرکز خواهیم داشت.
کتابخانههای پایتون برای ساخت UI
اساساً 3 کتابخانه بزرگ UI برای پایتون وجود دارند که Tkinter ،wxPython و PyQT نام دارند. ما در این مقاله هر سه این کتابخانهها را بررسی میکنیم، اما چیزی که به دنبالش هستیم در هیچ کدام از این کتابخانهها نیست. کتابخانههای پایتون به طور کلی یک روش مناسب برای جداسازی بخش کاملاً فنی برنامههای محسوب میشوند. با این حال اغلب تمرکز ما در این مقاله روی گزینه چهارم یعنی کتابخانه PySimpleGUI است. این کتابخانه از هر 3 کتابخانه فوق استفاده میکند، اما بخشهای فنی آنها را از دید ما دور نگاه میدارد. بدون هیچ گونه توضیح اضافی به بررسی این کتابخانه میپردازیم و یک مسئله واقعی را نیز همزمان حل خواهیم کرد.
بررسی یکسان بودن دو فایل
فرض کنید پروژهای داریم که در آن میخواهیم دادهها را در پایتون با هم مقایسه کنیم. بدین منظور باید دو فایل را بارگذاری کنیم و سپس رمزگذاری مناسب برای استفاده در مقایسه فایل را انتخاب کنیم.
کدنویسی UI
برای ساخت UI میتوانیم از کد زیر استفاده کنیم:
1import PySimpleGUI as sg
2layout = [
3 [sg.Text('File 1'), sg.InputText(), sg.FileBrowse(),
4 sg.Checkbox('MD5'), sg.Checkbox('SHA1')
5 ],
6 [sg.Text('File 2'), sg.InputText(), sg.FileBrowse(),
7 sg.Checkbox('SHA256')
8 ],
9 [sg.Output(size=(88, 20))],
10 [sg.Submit(), sg.Cancel()]
11]
12window = sg.Window('File Compare', layout)
13while True: # The Event Loop
14 event, values = window.read()
15 # print(event, values) #debug
16 if event in (None, 'Exit', 'Cancel'):
17 break
که نتیجه زیر را تولید میکند:
بررسی منطق برنامه
اینک که UI آماده است به راحتی میتوانیم بقیه کد را نیز متصل کنیم. کافی است ورودیهای کاربر را مورد رصد قرار دهیم و سپس بر همین اساس عمل کنیم. این کار به سادگی با استفاده از کد زیر ممکن است:
1import PySimpleGUI as sg
2import re
3import hashlib
4def hash(fname, algo):
5 if algo == 'MD5':
6 hash = hashlib.md5()
7 elif algo == 'SHA1':
8 hash = hashlib.sha1()
9 elif algo == 'SHA256':
10 hash = hashlib.sha256()
11 with open(fname) as handle: #opening the file one line at a time for memory considerations
12 for line in handle:
13 hash.update(line.encode(encoding = 'utf-8'))
14 return(hash.hexdigest())
15layout = [
16 [sg.Text('File 1'), sg.InputText(), sg.FileBrowse(),
17 sg.Checkbox('MD5'), sg.Checkbox('SHA1')
18 ],
19 [sg.Text('File 2'), sg.InputText(), sg.FileBrowse(),
20 sg.Checkbox('SHA256')
21 ],
22 [sg.Output(size=(88, 20))],
23 [sg.Submit(), sg.Cancel()]
24]
25window = sg.Window('File Compare', layout)
26while True: # The Event Loop
27 event, values = window.read()
28 # print(event, values) #debug
29 if event in (None, 'Exit', 'Cancel'):
30 break
31 if event == 'Submit':
32 file1 = file2 = isitago = None
33 # print(values[0],values[3])
34 if values[0] and values[3]:
35 file1 = re.findall('.+:\/.+\.+.', values[0])
36 file2 = re.findall('.+:\/.+\.+.', values[3])
37 isitago = 1
38 if not file1 and file1 is not None:
39 print('Error: File 1 path not valid.')
40 isitago = 0
41 elif not file2 and file2 is not None:
42 print('Error: File 2 path not valid.')
43 isitago = 0
44 elif values[1] is not True and values[2] is not True and values[4] is not True:
45 print('Error: Choose at least one type of Encryption Algorithm')
46 elif isitago == 1:
47 print('Info: Filepaths correctly defined.')
48 algos = [] #algos to compare
49 if values[1] == True: algos.append('MD5')
50 if values[2] == True: algos.append('SHA1')
51 if values[4] == True: algos.append('SHA256')
52 filepaths = [] #files
53 filepaths.append(values[0])
54 filepaths.append(values[3])
55 print('Info: File Comparison using:', algos)
56 for algo in algos:
57 print(algo, ':')
58 print(filepaths[0], ':', hash(filepaths[0], algo))
59 print(filepaths[1], ':', hash(filepaths[1], algo))
60 if hash(filepaths[0],algo) == hash(filepaths[1],algo):
61 print('Files match for ', algo)
62 else:
63 print('Files do NOT match for ', algo)
64 else:
65 print('Please choose 2 files.')
66window.close()
با اجرای کد فوق، خروجی زیر حاصل میشود:
سخن پایانی
با این که این UI چندان زیبا نیست، اما این کتابخانه به ما امکان میدهد که اقدام به ساخت سریع UI در پایتون بکنیم و آنها را با هر کسی که نیاز دارد به اشتراک بگذاریم. نکته جالبتر این است که کدی که به این منظور نیاز داریم، کاملاً ساده و خوانا است. ما همچنان با مشکل اجرای کد برای رسیدن به UI مواجه خواهیم بود، که بحث اشتراکگذاری را کمی دشوار میسازد، اما میتوانید از چیزی مانند PyInstaller استفاده کنید که اسکریپت پایتون را به یک فایل exe. تبدیل میکند و افراد میتوانند به سادگی با دابل-کلیک اجرا کنند.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای برنامهنویسی پایتون
- آموزش پایتون گرافیکی (رابط های گرافیکی پایتون)
- کتابخانه های گرافیکی پایتون
- مجموعه آموزشهای برنامهنویسی
- توزیع پایتون آناکوندا (Anaconda Python Distribution) — به زبان ساده
- آموزش پایتون (Python) — مجموعه مقالات جامع وبلاگ فرادرس
==
سلام
متوجه کارایی برنامه هستم منتهی سوالی دارم ، اگر ما کارایی برنامه رو طوری تنظیم کنیم که بخوایم از یه فایل اکسل لینک یک سری اطلاعات برداشته شود و بر روی اون لینک ها عملیاتی انجام دهیم روش کار به چه صورت میباشد (طریقه برداشتن لینک از فایل اکسلی که با استفاده از Browse داخل برنامه وارد کردیم)
ممنون میشم راهنمایی کنید
سلام
شما چگونه کاری کردید که وقتی روی browse کلیک کنیم، پنجره ی انتخاب فایل باز شود؟؟
ممنون میشم راهنماییم کنید.
sg.FileBrowse()