درس چهاردهم: تکمیل لایه‌ی کنترلگر

15 اردیبهشت 1399
pyqt14

تکمیل لایه‌ی کنترلگر

یک بار که لایه ی مدل ماشین حساب را تکمیل کردید، می توانید کنترلگر را نیز بدنبال آن تکمیل نمایید. ورژن نهایی PyCalcCtrl شامل منطق برای پردازش محاسبات و اطمینان حاصل کردن از کارکرد علامت مساوی (=) می باشد:

# Create a Controller class to connect the GUI and the model
class PyCalcCtrl:
    """PyCalc's Controller."""
    def __init__(self, model, view):
        """Controller initializer."""
        self._evaluate = model
        self._view = view
        # Connect signals and slots
        self._connectSignals()

    def _calculateResult(self):
        """Evaluate expressions."""
        result = self._evaluate(expression=self._view.displayText())
        self._view.setDisplayText(result)

    def _buildExpression(self, sub_exp):
        """Build expression."""
        if self._view.displayText() == ERROR_MSG:
            self._view.clearDisplay()

        expression = self._view.displayText() + sub_exp
        self._view.setDisplayText(expression)

    def _connectSignals(self):
        """Connect signals and slots."""
        for btnText, btn in self._view.buttons.items():
            if btnText not in {'=', 'C'}:
                btn.clicked.connect(partial(self._buildExpression, btnText))

        self._view.buttons['='].clicked.connect(self._calculateResult)
        self._view.display.returnPressed.connect(self._calculateResult)
        self._view.buttons['C'].clicked.connect(self._view.clearDisplay)

ابتدا پارامتر جدید به تابع init اضافه می کنید. حالا کلاس نمونه هایی را از هر دوی لایه های مدل و نمایش دریافت می کنید. سپس با ()calculateResult_. محتوای صفحه ماشین حساب را گرفته و تبدیل به عبارت ریاضی می کند و نهایتا حاصل را در صفحه نمایش می دهد.

همچنین شما ساحتار شرطی if را به ()buildExpression_. برای بررسی اینکه آیا خطایی رخ داده یا نه اضافه می کنید. اگر رخ دهد صفحه را پاکسازی کرده و دوباره با یک عبارت جدید آغاز می کنید. در نهایت دو اتصال جدید داخل ()connectSignals_. می افزایید. اولی کارکرد علامت مساوی را موجب شده و دومی منجر به پردازش عبارت موقع فشردن دکمه ی Enter توسط کاربر می گردد.

برای اینکه همه ی این کدها کار کنند، نیاز به بروزرسانی کدهای ()main دارید:

# Client code
def main():
    """Main function."""
    # Create an instance of `QApplication`
    pycalc = QApplication(sys.argv)
    # Show the calculator's GUI
    view = PyCalcUi()
    view.show()
    # Create instances of the model and the controller
    model = evaluateExpression
    PyCalcCtrl(model=model, view=view)
    # Execute calculator's main loop
    sys.exit(pycalc.exec_())

 

اینجا model شما یک ارجاع به متد ()evaluateExpression را نگهداری می کند. به علاوه حالا ()PyCalcCtrl دو ارگومان را دریافت می کند: model و view


منبع: سایت Real Python

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری ساخت ماشین حساب گرافیکی با PyQt توصیه می‌کند:
نویسنده شوید
دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.