PyQt5练习:积分计算器

系统平台:win10, linux mint 18.3 xfce
相关软件:Qt Designer(建议官网下载安装完整版)

本篇博客主要介绍pyqt5的一些控件操作,大体列如下:
(1)获取QLineEdit的内容:expr = lineEdit.text()
(2)向QLineEdit、QTextEdit等写入内容:lineEdit.setText("string")
(3)检查checkbox 是否被勾选:checkBox.isChecked() ,返回布尔逻辑True or False
(4)设置控件是否使能lineEdit.setEnabled(True) 或者 linEdit.setEnabled(False) ,True 是使能控件,False 是失能控件


一、在qtdesigner 设计ui界面
这里写图片描述
注意ui里面各个控件的名称自己作相应修改,等下写代码的时候要对应上

二、编写代码

# -*- coding: utf-8 -*-
"""
Created on Fri Mar  9 20:24:43 2018

@author: 周文青

使用pyqt5结合scipy求解积分
主要是练习一些控件的使用,如QLineEdit、QCheckBox等
未完善:实现数值积分
"""

import os
import sys
from PyQt5 import QtCore, QtGui, uic
from PyQt5.QtCore import QCoreApplication
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QMessageBox
from PyQt5.QtWidgets import QFileDialog, QAction, qApp
from PyQt5.QtGui import QIcon
import sympy as sp
from sympy import sin,cos,log,exp,tan,tanh,sinh,cosh
from sympy.abc import *
#os.chdir(r'D:\Files\python\gui\pyqt')
# 使用QtCreator建立的ui文件路径
qtCreatorFile = "./integrate_ui.ui" 
# 使用uic加载
Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile)

class MyApp(QMainWindow, Ui_MainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        Ui_MainWindow.__init__(self)
        super().__init__()
        self.initUI()       # 调用自定义的UI初始化函数initUI()

    def initUI(self):
        '''
        Initialize the window's UI
        '''
        self.setupUi(self)
        self.setWindowTitle("积分计算器")
        self.setWindowIcon(QIcon("./leaf.png"))   # 设置图标,linux下只有任务栏会显示图标

        self.initMenuBar()      # 初始化菜单栏
        self.initToolBar()      # 初始化工具栏
        self.initButton()       # 初始化按钮
        self.checkboxInt.stateChanged.connect(self.changeStatus)
        # 控制控件的使能和失能
        self.checkboxInt.setEnabled(True)
        self.lineeditFrom.setEnabled(False)
        self.lineeditTo.setEnabled(False)
        self.show()             # 显示

    def initMenuBar(self):
        '''
        初始化菜单栏
        '''
        self.actionExit.triggered.connect(qApp.quit)    # 按下菜单栏的Exit按钮会退出程序
        self.actionExit.setStatusTip("退出程序")         # 左下角状态提示
        self.actionExit.setShortcut('Ctrl+Q')           # 添加快捷键

        actionFileOpen = QAction('&Open', self)
        actionFileOpen.setStatusTip('Open the File Explorer')
        actionFileOpen.setShortcut('Ctrl+O')
        actionFileOpen.triggered.connect(self.fileOpen_callback)

        self.menuFile.addAction(actionFileOpen)

    def fileopen_callback(self):
        global fileName1    # 设置全局
        pass
#        fileName1, filetype = QFileDialog.getOpenFileName(self,
#                                    "选取文件",
#                                    "/home/kindy/音乐",
#                                    "All Files (*);Music Files (*.mp3); Text Files (*.txt)")   #设置文件扩展名过滤,注意用双分号间隔
#        self.lineEdit.setText(fileName1)
    def initToolBar(self):
        '''
        初始化工具栏
        创建一个QAction实例exitAct,然后添加到designer已经创建的默认的工具栏toolBar里面
        '''
        self.toolBar = self.addToolBar('Exit')

        exitAct = QAction(QIcon('./exit.png'), 'Exit', self)
        exitAct.setShortcut('Ctrl+Q')
        exitAct.triggered.connect(qApp.quit)

        self.toolBar.addAction(exitAct)

    def initButton(self):
        '''
        Initialize the Buttons
        btnBrowse: browse the file explorer
        btnPlay: begin to play music using module pygame
        btnStop: stop playing music
        '''
        self.btnCaculate.clicked.connect(self.run)


    def fileOpen_callback(self):
        global fileName1    # 设置全局
        fileName1, filetype = QFileDialog.getOpenFileName(self,
                                    "选取文件",
                                    "/home/kindy/音乐",
                                    "All Files (*);;Music Files (*.mp3)")   #设置文件扩展名过滤,注意用双分号间隔
        self.lineEdit.setText(fileName1)




    def closeEvent(self, event):

        reply = QMessageBox.question(self, 'Message',
            "Are you sure to quit?", QMessageBox.Yes |
            QMessageBox.No, QMessageBox.No)

        if reply == QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()

    def run(self):
        '''
        首先查看是否勾选了定积分选项,如果是,调用sympy.integrate(expr,(var,a,b))
        否则调用sympy.integrate(expr,var)注意var要是sympy.symbol类型的

        未完善:使用数值积分计算积分结果
        '''
        if self.checkboxInt.isChecked():            # 如果勾选了定积分
            expr = str(self.lineeditExpr.text())    # 获取表达式
            var = str(self.lineeditVar.text())      # 获取积分变量
            a = self.lineeditFrom.text()            # 积分起始
            b = self.lineeditTo.text()              # 积分结束

            result = sp.integrate(expr,(var,a,b))   # 使用sympy求解
            self.texteditShow.setText('函数 ' + expr + '的定积分在区间 [{:},{:}] 的结果为: '.format(a,b) + str(result))
        else:
            expr = str(self.lineeditExpr.text())
            var = str(self.lineeditVar.text())
            var = sp.symbols(var)
            result = sp.integrate(expr,var)
            self.texteditShow.setText('函数 '+expr+' 的不定积分积分结果为:'+str(result))


    def changeStatus(self, state):
        if state == Qt.Checked: # 如果勾选了,使用含上下限的积分

            self.lineeditFrom.setEnabled(True)
            self.lineeditTo.setEnabled(True)

        else:   # 否则
            self.lineeditFrom.setEnabled(False)
            self.lineeditTo.setEnabled(False)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MyApp()
    sys.exit(app.exec_())

代码有点长,以后有时间放到github里,目前就先放着,实现的效果如下:
这里写图片描述

小结:还是要多看Qt的帮助文档,python版本的pyqt没有专门的文档,官网链接过去的文档也是C++版本的,其实C++的文档是一样的,以勾选框的isChecked() 方法为例,帮助文档里面直接搜索QCheckBox没有查到什么,但是注意到其继承QAbstractButton,点击QAbstractButton,就可以在公有函数那里找到:
这里写图片描述
这里写图片描述

猜你喜欢

转载自blog.csdn.net/ouening/article/details/79504483