Python + Pyside2 أو ببساطة "الحاسبة"

مرحبا يا هبر!

اسمي ساشا. أنا مطور مبتدئ. أنا أعمل اختبار البرمجيات. أكتب بشكل رئيسي الاختبارات باستخدام Python + Selenium ، لكن Python أصبحت مثيرة للاهتمام لدرجة أنني أردت الخوض فيها وتعلم أكبر عدد ممكن من الأطر! أردت أن أكتب تطبيق سطح المكتب ، علاء بسيط "الحاسبة". سقط خياري على Pyside2. لا أدعي أن يكون لدي كود أو درس مثالي. هناك ببساطة رغبة في تبادل الخبرات إذا كان شخص ما ، مثلي ، يريد أن يبدأ في التحسس في بيثون. إذا ساعدت شخص ما ، فقد حققت النتيجة.

لنبدأ!

كتبت الكود في PyBarm IDE من JetBrains. نظام التشغيل - ويندوز.

تثبيت PySide2:

pip install PySide2 

حيث لديك مجلد جذر Python ، انتقل إليه ، ثم إلى المجلد "Lib" -> "حزم الموقع" -> "Pyside2". سيكون لديك برنامج المصمم - هذا هو برنامج QtDesigner ، والذي سيتيح لك إنشاء واجهة خاصة ببرنامجك. تجدر الإشارة إلى أنه عند إنشاء ملفك في دليل مشروعك ، سيكون له تنسيق .ui ، الذي لن يفهمه Python ، لذلك سنحتاج إلى تحويله إلى تنسيق .py ، ولكن هذا لاحقًا.

أولاً ، قم بإنشاء النموذج الخاص بك.

صورة

نحن نصمم لدينا ، ندعو الأزرار الموجودة على اليمين في القسم الفرعي "Object Inspector". تجدر الإشارة إلى أن QtDesigner يدعم ورقة أنماط متتالية ، وإذا كان الأمر أسهل ، فعند العثور على معلمة "styleSheet" في الخصائص ، لديك الفرصة لجعل التصميم الخاص بك يعتمد على معرفة CSS.

صورة

بعد ذلك ، نحتاج إلى تحويل ملف .ui الخاص بنا إلى تنسيق بحيث يفهمه Python. انتقل إلى سطر الأوامر والكتابة

 pyside2-uic "you_file.ui" -o "your_file.py" 

ماذا يفعل الأمر pyside2-uic؟ يحول ملف .ui إلى ملف python .py ويقوم بإنشاء فئة Python منه. ربما يقول الأشخاص ذوو المعرفة أنه يمكن توصيل ملف واجهة المستخدم دون تحويل إلى مشروع ، لكنني سأكون أنيقًا وأحسن أداء ، كما هو مكتوب في أدلة Pyside2.

بعد ذلك ، انتقل إلى الرمز.

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

صورة

لنبدأ بتحرير الملف الذي قمنا بتحويله من .ui إلى .py .

أدناه ، نبحث عن هذا الرمز وقم بنسخه ، ثم احذفه من هذا الملف.

 if __name__ == '__main__': import sys app = QtWidgets.QApplication(sys.argv) Form = QtGui.QWidget() ui = Ui_Form() ui.setupUi(Form) Form.show() sys.exit(app.exec_()) 

نقوم بإنشاء ملفنا الرئيسي ، حيث سيتم كتابة منطق البرنامج. دعوتها ، مثل ، ليس من المستغرب "calc.py" (أعلاه على شاشة الدليل كان مرئيا).

الصق الكود المنسوخ لدينا والبدء في تحريره.

استيراد تميز الكلية سوف نلقي في البداية لأنها قاعدة جيدة الشكل.

نحن نستورد بضع وحدات ضرورية للعمل مع نموذجنا ومن ملفنا "calc_ui.py" نستورد الفئة الرئيسية Ui_MainWindow .

بعد ذلك ، حرر إذا __name__ . نحذف كل ما هو غير مطلوب. يجب أن يكون لديك هذا:

 if __name__ == '__main__': #   QApplication app = QtWidgets.QApplication(sys.argv) #    ,     calc = Calculator() #  sys.exit(app.exec_()) 

لقد علقت على الكود بشكل واضح ونأمل. دعنا ننتقل إلى إنشاء فئة الحاسبة .

 class Calculator(QtWidgets.QMainWindow, Ui_MainWindow): #   def __init__(self): super().__init__() #    Ui ( ) self.setupUi(self) #    self.show() 

علاوة على ذلك ، فإن مهمتنا هي التأكد من حدوث شيء ما عندما نضغط على الأزرار "1" ، "2" ، "3" ، إلخ.

في نفس المكان ، في مُنشئ الفصل ، نعلن عن اتصال الزر بأي وظيفة:

  # pressed self.pushButton.clicked.connect(self.digit_pressed) # 1 self.pushButton_2.clicked.connect(self.digit_pressed) # 2 self.pushButton_3.clicked.connect(self.digit_pressed) # 3 self.pushButton_4.clicked.connect(self.digit_pressed) # 4 self.pushButton_5.clicked.connect(self.digit_pressed) # 5 self.pushButton_6.clicked.connect(self.digit_pressed) # 6 self.pushButton_7.clicked.connect(self.digit_pressed) # 7 self.pushButton_8.clicked.connect(self.digit_pressed) # 8 self.pushButton_9.clicked.connect(self.digit_pressed) # 9 self.pushButton_10.clicked.connect(self.digit_pressed) # 0 self.pushButton_add.clicked.connect(self.pressed_equal) # + self.pushButton_ded.clicked.connect(self.pressed_equal) # - self.pushButton_div.clicked.connect(self.pressed_equal) # / self.pushButton_mul.clicked.connect(self.pressed_equal) # * self.pushButton_exp.clicked.connect(self.pressed_equal) # ** self.pushButton_log.clicked.connect(self.pressed_equal) # log self.pushButton_procent.clicked.connect(self.pressed_equal) # % self.pushButton_ENTER.clicked.connect(self.function_result) # = self.pushButton_C.clicked.connect(self.function_clear) # C self.pushButton_point.clicked.connect(self.make_fractional) # . self.pushButton_delete.clicked.connect(self.function_delete) # < self.pushButton_open_skob.clicked.connect(self.create_big_example) # ( 

يشار بالفعل إلى وظيفة self.digit_pressed في الكود على الأزرار ، دعنا نلقي نظرة عليها ، ماذا تفعل إذا نقر المستخدم على الزر مع الأرقام:

  # lineEdit -  ,         # text() -  ,      # setText() -          # sender() - ,     (   ,    ) def digit_pressed(self): button = self.sender() if self.lineEdit.text() == '0': #        "0",     ,     self.lineEdit.setText(button.text()) else: if self.result == self.lineEdit.text(): self.lineEdit.setText(button.text()) else: self.lineEdit.setText(self.lineEdit.text() + button.text()) self.result = 0 

التعليقات على الكود موجودة أيضا.

فكر الآن في وظيفة تستجيب للضغط على العمليات "+" ، "-" ، إلخ.

  clear() -  ,       def pressed_equal(self): button = self.sender() self.first_value = float(self.lineEdit.text()) self.lineEdit.clear() self.label.setText(str(self.first_value) + button.text()) self.equal = button.text() 

نكتب القيمة الأولى لمتغير self.first_value ونخلي مجالنا لإدخال قيمة العملية ، ثم نخرج إلى lineEdit (حقل الإدخال والنتيجة الرئيسي) مع الرقم والتشغيل.

لماذا تطفو ؟ يمكنني الإجابة حتى أنني قررت أن أفعل كل شيء ، وعند إخراج القيمة إلى كتلة النتيجة ، إذا كانت النتيجة ".0" في النهاية ، فاحذف هذا الجزء حتى يصبح الرقم صحيحًا. لم أفكر في فكرة أفضل.

لدينا الآن وظائف لضغط الأرقام وللضغط على العمليات ، ما التالي؟ بعد ذلك نحتاج إلى عرض النتيجة ، هذا هو الزر = (ENTER) .

  def function_result(self): if self.equal == '+': self.function_addition() elif self.equal == '-': self.function_subtraction() elif self.equal == "/": self.function_divison() elif self.equal == '*': self.function_multiply() elif self.equal == "^": self.exponentiation() elif self.equal == "%": self.function_percent() elif self.equal == "log": self.function_log() 

اسمحوا لي أن أذكرك بأن المتغير self.first_value يساوي الآن المتغير الأول الذي نقدمه ، وأن self.equal يحتوي على العملية التي نقرنا عليها. بعد إدخال الرقم الثاني والضغط على = ، نحاول معرفة ماهية العملية ، ثم نحدد المتغير الثاني.

ننتقل إلى وظائف العمليات. حصلت عليه مثل هذا:

  def function_addition(self): self.determinate_second_value() self.result = float(self.first_value + self.second_value) self.form_result() def function_subtraction(self): self.determinate_second_value() self.result = float(self.first_value - self.second_value) self.form_result() def function_divison(self): self.determinate_second_value() self.result = float(self.first_value / self.second_value) self.form_result() def function_multiply(self): self.determinate_second_value() self.result = float(self.first_value * self.second_value) self.form_result() def function_exponentiation(self): self.determinate_second_value() self.result = float(self.first_value ** self.second_value) self.form_result() def function_percent(self): self.determinate_second_value() self.result = float(self.first_value * (self.second_value / 100)) self.form_result() def function_log(self): self.determinate_second_value() self.result = float(math.log(self.first_value, self.second_value)) self.form_result() 

تحدد الدالة self.determinate_second_value () القيمة الثانية للمتغير الذي أدخلناه. هذا ليس منطقيًا ومتعرجًا قليلاً ، لكن كما هو الحال ، سأحاول مراعاة جميع الأخطاء لاحقًا في التعليقات عندما يقول الأشخاص الأذكياء كيف.

القليل من المرطبات.

  • self.first_value - له قيمة الرقم الأول الذي تم إدخاله
  • self.equal - لديه str متغير العملية ضغطنا
  • self.second_value - له قيمة المتغير الثاني

بعد ذلك ، في كل وظيفة من وظائف العمليات ، نسميها self.form_result () ، والتي من الغريب أنها تشكل نتيجة. نبقي النتيجة في المتغير الذاتي .

  def form_result(self): self.result = str(self.result) if self.result[-2:] == '.0': self.result = self.result[:-2] self.lineEdit.setText(str(self.result)) self.label.clear() 

سأشرح ل self.result [-2:] . [-2:] يعني أننا نقوم بمقارنة آخر حرفين في السلسلة بـ ".0".

لذلك يتم عرض نتائجنا في كتلة الخط الرئيسي ، تهانينا.

سأرفق هنا أيضًا رمزًا يزيل حرفًا واحدًا من سلسلة أو الرقم بالكامل أو يضيف "." (نقطة) لإنشاء عدد كسري:

  def make_fractional(self): value = self.lineEdit.text() if '.' not in value: self.lineEdit.setText(value + '.') def function_delete(self): value = self.lineEdit.text() self.lineEdit.setText(value[:-1]) def function_clear(self): self.lineEdit.setText('0') 

كل رمز تحت المفسد:

كود كامل
 from PySide2 import QtWidgets from calc_ui import Ui_MainWindow import sys import math class Calculator(QtWidgets.QMainWindow, Ui_MainWindow): def __init__(self): super().__init__() #    Ui ( ) self.setupUi(self) self.show() self.lineEdit.setText('0') self.first_value = None self.second_value = None self.result = None self.example = "" self.equal = "" # pressed self.pushButton.clicked.connect(self.digit_pressed) # 1 self.pushButton_2.clicked.connect(self.digit_pressed) # 2 self.pushButton_3.clicked.connect(self.digit_pressed) # 3 self.pushButton_4.clicked.connect(self.digit_pressed) # 4 self.pushButton_5.clicked.connect(self.digit_pressed) # 5 self.pushButton_6.clicked.connect(self.digit_pressed) # 6 self.pushButton_7.clicked.connect(self.digit_pressed) # 7 self.pushButton_8.clicked.connect(self.digit_pressed) # 8 self.pushButton_9.clicked.connect(self.digit_pressed) # 9 self.pushButton_10.clicked.connect(self.digit_pressed) # 0 self.pushButton_add.clicked.connect(self.pressed_equal) # + self.pushButton_ded.clicked.connect(self.pressed_equal) # - self.pushButton_div.clicked.connect(self.pressed_equal) # / self.pushButton_mul.clicked.connect(self.pressed_equal) # * self.pushButton_exp.clicked.connect(self.pressed_equal) # ** self.pushButton_log.clicked.connect(self.pressed_equal) # log self.pushButton_procent.clicked.connect(self.pressed_equal) # % self.pushButton_ENTER.clicked.connect(self.function_result) # = self.pushButton_C.clicked.connect(self.function_clear) # C self.pushButton_point.clicked.connect(self.make_fractional) # . self.pushButton_delete.clicked.connect(self.function_delete) # < self.pushButton_open_skob.clicked.connect(self.create_big_example) # ( def digit_pressed(self): # sender - ,     (   ,    ) button = self.sender() if self.lineEdit.text() == '0': self.lineEdit.setText(button.text()) else: if self.result == self.lineEdit.text(): self.lineEdit.setText(button.text()) else: self.lineEdit.setText(self.lineEdit.text() + button.text()) self.result = 0 def form_result(self): self.result = str(self.result) if self.result[-2:] == '.0': self.result = self.result[:-2] self.lineEdit.setText(str(self.result)) self.label.clear() def make_fractional(self): value = self.lineEdit.text() if '.' not in value: self.lineEdit.setText(value + '.') def function_delete(self): value = self.lineEdit.text() self.lineEdit.setText(value[:-1]) def function_clear(self): self.lineEdit.setText('0') def pressed_equal(self): button = self.sender() self.first_value = float(self.lineEdit.text()) self.lineEdit.clear() self.label.setText(str(self.first_value) + button.text()) self.equal = button.text() def function_addition(self): self.determinate_second_value() self.result = float(self.first_value + self.second_value) self.form_result() def function_subtraction(self): self.determinate_second_value() self.result = float(self.first_value - self.second_value) self.form_result() def function_divison(self): self.determinate_second_value() self.result = float(self.first_value / self.second_value) self.form_result() def function_multiply(self): self.determinate_second_value() self.result = float(self.first_value * self.second_value) self.form_result() def function_exponentiation(self): self.determinate_second_value() self.result = float(self.first_value ** self.second_value) self.form_result() def function_percent(self): self.determinate_second_value() self.result = float(self.first_value * (self.second_value / 100)) self.form_result() def function_log(self): self.determinate_second_value() self.result = float(math.log(self.first_value, self.second_value)) self.form_result() def determinate_second_value(self): self.second_value = float(self.lineEdit.text()) self.lineEdit.clear() self.label.setText(str(self.first_value) + self.equal + str(self.second_value)) def function_result(self): if self.equal == '+': self.function_addition() elif self.equal == '-': self.function_subtraction() elif self.equal == "/": self.function_divison() elif self.equal == '*': self.function_multiply() elif self.equal == "^": self.exponentiation() elif self.equal == "%": self.function_percent() elif self.equal == "log": self.function_log() if __name__ == '__main__': #   QApplication app = QtWidgets.QApplication(sys.argv) #    calc = Calculator() #  sys.exit(app.exec_()) 


نعم ، الآلة الحاسبة لا تحسب الوظائف والتعبيرات الكبيرة ، أنا أعمل عليها!

شكرا جزيلا لاهتمامكم حظا سعيدا وتطوير! هذا رائع.

أود أيضًا أن أدعوك إلى قناة JuniorProger Telegram ، حيث أتحدث عن حياة مبرمج Junior وطريقته الشائكة ، ولكنها مثيرة جدًا للاهتمام ليصبح متخصصًا في It.

Source: https://habr.com/ru/post/ar458536/


All Articles