English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

تحقيق محول بسيط باستخدام Tkinter (python3.6)

المقدمة

بدأت الدروس العملي، نعم، جاء المعلم وقرأ بعض النقاط من شرائح العرض، ثم قال: ابدأ بالعمل......

ثم بدأت في طريق Python GUI، لم أكن قد تعرضت لاجهزة التدفق البصري لـ Python من قبل (على الرغم من أن هذا ليس صحيحًا)

لكن الآن، يبدو أن كتابة الأدوات الصغيرة سهلة جدًا، والذي بحثت عنه أولاً كان Tkinter لذا بدأت في الكتابة

لكن لاحقًا وجدت أن Qt رائعًا جدًا، لذا سأستخدم QT في التجربة القادمة. ثم عن Tkinter (python3.6)

كود الحاسبة ennn..... بعض الأسماء غير موحدة...

أولاً، يتم تحقيق مكتبة Stack في Python بشكل أساسي باستخدام list

pop() إزالة العنصر الأعلى، append() إضافة العنصر إلى أسفل

دعنا أولاً نلقي نظرة على المكونات الصغيرة الأساسية التي يقدمها Tkinter:

مكونات صغيرة الوصف
Button أزرار
Canvas الرسوم البيانية المنظمة، تستخدم لرسم الرسوم، إنشاء محرر رسومي وتحقيق مكونات صغيرة مخصصة
Checkbutton انقر على زر المربع المربع لتبديل القيم بينها
Entry حقل النص أو ما يُدعى به مربع النص
Frame المكونات (يمكن أن تحتوي على مكونات صغيرة أخرى)
Label عرض النصوص أو الصور
Menu عرض القائمة المنسدلة والقائمة المنبثقة في شريط القائمة
Menubutton أزرار القائمة في القائمة المنسدلة
Message مثل العلامة في عرض النص، لكنه يمكنه وضع النص تلقائيًا داخل عرض معين
Radiobutton أزرار اختيار
Text عرض النصوص الم格式ة، يدعم إدراج الصور والنصوص، ويسمح بعرض وتحرير النصوص باستخدام أنماط وخصائص مختلفة

بدء إنشاء نافذة

أول ما يخطر ببالنا عند إنشاء شيء مرئي هو النافذة بالتأكيد

النافذة تحتوي على العديد من المكونات، مثل عنوان، أيقونة، حجم، الحدود، القائمة وما إلى ذلك.

import tkinter
import os
from tkinter import *
class Calculator(object):
 """الحاسبة"""
 def __init__(self):
 self.tk=tkinter.Tk() # إنشاء
 self.tk.title('الحاسبة')
 self.tk.minsize(370,460)
 self.tk.maxsize(400,400)
 # يمكن أيضًا استخدام self.tk.resizable(0, 0) لمنع التوسع
 self.tk.iconbitmap(os.getcwd()+'/favicon.ico')
 def start(self):
 self.tk.mainloop() 
if __name__ == '__main__':
 NewCalculator=Calculator()
 NewCalculator.start()

هنا تم إنشاء نافذة أساسية، ولهذا الدور mainloop()

إذا قمنا بتعطيله، فإن النافذة ستختفي بسرعة، إنه لمنع هذه الحالة

# عرض اللوحة

بعد إتمام عمل الحاسبة يجب أن يكون أول شيء عرض النتيجة، هنا نحتاج إلى إنشاء لوحة عرض

بالطبع سنفكر أيضًا في إعداد خط عرض المحتوى، والأمثلة المحددة في الكود أدناه

....
import tkinter.font as tkfont
....
 # إعداد الخط
 self.EntryFont=tkfont.Font(self.tk,size=13)
 self.ButtonFont=tkfont.Font(self.tk,size=12)
 # عرض اللوحة
 self.count=tkinter.StringVar()
 self.count.set('0')
 self.label=tkinter.Label(self.tk,bg='#EEE9E9',bd='3',fg='black',anchor='center',font=self.EntryFont,textvariable=self.count)
 self.label.place(y=10,width=380,height=40)
....

في tkinter لوحة العلامة هناك بعض المعلمات، هنا ما تستخدمه أساسًا يمكن أن ي��ح الحاجة العادية

فيها bg لون الخلفية، fg لون الأمام، تغيير لون النص، anchor تحديد موقع النص في اللوحة، كما في الشكل التالي

اتجاه مثال جداول
nw n ne
w center e
sw s se

بالنسبة للوحة والزر في النهاية، يمكن استخدام العديد من الطرق،place يمكن تحديد الموقع بدقة،أو يمكن استخدام pack(),grid()

place هو أفضل خيار للمدخل العددي، حيث يمكن تحديد موقع كل عنصر دقيقًا

يمكن أيضًا تعيين الخط مباشرة في Lable() بـ parameters،مثل font=("Arial,6")

textvariable يساوي "المراقبة"،التي يتم ربطها بـ string في tkinter،يمكن تغيير محتوى اللوحة بسهولة باستخدام طريقة set()

إعداد الزر،إعداد المدخل

الزر،parameters المدخل في الإدخال مشابهة

self.NumButton=tkinter.Button(master=self.tk,relief=GROOVE,bg='#EE6A50',text=self.ButtonList[0],
 font=self.ButtonFont,command=self.clear)
self.NumButton.place(x=30,y=80,width=70,height=55)
self.shiEntry=Entry(self.baoxianTk,validate='key',validatecommand=(self.checkNum,'%P'),font=self.EntryFont)
self.shiEntry.place(x=190,y=80)

المشترك بينهما هو إعداد النمط الأساسي باستخدام parameters مثل bg، ولكن هنا يتم ربط الحدث بـ command، يشبه .click في JQ

في هذا السياق، يتم استخدام place أيضًا لتحديد الموقع بشكل دقيق، حيث يمثل relief نمط Button

relief=FLAT أو GROOVE أو RAISED أو RIDGE أو SOLID أو SUNKEN

من بينها حذف محتوى المدخل في الإدخال

text.delete(10) #حذف القيمة من الرقم 10
text.delete(10, 20) #حذف القيم من الرقم 10 إلى 20
text.insert(0, END) #حذف جميع القيم

قيود الإدخال

عند تصميم الوظائف، قد نحتاج إلى إدخال أرقام من قبل المستخدم، هنا يمكننا تقديم بعض القيود

في Parameter Button، يتم تحديد وقت تنفيذ function الم绑定 إلى validatecommand باستخدام %P للحصول على محتوى الإدخال في الوقت الحقيقي

عندما يتم تحديد خيار validate كـkey، يتم تمرير جميع العمليات المدخلة إلى Entry، في هذه الحالة يتم إدخال الطاقة البيضاء فقط

self.checkNum=self.baoxianTk.register(self.validateNum)
self.gerenEntry=Entry(self.baoxianTk,validate='key',validatecommand=(self.checkNum,'%P'),font=self.EntryFont)
self.gerenEntry.place(x=190,y=190)
#تحقق من أن النص هو رقم 
def validateNum(self,content):
 if content.isdigit() and int(content)>=0 or content=="":
 return True
 else:
 return False

يمكن تعديل دالة validateNum() وفقًا للاحتياجات الخاصة بك

يمكن تعيين القيم التالية لخيار validate لـ validate选项

اسم حدث
focus تحقق عند الحصول أو فقدان Entry عنصر التركيز
focusin تحقق عند الحصول على Entry عنصر التركيز
focusout تحقق عند فقدان Entry عنصر التركيز
key تحقق عند تعديل حقل الإدخال
all تحقق من أي من هذه الحالات عند حدوثها

تصميم الرموز الموسعة

أ增加了%,/،sqrt هذه الرموز في هذا الحاسبة الصغير

لتحقيق ذلك، أفكر في إضافة فحص قبل إضافة النص إلى لوحة المفاتيح

إذا كانت هذه العلامات الثلاثة، فتقوم بمعالجة المطلوبة

لاحظ أن يجب التحقق من أن الرقم متعدد الأرقام أو يحتوي على معادلة تحتوي على علامات

لا يمكن القيام بالتحويل مباشرة، بل يجب التحقق من عدد أرقام الرقم الذي تريد التحويل، طريقتي الخاصة كالتالي

 def checkList(self):
 result=0
 locate=-1
 listSum=0
 for length in range(0,len(self.inputlist)):
 if re.findall(r'[-+*/]',str(self.inputlist[length])):
 result=1
 if length>locate:
  locate=length
 else:
 pass
 if result==1:
 for i in range(locate+1,len(self.inputlist)):
 listSum+=int(self.inputlist[i])*(10**(len(self.inputlist)-i-1))
 else:
 for j in range(0,len(self.inputlist)):
 listSum+=int(self.inputlist[j])*(10**(len(self.inputlist)-j-1))
 return listSum,locate
 #إضافة button
 def addButton(self,button):
 if button==self.ButtonList[18]:
 listSum,locate=self.checkList()
 if locate==-1:
 self.inputlist=[str(round(eval('1/'+str(listSum)),5))]
 else:
 for k in range(locate+1,len(self.inputlist)):
  del self.inputlist[k]
 self.inputlist.append(str(round(eval('1/'+str(listSum)),5)))
 elif button==self.ButtonList[19]:
 pass
 elif button==self.ButtonList[20]:
 pass
 else:
 self.inputlist.append(button)
 self.count.set(self.inputlist)

عن lambda

موسوعة بaidu: Lambda هي نوع خاص من تعريف الدوال في Python، يمكن استخدامها لتحديد دالة مجهولة

مختلف عن اللغات الأخرى، يمكن أن يكون جسم دالة Lambda في Python دالة واحدة فقط، وهي جملة تعبير عن العودة

بعد البحث عن المزيد من المقالات وفهم المزيد، يمكن القول إن Lambda هي دالة تعمل كـ “call back” للزر

إذا لم نستخدم Lambda للإرجاء في إعادة تفعيل الدالة، سيتم تنفيذ الدالة المربوطة في command عند إنشاء الزر

الفرق بين الكودين التاليين، الثاني يفعل دائمًا وظيفة knobDown عند إنشاءه

self.NumButton=tkinter.Button(master=self.tk,relief=GROOVE,bg='#BFEFFF',text=self.ButtonList[20], font=self.ButtonFont,command=lambda:self.knobDown(self.ButtonList[20]))
self.NumButton=tkinter.Button(master=self.tk,relief=GROOVE,bg='#BFEFFF',text=self.ButtonList[20], font=self.ButtonFont,command=self.knobDown(self.ButtonList[20]))

للمزيد من التوضيح، يمكنك مراجعة المقالات الأخيرة في النهاية، كتب الأجداد

عن مربع الاختيار

كنت أريد تنفيذ التطبيق المقدم في PPT - توسيع حسابات القرض، ولكن تم تعطيل هذا المربع الاختياري بسبب مشكلة الأخطاء

الامثلة التالية مستخرجة من الإنترنت، ونسيت عنوان الموقع

هذا من خلال binding variable IntVar()، يمكن الحصول على قيمة value من Radiobutton باستخدام طريقة .get()

#!/usr/bin/env python
import tkinter
from tkinter import *
import tkinter.font as tkfont
root=tkinter.Tk()
val=tkinter.IntVar()
val.set(0)
def func1():
 if val.get() == 0:
 label.configure(text='radio 0')
 else:
 label.configure(text='radio 1')
label = tkinter.Label(root, text='radio 0')
label.pack()
r0 = tkinter.Radiobutton(text = 'radio0', variable = val, value = 0)
r0.pack()
r1 = tkinter.Radiobutton(text = 'radio1', variable = val, value = 1)
r1.pack()
b = tkinter.Button(root, text='button', command=func1)
b.pack()
root.mainloop()


الباقة

C:\Users\bayi\Desktop\shiyan\progrem
(venv) λ pip install pyinstaller
C:\Users\bayi\Desktop\shiyan\progrem
(venv) λ pyinstaller -F -w -i favicon.ico run.py

في البداية، بسبب إعداد الico الرمز في السطر الأول من الكود

يوجد مشكلة في التعرف على مسار الت打包 في نظام Windows، قم بتحويل الرمز إلى مكان قصير

قم بتعديل المسار إلى مسار مطلق لجعله يعمل (السطر الثاني في الكود أدناه، يجب أن تكون exe وico في نفس الدليل)

self.baoxianTk.icobitmap('favicon.ico')
self.baoxianTk.iconbitmap(os.getcwd()+'/favicon.ico')

معاينة التأثير

على الرغم من أنني تعلمت على الفور واستفدت من المعرفة القديمة للآخرين، إلا أنني شعرت بالإنجاز بعد النجاح (وقد أكون متقيدًا بشكل كبير في متطلبات التصميم الجمالي......

اختيار الألوان والأنماط قد يستغرق وقتًا طويلاً، بما في ذلك واجهة المستخدم الأمامية للبرمجيات الذكية السابقة

الخلاصة

هذا هو محتوى المقال الكامل، نأمل أن يكون محتوى هذا المقال له قيمة مرجعية تعليمية أو مهنية بالنسبة إليكم، إذا كان لديكم أي أسئلة، يمكنكم ترك تعليقات للتفاعل، شكرًا لدعمكم لتعليمات النداء.

بيان: محتوى هذا المقال تم جمعه من الإنترنت، ويتمتع صاحب الحقوق بالملكية، ويتم جمع المحتوى من قبل المستخدمين عبر الإنترنت بطرقهم الخاصة، ولا يمتلك هذا الموقع حقوق الملكية، ولا يتم تعديل المحتوى بشكل يدوي، ولا يتحمل هذا الموقع أي مسؤولية قانونية. إذا اكتشفت محتوى يشتبه في حقوق النسخ، فمرحبًا بمراسلتنا عبر البريد الإلكتروني: notice#oldtoolbag.com (يرجى استبدال #بـ @ عند إرسال البريد الإلكتروني) للإبلاغ، وقدم الدليل على الأدلة، وإذا تم التحقق من ذلك، سيتم حذف المحتوى المزعوم فورًا.

الشئ الذي قد يثير إعجابك