
PIL中的ImageGrab模块
windows API
PyQt
pyautogui
使用Selenium截图
使用PIL中的ImageGrab模块简单,但是效率有点低,截屏一次需0.5s。
调用windows API,速度快但是使用较复杂,这里就不做详细介绍了,因为有更好用的PyQt。
PyQt比调用windows API简单很多,而且有windows API的很多优势,比如速度快,可以指定获取的窗口,即使窗口被遮挡。需注意的是,窗口最小化时无法获取截图。
首先需要获取窗口的句柄。
程序会打印窗口的hwnd和title,有了title就可以进行截图了。
pyautogui是比较简单的,但是不能指定获取程序的窗口,因此窗口也不能遮挡,不过可以指定截屏的位置,0.04s一张截图,比PyQt稍慢一点,但也很快了。
使用Selenium只能进行WEB程序截图
最主要的原因就是Tkinter参考资料太少,只能满足基本GUI开发(界面美观程度要求不高),因此使用的人比较少,而PyQt和wxPython参考资料丰富,可以直接拖拽控件,界面设计美化容易,因此使用的人比较多,下面我简单介绍一下这2个模块的安装和使用,感兴趣的朋友可以自己尝试一下:wxPython
这是Python一个非常不错的GUI开发库,免费、开源、跨平台,可用组件众多,借助这些组件,程序员可以快速创建完整、功能全面的用户界面,因此应用非常广泛,下面我简单介绍一下这个库:
1.首先,安装wxPython,这个直接在cmd窗口输入安装命令“pip install wxpython”就行,如下,我的Python环境已正确安装:
2.安装完成后,我们就可以直接编写代码来测试这个模块了,代码如下,非常简单,一个文本编辑器,根据路径打开文件,然后编辑再保存:
程序运行截图如下,效果还是非常不错的:
PyQt
这是一个基于Qt的Python接口包,借助于Qt强大的可视化功能,Python也可以快速开发一个功能强大、界面美观的GUI程序(可以直接拖拽控件),下面我简单介绍一下这个库:
1.首先,安装PyQt,这个也直接在cmd窗口输入命令“pip install pyqt5”就行,如下,安装的过程需要耐心等待一会儿:
2.安装完成后,我们就可以直接打开Qt自带的设计工具Qt Designer进行界面设计了,默认在site-packages->PyQt5->Qt->bin目录下,所有控件都可以直接拖拽,而且可以使用QSS进行美化,非常方便,如下:
3.设计完成后,使用pyuic5工具进行转化,就会自动生成对应Python代码,如下,不需要我们再手动去一行一行编写,调整布局:
4.最后再加一个main函数,创建上面的类对象,就可以显示我们创建的界面了,如下:
运行程序,截图如下,就是我们刚才设计的GUI界面,非常方便吧,再绑定信号和槽函数,就可以进行用户响应啦:
至此,我们就介绍完了PyQt和wxPython这2个模块的简单安装和使用。总的来说,对于界面简单、功能要求不高的GUI设计来说,Tkinter完全可以胜任,但是对于功能比较复杂、界面美化程度较高的GUI来说,PyQT和wxPython更容易,也更好实现,网上也有相关教程和资料,介绍的非常详细,感兴趣的话,可以搜一下,希望以上分享的内容能对你有所帮助吧,也欢迎大家评论、留言进行补充。
通过实现任意两个经纬度计算两点之间的距离为例子
程序生成截图:
#以下是GUI图形界面的创建
from PyQt5import QtCore, QtGui, QtWidgets
from mathimport *
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 599)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.label_2 = QtWidgets.QLabel(self.centralwidget)
self.label_2.setGeometry(QtCore.QRect(70, 90, 41, 16))
self.label_2.setObjectName("label_2")
self.label_5 = QtWidgets.QLabel(self.centralwidget)
self.label_5.setGeometry(QtCore.QRect(70, 150, 41, 9))
self.label_5.setObjectName("label_5")
self.label_6 = QtWidgets.QLabel(self.centralwidget)
self.label_6.setGeometry(QtCore.QRect(50, 230, 41, 9))
self.label_6.setObjectName("label_6")
self.label_3 = QtWidgets.QLabel(self.centralwidget)
self.label_3.setGeometry(QtCore.QRect(270, 90, 41, 16))
self.label_3.setObjectName("label_3")
self.label_7 = QtWidgets.QLabel(self.centralwidget)
self.label_7.setGeometry(QtCore.QRect(270, 150, 41, 9))
self.label_7.setObjectName("label_7")
self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit.setGeometry(QtCore.QRect(50, 110, 71, 31))
self.lineEdit.setObjectName("lineEdit")
self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit_2.setGeometry(QtCore.QRect(50, 170, 71, 31))
self.lineEdit_2.setObjectName("lineEdit_2")
self.lineEdit_3 = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit_3.setGeometry(QtCore.QRect(250, 110, 71, 31))
self.lineEdit_3.setObjectName("lineEdit_3")
self.lineEdit_4 = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit_4.setGeometry(QtCore.QRect(250, 170, 71, 31))
self.lineEdit_4.setObjectName("lineEdit_4")
self.lineEdit_5 = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit_5.setGeometry(QtCore.QRect(80, 220, 71, 31))
self.lineEdit_5.setObjectName("lineEdit_5")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(170, 300, 56, 17))
self.pushButton.setObjectName("pushButton")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 18))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
self.pushButton.clicked.connect(self.btnshanbing_click)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.label_2.setText(_translate("MainWindow", "经度"))
self.label_5.setText(_translate("MainWindow", "经度"))
self.label_6.setText(_translate("MainWindow", "距离"))
self.label_3.setText(_translate("MainWindow", "经度"))
self.label_7.setText(_translate("MainWindow", "经度"))
self.pushButton.setText(_translate("MainWindow", "确定"))
#以下是btnshanbing_click信号的槽函数
def btnshanbing_click(self):
#以下是将文本框里面的内容读取出来同时将里面的类型转换为浮点型
a=float(self.lineEdit.text())
c=float(self.lineEdit_2.text())
b=float(self.lineEdit_3.text())
d=float(self.lineEdit_4.text())
#以下是经纬度计算公式
e=(acos(sin(b * pi /180) * sin(d * pi /180) + cos(c * pi /180 - a * pi /180) * cos(b * pi /180) * cos(d * pi /180)))*6371004
#以下是将计算的结果生成在LineEdit_5里面去,但是要注意的是必须将计算的结果转换为字符型,否则程序运行不起来
self.lineEdit_5.setText(str(e))
主程序:
self.lineEdit.text():读取文本框里面的内容,但是要做计算必须转换为float(self.lineEdit.text())浮点型才能做运算,否则不能运算
self.lineEdit_5.setText(str()):将计算的结果生成在另一个文本框里面必须转换为字符型,否则程序会报错。
综上所述:lineEdit.text()的返回类型为文本型
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)