当前位置:   article > 正文

PyQt5详细教程:基于PyQt5 QTdesigner的PyQt编程(常用控件、线程编写、在pyqt内嵌Matplotlib)_pyqt designer matplotlib

pyqt designer matplotlib

PyQt5这个模块的最大优势在于界面可以使用qtdesigner直观的制作,然后代码直接读取就可以,省去了繁琐的排版等等步骤,而且界面的美观程度也是tk所无法达到的。

用QTdesigner的时候最好在制作完界面后对界面进行布局,当然你不使用布局也是可以运行的,但是在别的电脑,分辨率不同的情况下会导致软件显示出问题,并且无法根据界面拉伸来解决。如果你布局过,那么可以使用界面的伸缩让界面自己重新排布。至于排版的方法就是选中你要布局的目标然后点击布局,在布局中你可以多运用Horizontal Spacer 和vertical spacer。一般我会一行一行进行水平布局之后再整体进行垂直布局。

首先你需要用QTdesigner制作一个ui界面,然后通过python代码进行界面的读取。

一、UI文件的可视化操作

第一种方法——直接在python文件上读取QTDesigner创建的UI文件

  1. 直接读取ui文件,假设我的ui文件名为"SL_manage.ui",那么我的python代码应该是:
  2. #MainUi.py
  3. from PyQt5 import QtWidgets, uic,QtCore,QtGui
  4. import os
  5. path = os.getcwd()
  6. qtCreatorFile = path +os.sep+"ui"+os.sep+"SL_manage.ui" # Enter file here.
  7. Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile)
  8. #_translate = QtCore.QCoreApplication.translate#
  9. _translate = QtCore.QCoreApplication.translate这个主要用于后期的UI界面文字字体以及颜色便捷的更改
  10. 创建一个对象,该对象就是你的整个窗体:
  11. class MainUi(QtWidgets.QMainWindow, Ui_MainWindow):
  12. #这里的第一个变量是你该窗口的类型,第二个是该窗口对象。
  13. #这里是主窗口类型。所以设置成当QtWidgets.QMainWindow。
  14. #你的窗口是一个会话框时你需要设置成:QtWidgets.QDialog
  15. def __init__(self):
  16. QtWidgets.QMainWindow.__init__(self)
  17. Ui_MainWindow.__init__(self)
  18. self.setupUi(self)

至此,窗体对象已经创建完毕,接着,我们需要用一个函数取创建这个对象并将他显示出来,那么就需要下列代码:

  1. #文件名: ShowUi.py
  2. from PyQt5 import QtWidgets, uic,QtCore,QtGui
  3. if __name__ == "__main__":
  4. app = QtWidgets.QApplication(sys.argv)
  5. window = MainUi() #创建窗体对象
  6. window.show() #窗体显示
  7. sys.exit(app.exec_())

如果你的程序还有新的窗口,你可以用同样的方法在继续写一个窗体对象,然后在你的ShowUi.py中进行对象的创建,甚至于在我们的MainUi中创建也是可以的。

第二种办法——将UI文件直接转换成py文件

将UI文件转化成python文件,然后进行相同的对象调用。方法实际上和前者是一样的,这里首先来说明一下如何转换ui文件:
我用的编译器是pycharm,在pycharm的工具栏类有个外部工具,你可以将指令填入外部工具,这样,你只需要将UI文件拖入pacharm然后运行你这个工具就可以自动生成python文件,这样可以省去反复敲指令的麻烦。配置如图:在工具栏的外部工具中。

 

配置如上图,名称:自定义。
程序栏写入python所在目录下的python.exe文件。参数则是:-m PyQt5.uic.pyuic  $FileName$ -o $FileNameWithoutExtension$.py
就是生成一个与当前操作文件相同名字的python文件。
工作目录则是$FileDir$,意思为当前文件所在目录

当然如果你不想使用这个工具,你就喜欢自己手动敲指令,那么你就打开你的cmd,或者终端,然后输入

python -m 路径+PyQt5.uic.pyuic  ui文件路径+名字 -o 输出的py文件路径加名字

到这里你就会生成一个python文件,但这个python文件实际上还是不能直接生成窗口的,需要你进行代码的可视化操作,操作方法如下:

假设我生成了一个叫"main_menu.py"的python文件,文件内容大抵为这样:

在这里我们可以看到,这个python文件创建了一个叫UI_MainWindow的对象,这时你应该已经猜到了,这个对象正是我们所制作的界面,也就是说我们的UI文件被QT的一个组件翻译成了一个python对象。我们接下来所需要做的,就是在python文件中引用这个对象,引用方式如下:

  1. #首先你需要在引用的python文件内导入该对象所在的文件,也就是main_menu.py
  2. import main_menu #导入该对象所在文件
  3. Ui_MainWindow = main_menu.Ui_MainWindow#指定Ui_MainWindow 为main_menu文件下的Ui_MainWindow对象。
  4. class CoperQt(QtWidgets.QMainWindow,Ui_MainWindow):#创建一个Qt对象
  5. #这里的第一个变量是你该窗口的类型,第二个是该窗口对象。
  6. #这里是主窗口类型。所以设置成当QtWidgets.QMainWindow。
  7. #你的窗口是一个会话框时你需要设置成:QtWidgets.QDialog
  8. def __init__(self):
  9. QtWidgets.QMainWindow.__init__(self) # 创建主界面对象
  10. Ui_MainWindow.__init__(self)#主界面对象初始化
  11. self.setupUi(self) #配置主界面对象
  12. if __name__ == "__main__":
  13. app = QtWidgets.QApplication(sys.argv)
  14. window = CoperQt()#创建QT对象
  15. window.show()#QT对象显示
  16. sys.exit(app.exec_())

这样,你的python工程就可以脱离UI文件直接进行使用了,好处就是在打包成EXE文件的时候你不用给他搭配上UI文件。关于Qt的操作我这里简单说几个比较常用而且典型的,如果需要深入那就需要你们你几查阅相关手册文档了,我对于这类工具基本就是够用就行,并不是我的主业。

二、常用控件及方法

(1)按钮Button

常见的按钮类包括:QPushButton、QToolButton、QRadioButton、QCheckBox、他们都继承自QAbstractButton类;

QAbstractButton提供的状态:

提供的信号:

a. QPushButton

QPushButton常用方法:

 

 

按钮

按钮的触发在QT里用的是一个槽和信号的概念,这个概念我们实际上不用想的那么复杂,无非也就是将按钮的事件绑定一个函数,当事件触发,那么函数就运行,模板代码如下:

  1. self.Button0.clicked.connect(self.start_find) # button0的点击事件绑定start_find函数
  2. 关于绑定函数的传参除了可以使用全局变量还可以使用python的lambda,如我要传入x:
  3. self.Button0.clicked.connect(command=lambda:button_process(x))

b. QRadioButton

它也继承自QAbstracButton 类,提供了一组可供选择的按钮和文本标签,用户可以选择一项,标签用户显示对应的文本信息;可以切换on或者off,即checked或者unchecked;多个QRadioButton是一个按钮组合,如果多个独占的按钮组合,需要放在QGrouopBox或者QButtonGroup中;当切换on或者off时,会发送toggled信号,绑定这个信号,在按钮状态发生改变时,触发相应的行为;

常用方法如下:

 

clicked信号在每次单击按钮时都会发射该信号, 一般只有状态改变触发,则toggled信号更适合这种状态的监控;

单选框

单选框在实际中我们也经常用到,比如写一个软件的登陆界面的时候,单选框可以设置为自动登陆,记住密码等等
单选框的用法如下:

  1. self.radioButton.clicked.connect(self.change_radio) # 单选按钮选中绑定函数
  2. self.radioButton.hide() # 单选框2隐藏
  3. self.radioButton.setChecked(True)#单选框选中,反之False
  4. self.radioButton.isChecked() #单选框是否选中,选中返回True反之False

单选框补充

单选框这里要注意,就是单独的单选框并不能正常使用,假设我创建了个单选框用作记住密码按钮,实际上我点一下单选框则选中记住密码,但是再点一下他仍然是选中状态并不会取消,因为系统默认规定必须有且只有一个单选框被选中。所以这里教大家一个小诀窍,那就是多创建一个单选框,然后将它隐藏掉,这样就可以让两个交替被选中,从而达到点击选中,再点击取消的效果。除此之外有个更好的办法就是不使用单选框,直接使用复选框

复选框

在QTdesigner里右键单选框选择变形为checkBox,则变成复选框,复选框和单选框的操作基本一样,唯一不同的是复选框可以允许一个界面上没有一个被选中,或者全部被选中,还有复选框是方形的,单选框是圆形的。

(2)定时器QTimer

接着是Qt定时器,这个组件也特别实用,可以让你的界面定时的去执行某个函数,概念基本上就跟单片机的中断是一样的。
比如我在窗口显示一个时间,我需要他每一秒都更新窗口的时间信息,那么我就需要设置一个窗口定时器,代码如下:

  1. self.testTimer = QtCore.QTimer() # 创建定时器
  2. self.testTimer.timeout.connect(self.show_time) # 定时超时事件绑定show_time这个函数
  3. self.testTimer.start(1000) #定时器每一秒执行一次

下面是show_time这个函数:

  1. def show_time(self):
  2. self.time_now = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))#

同理我们也可以把别的函数绑定到定时器上,让他定时运行。道理也是一样的。

(3)下拉选项栏配置comboBox

下拉选项栏

下拉选项栏在UI制作的时候也非常的常用,他的配置也不难,假设下拉选项栏是self.comboBox,代码如下:

 

  1. 选项栏有两个标识,一个是每一栏的编号index(从0开始),一个是每一栏的文本内容text:
  2. self.comboBox.insertItem(0, self.tr("None")) # 第一个选项插入空
  3. self.comboBox.insertItem(0, "x") 第一个选项插入x字符
  4. self.comboBox.currentText() 读取选项栏文本:
  5. self.comboBox.currentIndex() 读取选项栏编号:
  6. self.comboBox.setCurrentIndex() 设置当前选项栏显示位置:(通过编号)
  7. self.comboBox.setCurrentText() 设置当前选项栏显示位置:(通过文本)
  8. self.comboBox.clear() 清空当前选项框内元素

这里有个小技巧如何让选项栏选中后不用按按钮就触发事件。实际上就是运用到上面的定时器,你可以将定时器绑定上选项栏读取函数,这个函数每隔200MS或者1s读取选项栏的数值,这样,用户的只要更换选项立马能够做出反映。

(4)会话窗QMessager

以下是最简单的会话窗代码:

  1. header:会话窗标题
  2. info:会话窗内容
  3. def show_message(self,header = "说明",info = "无"):
  4. QtWidgets.QMessageBox.information(self,header,info,QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No)
  5. # 使用infomation信息框
  6. #判断按键(显示两个按键,是和否)
  7. QtWidgets.QMessageBox.Yes|QtWidgets.QMessageBox.No)
  8. #确定按键(显示一个按键,OK)
  9. # QtWidgets.QMessageBox.Ok

(5)文件操作QFileDialog

文件操作的话实际上和TK基本类似,就是调用窗口来读取用户选取的文件路径以及名称,接着用户自己调用os函数去进行文件操作。首先是打开文件,基本代码如下:

  1. def open_file(self):
  2. fileName1, filetype =QtWidgets.QFileDialog.getOpenFileName(self,
  3. "请打开EXCEL文件", path,"Text Files (*.xlsx;*.xls)") # 设置文件扩展名过滤,
  4. # 注意用双分号间隔
  5. if len(fileName1) == 0:
  6. return
  7. fileName1 = fileName1.replace('/', "\\")#win下需要进行文件分隔符转换
  8. my_excel = EasyExcel(filename=fileName1)#这是我自己写的excel读取程序这里创建一个excel读取对象
  9. self.data_list = my_excel.get_content()#读取excel的内容,返回是一个字典列表
  10. QtWidgets.QMessageBox.information(self, # 使用infomation信息框
  11. "说明", "数据加载成功", QtWidgets.QMessageBox.Ok)
  12. #会话窗提醒,数据读取成功

接下来是保存文件:

  1. def save_file(self): #只是获取路径,实际保存需要调用OS模块
  2. fileName2, ok2 = QtWidgets.QFileDialog.getSaveFileName(self,
  3. "文件保存","C:/","Text Files (*.xlsx);;Text Files (*.xls);;All Files (*)")
  4. #地址分隔符更改,QT获取的地址分隔符为/,而python为\\,需要替换
  5. if not fileName2:
  6. return
  7. fileName2 = fileName2.replace('/',"\\")
  8. #获取到文件路径,接下来的操作就需要你自己填写

(6)表格QtableWidget

表格

表格作为一个可以输入和输出的组件,在做工具的时候也非常的实用,他的基本使用方法如下:

  1. self.tableWidget.setHorizontalHeaderLabels(key_list)#设置表格表头数据
  2. self.tableWidget.setColumnCount(x) #设置表格的列数
  3. self.tableWidget.setRowCount(x) #设置表格的行数
  4. self.tableWidget.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.ResizeToContents) #表格设置成大小随内容改变
  5. self.tableWidget.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers) # 表格设置成只读
  6. self.tableWidget.setSelectionBehavior(QTableWidget.SelectRows)#选择行
  7. self.table.setSelectionMode(QTableWidget.SingleSelection)#选择单个行
  8. self.tableWidget.setAlternatingRowColors(True)#隔行改变颜色
  9. self.tableWidget.verticalHeader().sectionClicked.connect(self.VerSectionClicked) # 表头单击信号
  10. self.tableWidget.horizontalHeader().sectionClicked.connect(self.HorSectionClicked) # 表头单击信号
  11. self.tableWidget.rowCount()#返回表格的行数
  12. self.tableWidget.columnCount()#返回表格的列数
  13. self.tableWidget.item(row,clo ).text()#获取row行clo列的表格数据,从0开始
  14. self.tableWidget.clear()#表格清空,不清空的话会永远残留
  15. QTableWidget.clearContents() 只清除表项,不清除表头。
  16. self.tableWidget.setItem(row,col, QTableWidgetItem("content"))#设置表格内容为字符串"content"
  17. self.tableWidget.insertColumn(self, int column) 在某一列插入新的一列。
  18. self.tableWidget.insertRow(self, int row)在某一行插入新的一行。
  19. self.tableWidget.removeColumn(self, int column) 移除column列及其内容。
  20. QTableWidget.removeRow(self, int row)移除第row行及其内容。
  21. QTableWidget.setShowGrid(False)#不显示分割线
  22. QTableWidget.hideRow(),hideColumn(),showRow(),showColumn()#隐藏相应的行或者列

如何在TableWidget内添加其他组件呢?

下面额例程是讲timeEdit组件添加进TableWidget中

  1. self.timeEdit = QtWidgets.QTimeEdit(Dialog)#创建一个timeEdit
  2. self.tableWidget.setCellWidget(0, 0, self.timeEdit)#把timeedit添加进tableWidget内

(7)输入框

输入框主要用于人机交互中人的指令或者文本输入,他的基本操作方法是:

 

输入框

 

  1. self.lineEdit.returnPressed.connect(self.check_info) # 文本栏回车绑定函数
  2. self.lineEdit.setEchoMode(QtWidgets.QLineEdit.Password)#设置成密码模式,也就是输入内容显示为实心的圆
  3. self.lineEdit.setEchoMode(QtWidgets.QLineEdit.Normal)#设置成普通模式(默认)
  4. self.lineEdit.setText(“hello world”) # 设置输入文本
  5. self.lineEdit.text()#返回输入框文本内容
  6. self.lineEdit.show()#显示文本框
  7. self.lineEdit.hide()#隐藏文本框
  8. self.lineEdit.clear()#清空文本框

(8)进度条

进度条

 

进度条一般会和定时器一起使用,用定时器绑定一个函数去获取进度然后再改变进度条的值,内容如下:

self.pbar.setValue(self.step)  #设置进度条进度 1则为1%

(9)菜单栏

菜单栏主要功能无非就是绑定函数予以触发:

  1. #Open_file是菜单栏内oepn_file这个按钮
  2. self.Open_file.triggered.connect(self.open_file)

(10)标题,标签

标签

 

标题标签主要用于软件上的文字标题或者描述

  1. self.label.setText(
  2. translate("MainWindow","<html><head/><body><p><span style="
  3. "\" font-size:18pt; color:#0000ff;\">
  4. {}
  5. </span></p></body></html>"
  6. ).format(self.time_now))

标签补充:这里就说到了之前translate函数的作用,实际上因为我对QT不熟并且也没打算去多深入的学习,所以我在程序中更新Label的时候将原本在QTdesigner中设定的字体类型也直接复制过来,写入这个函数,不然你直接使用setText函数之后你会发现原来设置的字体格式全部会变成默认,当然你也可以不用translate函数,直接使用pyqt5内置的字体修改函数来修改。

timeEdit&&dateEdit&&datetimeEdit

  1. self.timeEdit.setDisplayFormat('hh:mm')#设置时间格式
  2. now_day = time.strftime("%Y-%m-%d", time.localtime())
  3. self.dateEdit.setDate(QDate.fromString(now_day, 'yyyy-MM-dd'))
  4. time = QtCore.QTime.toString(self.timeEdit.time(),"hh:mm")#获取时间便转化成字符串
  5. now_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
  6. self.dateTimeEdit.setDateTime(QDateTime.fromString(now_time, 'yyyy-MM-dd hh:mm:ss'))#
  7. time = int(QtCore.QDateTime.toTime_t(self.dateTimeEdit.dateTime()))#获取时间并转化成时间戳
  8. self.dateTimeEdit.setDateTime(QtCore.QDateTime.fromTime_t(时间戳))#通过时间戳设置timeedit显示的时间
  9. self.dateTimeEdit.setMaximumDateTime(QtCore.QDateTime(QtCore.QDate(2106, 2, 7), QtCore.QTime(14, 28, 15)))#设置最大时间

(11)在pyqt内创建一个线程

pyqt编程下经常会用到线程,因为有些耗时的操作,如果不放入线程中,则会引发qt界面的刷新卡顿,甚至没有反应。
(在这里友情提醒一下,多线程你也可以用python自带的thread模块做,但是因为gil锁,实际上只会用单核。但是qthread是用c++实现的,所以实际推荐用QThread来写多线程(如果条件允许))

  1. from PyQt5.QtCore import QThread
  2. class newThread(QtCore.QThread):
  3. def __init__(self,parent=None):
  4. super(readThread, self).__init__(parent)
  5. def run(self):
  6. while True:
  7. print("hello")
  8. time.sleep(10)
  9. #如上操作创建了一个newThread的线程,
  10. 工作是每十秒打印一个hello。
  11. 当然如果想让线程开启,则需要在qt主程序内进行如下操作:
  12. self.new_thread = newThread() #创建线程对象
  13. self.new_thread.start() #开启。
  14. #开启后你的qt就会起一个线程,
  15. 并且跑在run的while循环以内。
  16. 如果你想要中断这个线程。
  17. 那么就可以用标志位的形式从while(1)里面break出来。

在qt内给线程添加回调函数:

  1. def updateFigure():
  2. try:
  3. GetLastStatus = getLastStatus()#
  4. GetLastStatus.finished_signal.connect(success)#回调绑定成功函数
  5. GetLastStatus.error_signal.connect(error)#回调绑定失败函数
  6. GetLastStatus.start()#程序开始
  7. except Exception as e:
  8. print(e)
  9. def success()
  10. print("Success")
  11. def error()
  12. print("error")
  13. class getLastStatus(QThread):
  14. finished_signal = pyqtSignal(str)#创建完成信号
  15. error_signal = pyqtSignal(str)#创建错误信号
  16. def __init__(self, parent=None):
  17. super().__init__(parent)
  18. def run(self):#重写内置运行函数
  19. if self._test() == True:
  20. self.finished_signal.emit('done')
  21. #如果完成,发送完成信号
  22. else:
  23. self.error_signal.emit("error")
  24. #如果出错,发送出错信号
  25. def _test(self):
  26. #return True
  27. return False

(12)在pyqt内嵌Matplotlib

首先创建一个名为MatplotMenu的UI文件,在该文件内添加一个QFrame组件,然后创建一个LineEdit和两个Button。效果如下图所示。然后,用上述的办法,将他生成PY文件。

 

 

 

接着,创建一个名为MatplotObject.py的文件,填入如下代码。

  1. from PyQt5.QtWidgets import *
  2. from PyQt5.QtCore import *
  3. import Ui.MatplotMenu as MatplotMenu #UI目录下的MatplotMenu
  4. import matplotlib
  5. matplotlib.use("Qt5Agg") # 声明使用QT5
  6. from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
  7. from matplotlib.figure import Figure
  8. import matplotlib.dates as mdate
  9. import datetime
  10. Ui_MainDialog = MatplotMenu.Ui_Dialog
  11. class MatplotMenu(QDialog,Ui_MainDialog):#创建一个会话框对象
  12. def __init__(self):
  13. super(MatplotMenu,self).__init__(parent)
  14. self.title = 'Matplot测试'#设置窗体title
  15. self.setupUi(self)
  16. self._createCanvas()#创建画布
  17. self._createLayouts()#配置组件
  18. self.show()#显示组件
  19. self._updateFigure()#更新曲线图
  20. self.timer = QTimer(self)#创建定时更新定时器
  21. self.timer.timeout.connect(self._updateFigure)#绑定更新函数
  22. self.pushButton_2.clicked.connect(self._reFresh)#按钮2绑定开始更新函数
  23. def closeEvent(self, event):#重写会话框关闭信号产生函数
  24. reply = QMessageBox.question(self, 'Message',
  25. "Are you sure to quit?", QMessageBox.Yes, QMessageBox.No)#产生提醒会话界面
  26. if reply == QMessageBox.Yes:#如果确认
  27. if self.timer.isActive():#定时器激活状态
  28. self.timer.stop()#停止定时器
  29. print("停止定时器")
  30. else:
  31. print("无需停止定时器")
  32. event.accept()#关闭事件接受
  33. else:
  34. event.ignore()#舍弃关闭事件
  35. def _reFresh(self):#刷新按钮绑定函数
  36. if self.timer.isActive() == True:#如果定时器激活状态
  37. self.timer.stop()#关闭定时器
  38. self.pushButton_2.setText("实时更新")#设置按钮字符
  39. print("关闭定时器......")
  40. else:
  41. self._updateFigure()#刷新界面
  42. self.timer.start(30000)#开启定时器
  43. self.pushButton_2.setText("暂停更新")#设置按钮字符
  44. print("打开定时器......")
  45. def _updateFigure(self):
  46. try:
  47. self._showLine()#显示曲线
  48. except Exception as e:
  49. print(e)
  50. def _showLine(self):
  51. self._canvas.refreshLine()
  52. def _errorProcess(self):
  53. pass
  54. def _createCanvas(self):
  55. self.setWindowTitle(self.title)#设置title
  56. # self.setGeometry(self.left, self.top, self.width, self.height)
  57. self._canvas = PlotCanvas(self, width=5, height=4)#创建matplot对象
  58. def _createLayouts(self):
  59. layout = QHBoxLayout(self.frame)#选定frame组件
  60. layout.setContentsMargins(0, 0, 0, 0)
  61. layout.addWidget(self._canvas) # 添加matplot对象到QT组件内,这是最重要的一个函数,用于将matplotlib和qt绑定
  62. class PlotCanvas(FigureCanvas):#创建一个matplot对象
  63. def __init__(self, parent=None, width=5, height=4, dpi=100):
  64. self._Font = {
  65. 'family': 'SimHei',
  66. 'weight': 'bold',
  67. 'size': 15}
  68. fig = Figure(figsize=(width, height), dpi=dpi)
  69. FigureCanvas.__init__(self, fig)
  70. self.setParent(parent)
  71. FigureCanvas.setSizePolicy(self,QSizePolicy.Expanding,QSizePolicy.Expanding)
  72. FigureCanvas.updateGeometry(self)
  73. self._ax = self.figure.add_subplot(111)
  74. def refreshLine(self):
  75. x = [];y = []#这里自行创建数据
  76. try:
  77. self._ax.plot(x,y, '--r*', label="Matplot Test")#绘图
  78. self._ax.set_title('Matplot Test', fontdict=self._Font)
  79. self._ax.set_xlabel("X轴", fontdict=self._Font)
  80. self._ax.set_ylabel("Y轴", fontdict=self._Font)
  81. self._ax.xaxis.grid(True, which='major') # x坐标轴的网格使用主刻度
  82. self._ax.yaxis.grid(True, which="major")
  83. self.draw()
  84. except Exception as e:
  85. print(e)
  86. def plot(self):
  87. import datetime
  88. price_list = [
  89. {
  90. "PRICE" : "0.0",
  91. "Time" : "2018-01-22 18:56:00"},
  92. {
  93. "PRICE": "0.16461536288261414",
  94. "Time": "2018-01-22 20:07:18"
  95. },
  96. {
  97. "PRICE": "0.0",
  98. "Time": "2018-01-22 20:19:30"
  99. },
  100. {
  101. "PRICE": "0.01397849153727293",
  102. "Time": "2018-01-22 20:31:50"
  103. }
  104. ]
  105. Font = {'family': 'SimHei',
  106. 'weight': 'bold',
  107. 'size': 15}
  108. x = []
  109. y = [] # 定义两个列表
  110. for item in price_list: # 逐年取出单年所有信息
  111. y.append(float(item["PRICE"])) # 价格数值加入y列表
  112. x.append(datetime.datetime.strptime(item["Time"], "%Y-%m-%d %H:%M:%S"))
  113. # print(type(datetime.datetime.strptime(item["Time"], "%Y-%m-%d %H:%M:%S")))
  114. self._ax = self.figure.add_subplot(111)
  115. self._ax.plot(x,y, '--r*',label = "NH3")
  116. self._ax.set_title('测试曲线图',fontdict = self._Font)
  117. self._ax.set_xlabel("时间(\"年-月-日 小时:分:秒\")",fontdict=self._Font)
  118. self._ax.set_ylabel("价格($)",fontdict=self._Font)
  119. self._ax.xaxis.set_major_formatter(mdate.DateFormatter('%Y-%m-%d %H:%M:%S'))
  120. self._ax.xaxis.grid(True, which='major') # x坐标轴的网格使用主刻度
  121. self._ax.yaxis.grid(True, which="major")
  122. # self._ax.xaxis.set_xticklabels(rotation=75)
  123. # for label in self._ax.get_xticklabels() + self._ax.get_yticklabels():
  124. # label.set_fontsize(6)
  125. # label.set_bbox(dict(facecolor='green', edgecolor='None', alpha=0.7))
  126. # self._ax.xticklabels(rotation=75)
  127. # self.xticks(rotation=75)
  128. self.draw()
  129. if __name__ == "__main__":
  130. import sys
  131. app =QApplication(sys.argv)
  132. window = App()#创建QT对象
  133. window.show()#QT对象显示
  134. sys.exit(app.exec_())

 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号