Python + Pyside2或简称为“计算器”

哈Ha!

我叫萨莎。 我是初级开发人员。 我是一名软件测试员。 我主要使用Python + Selenium编写测试,但是Python变得非常有趣,以至于我想深入研究它并学习尽可能多的框架! 我想编写一个桌面应用程序,例如简单的“计算器”。 我的选择落在Pyside2上。 我不假装有完美的代码或课程。 如果像我这样的人想要开始使用Python摸索,那就只是想分享经验。 如果我帮助某人,我已经取得了成果。

让我们开始吧!

我在JetBrains的PyBarm IDE中编写了代码。 操作系统-Windows。

安装PySide2:

pip install PySide2 

拥有Python根文件夹的位置,请转至该目录,然后转到文件夹“ Lib”->“ site-packages”->“ Pyside2”。 您将拥有设计器程序-这是QtDesigner程序,它将允许您为程序创建自己的界面。 值得注意的是,当您在项目目录中创建文件时,它将具有.ui格式,Python无法理解该格式,因此我们需要将其转换为.py格式,但这是稍后的内容。

首先,创建您的表单。

图片

我们进行设计,调用“对象检查器”小节右边的按钮。 值得一提的是,QtDesigner支持级联样式表,如果更简单,那么通过在属性中找到“ styleSheet”参数,您就有机会根据CSS知识进行自己的设计。

图片

接下来,我们需要将.ui文件转换为某种格式,以便Python能够理解。 转到命令行并编写

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

pyside2-uic命令做什么? 它将您的.ui文件转换为python .py文件,并从中创建一个Python类。 也许有见识的人会说ui文件可以直接连接而无需转换为项目,但是正如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”(在目录的屏幕上方,可见)并不奇怪。

将我们复制的代码粘贴到此处,然后开始对其进行编辑。

import sys我们会从一开始就提出,因为这是一种良好的形式。

我们导入几个必要的模块来处理表单,并从文件“ calc_ui.py”导入主类Ui_MainWindow

接下来,编辑__name__ 。 我们删除不需要的所有内容。 你应该有这个:

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

我希望明确地对代码发表评论。 让我们继续创建Calculator类。

 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(我们的主输入和结果字段)。

为什么要漂浮 ? 我可以回答,以便我决定将所有内容都设为float ,然后在将值输出到结果块时,如果结果末尾带有“ .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() ,这很奇怪,形成了我们的结果。 我们将结果保存在变量self.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:]表示我们将字符串的最后2个字符与“ .0”进行比较。

恭喜,我们的结果显示在mainLineEdit块中。

我还将在此处附加一个代码,该代码从字符串或整数中删除一个字符或添加“。” (点)以创建分数:

  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频道,在其中谈论初级程序员的生活以及他成为IT专家的棘手但非常有趣的方式。

Source: https://habr.com/ru/post/zh-CN458536/


All Articles