PyQt5 基本窗口控件(绘图类 / 拖拽 / 剪贴板 / 日历时间 / 菜单、工具、状态栏 / 打印)

文章目录

    • 1. 窗口绘图类
      • 1.1 QPainter
        • 绘制文字
        • 绘制点
      • 1.2 QPen
      • 1.3 QBrush
      • 1.4 QPixmap
    • 2. 拖拽与剪贴板
      • 2.1 拖拽
      • 2.2 剪贴板 QClipboard
    • 3. 日历与时间
      • 3.1 QCalendar
      • 3.2 QDateTimeEdit
    • 4. 菜单栏、工具栏、状态栏
      • 4.1 菜单栏 QMenuBar
      • 4.2 工具栏 QToolBar
      • 4.3 状态栏 QStatusBar
    • 5. QPrinter

learn from 《PyQt5 快速开发与实战》
https://doc.qt.io/qtforpython/index.html
https://www.riverbankcomputing.com/static/Docs/PyQt5

1. 窗口绘图类

1.1 QPainter

  • QWidget上执行绘图操作
  • QWidget.paintEvent() 中完成,绘制方法必须在 QtGui.QPainter对象的 begin()end() 之间

绘制文字

# _*_ coding: utf-8 _*_
# @Time : 2022/5/6 9:26
# @Author : Michael
# @File : painter1.py
# @desc :
import sysfrom PyQt5.QtGui import QPainter, QColor, QFont
from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5.QtCore import Qtclass drawing_demo(QWidget):def __init__(self):super().__init__()self.setWindowTitle("绘图示例")self.resize(300, 300)self.text = "Hello 麦克"def paintEvent(self, event): # 函数名不能变painter = QPainter(self)painter.begin(self)  # 开始绘制, 需要传入 selfself.drawText(event, painter) # 自定义绘制painter.end()def drawText(self, event, painter):painter.setPen(QColor(168, 150, 3)) # 设置画笔颜色painter.setFont(QFont("SimSun", 20))  # 设置字体painter.drawText(event.rect(), Qt.AlignCenter, self.text)if __name__ == '__main__':app = QApplication(sys.argv)demo = drawing_demo()demo.show()sys.exit(app.exec_())

在这里插入图片描述

绘制点

# _*_ coding: utf-8 _*_
# @Time : 2022/5/6 9:56
# @Author : Michael
# @File : draw_point.py
# @desc :
import mathfrom PyQt5.QtGui import QPainter
from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5.QtCore import Qtclass drawPoint(QWidget):def __init__(self):super(drawPoint, self).__init__()self.setWindowTitle("绘制点")self.resize(500, 300)def paintEvent(self, event):painter = QPainter()painter.begin(self)  # 必须加 self 参数self.drawpoint(painter)painter.end()def drawpoint(self, painter):painter.setPen(Qt.red)size = self.size()print('size,', size)for i in range(1000):# 绘制正弦函数曲线x = int(100*(-1+2.0*i/1000)+size.width()/2)y = int(-50*math.sin((x-size.width()/2)*math.pi/50)+size.height()/2)painter.drawPoint(x, y)
if __name__ == '__main__':import sysapp = QApplication(sys.argv)main = drawPoint()main.show()sys.exit(app.exec_())

只要点击窗口或者窗口大小发生变化,就会进行重绘
在这里插入图片描述

1.2 QPen

钢笔,用于绘制曲线,直线,轮廓等

# _*_ coding: utf-8 _*_
# @Time : 2022/5/6 22:28
# @Author : Michael
# @File : qpen_demo.py
# @desc :
import sysfrom PyQt5.QtGui import QPainter, QPen
from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5.QtCore import Qtclass qpenDemo(QWidget):def __init__(self):super(qpenDemo, self).__init__()self.setGeometry(300, 300, 280, 270)self.setWindowTitle("钢笔样式")def paintEvent(self, event):  # paintEvent 名字大小写需要一致,重写父类的方法painter = QPainter()painter.begin(self)  # 需要加入selfself.drawlines(painter)painter.end()def drawlines(self, painter):pen = QPen(Qt.black, 2, Qt.SolidLine)painter.setPen(pen)painter.drawLine(20, 40, 250, 40)# 参数 线的起点终点 x1, y1 -> x2, y2, 且最终笔在 x2, y2pen.setStyle(Qt.DashLine)painter.setPen(pen)painter.drawLine(20, 80, 250, 80)pen.setStyle(Qt.DashDotLine)painter.setPen(pen)painter.drawLine(20, 120, 250, 120)pen.setStyle(Qt.DotLine)painter.setPen(pen)painter.drawLine(20, 160, 250, 160)pen.setStyle(Qt.DashDotDotLine)painter.setPen(pen)painter.drawLine(20, 200, 250, 200)pen.setStyle(Qt.CustomDashLine)pen.setDashPattern([1, 4, 5, 4]) painter.setPen(pen)painter.drawLine(20, 240, 250, 240)
if __name__ == '__main__':app = QApplication(sys.argv)ex = qpenDemo()ex.show()sys.exit(app.exec_())

setDashPattern

The pattern must be specified as an even number of positive entries
where the entries 1, 3, 5… are the dashes and 2, 4, 6… are the spaces.

在这里插入图片描述

1.3 QBrush

  • 用于填充形状,有预定义、纹理图案、过渡3种类型
# _*_ coding: utf-8 _*_
# @Time : 2022/5/6 22:58
# @Author : Michael
# @File : qbrush_demo.py
# @desc :import sysfrom PyQt5.QtGui import QPainter, QPen, QBrush, QColor, QFont
from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5.QtCore import Qt, QRectclass qpenDemo(QWidget):def __init__(self):super(qpenDemo, self).__init__()self.setGeometry(300, 300, 280, 270)self.setWindowTitle("钢笔样式")def paintEvent(self, event):  # paintEvent 名字大小写需要一致,重写父类的方法painter = QPainter()painter.begin(self)  # 需要加入selfself.drawlines(painter)painter.end()def drawlines(self, painter):brush = QBrush(Qt.SolidPattern)painter.setBrush(brush)painter.drawRect(10, 15, 90, 60)painter.setPen(QColor(168, 150, 3))  # 设置画笔颜色painter.setFont(QFont("SimSun", 7))  # 设置字体painter.drawText(QRect(10, 65, 90, 60), Qt.AlignCenter, 'SolidPattern')brush.setStyle(Qt.Dense1Pattern)painter.setBrush(brush)painter.drawRect(130, 15, 90, 60)painter.setPen(QColor(168, 150, 3))painter.setFont(QFont("SimSun", 7))painter.drawText(QRect(130, 65, 90, 60), Qt.AlignCenter, 'Dense1Pattern')brush.setStyle(Qt.Dense2Pattern)painter.setBrush(brush)painter.drawRect(250, 15, 90, 60)painter.setPen(QColor(168, 150, 3))painter.setFont(QFont("SimSun", 7))painter.drawText(QRect(250, 65, 90, 60), Qt.AlignCenter, 'Dense2Pattern')brush.setStyle(Qt.Dense3Pattern)painter.setBrush(brush)painter.drawRect(10, 285, 90, 60)painter.setPen(QColor(168, 150, 3))painter.setFont(QFont("SimSun", 7))painter.drawText(QRect(10, 335, 90, 60), Qt.AlignCenter, 'Dense3Pattern')brush.setStyle(Qt.DiagCrossPattern)painter.setBrush(brush)painter.drawRect(10, 105, 90, 60)painter.setPen(QColor(168, 150, 3))painter.setFont(QFont("SimSun", 7))painter.drawText(QRect(10, 155, 120, 60), Qt.AlignCenter, 'DiagCrossPattern')brush.setStyle(Qt.Dense5Pattern)painter.setBrush(brush)painter.drawRect(130, 105, 90, 60)painter.setPen(QColor(168, 150, 3))painter.setFont(QFont("SimSun", 7))painter.drawText(QRect(130, 155, 90, 60), Qt.AlignCenter, 'Dense5Pattern')brush.setStyle(Qt.Dense6Pattern)painter.setBrush(brush)painter.drawRect(250, 105, 90, 60)painter.setPen(QColor(168, 150, 3))painter.setFont(QFont("SimSun", 7))painter.drawText(QRect(250, 155, 90, 60), Qt.AlignCenter, 'Dense6Pattern')brush.setStyle(Qt.HorPattern)painter.setBrush(brush)painter.drawRect(10, 195, 90, 60)painter.setPen(QColor(168, 150, 3))painter.setFont(QFont("SimSun", 7))painter.drawText(QRect(10, 245, 90, 60), Qt.AlignCenter, 'HorPattern')brush.setStyle(Qt.VerPattern)painter.setBrush(brush)painter.drawRect(130, 195, 90, 60)painter.setPen(QColor(168, 150, 3))painter.setFont(QFont("SimSun", 7))painter.drawText(QRect(130, 245, 90, 60), Qt.AlignCenter, 'VerPattern')brush.setStyle(Qt.BDiagPattern)painter.setBrush(brush)painter.drawRect(250, 195, 90, 60)painter.setPen(QColor(168, 150, 3))painter.setFont(QFont("SimSun", 7))painter.drawText(QRect(250, 245, 90, 60), Qt.AlignCenter, 'BDiagPattern')if __name__ == '__main__':app = QApplication(sys.argv)ex = qpenDemo()ex.show()sys.exit(app.exec_())

在这里插入图片描述

1.4 QPixmap

  • 显示图像用的
# _*_ coding: utf-8 _*_
# @Time : 2022/5/6 23:20
# @Author : Michael
# @File : qpixmap.py
# @desc :
import sysfrom PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayoutif __name__ == '__main__':app = QApplication(sys.argv)win = QWidget()label1 = QLabel()label1.setPixmap(QPixmap('logo.png'))vbox = QVBoxLayout()vbox.addWidget(label1)win.setLayout(vbox)win.setWindowTitle('QPixmap')win.show()sys.exit(app.exec_())

在这里插入图片描述

2. 拖拽与剪贴板

2.1 拖拽

  • 允许拖拽的控件,需要设置 QWidget.setDragEnabled()True

MIME介绍 :https://baike.baidu.com/item/MIME/2900607?fr=aladdin

DragEnterEvent,当执行一个拖曳控件操作,并且鼠标指针进入该控件时,这个事件将被触发,在这个事件中可以获得被操作的窗口控件,还可以有条件地接受或拒绝该拖曳操作
DragMoveEvent,在拖曳操作进行时会触发该事件
DragLeaveEvent,当执行一个拖曳控件操作,并且鼠标指针离开该控件时,这个事件将被触发
DropEvent,当拖曳操作在目标控件上被释放时,这个事件将被触发

# _*_ coding: utf-8 _*_
# @Time : 2022/5/6 23:36
# @Author : Michael
# @File : drag_demo.py
# @desc :
from PyQt5.QtWidgets import QComboBox, QWidget, QFormLayout, QLabel, QLineEdit, QApplicationclass combo(QComboBox):def __init__(self, title, parent):super(combo, self).__init__(parent)self.setAcceptDrops(True)def dragEnterEvent(self, e):  # 重写dragEnterEvent方法print(e, e.mimeData().text())if e.mimeData().hasText():e.accept()else:e.ignore()def dropEvent(self, e):self.addItem(e.mimeData().text())class Example(QWidget):def __init__(self):super(Example, self).__init__()self.initUI()def initUI(self):layout = QFormLayout()label = QLabel('把左边的文本拖拽到右边的下拉框中')layout.addRow(label)edit1 = QLineEdit("我是一个文本框")edit1.setDragEnabled(True)com = combo('button', self)layout.addRow(edit1, com)self.setLayout(layout)self.setWindowTitle('拖拽')
if __name__ == '__main__':import sysapp = QApplication(sys.argv)ex = Example()ex.show()sys.exit(app.exec_())

选中一些文字,按住 Ctrl 移动鼠标到 下拉列表处

在这里插入图片描述

2.2 剪贴板 QClipboard

  • QApplication类有一个静态方法clipboard(), 它返回对剪贴板对象的引用
  • 任何类型的MimeData都可以从 剪贴板 复制或粘贴

常用信号:dataChanged 剪贴板内容发生变化时 发射信号

# _*_ coding: utf-8 _*_
# @Time : 2022/5/7 9:38
# @Author : Michael
# @File : clipboard_demo.py
# @desc :
import sysfrom PyQt5.QtCore import QMimeData
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QDialog, QPushButton, QLabel, QGridLayout, QApplicationclass myForm(QDialog):def __init__(self):super().__init__()textCopyButton = QPushButton("&Copy Text")textPasteButton = QPushButton("Paste &Text")htmlCopyButton = QPushButton("C&opy HTML")htmlPasteButton = QPushButton("Paste &HTML")imageCopyButton = QPushButton("Co&py Image")imagePasteButton = QPushButton("Paste &Image")self.textlabel = QLabel('原始文字')self.imagelabel = QLabel()self.imagelabel.setPixmap(QPixmap('../store.png'))layout = QGridLayout()layout.addWidget(textCopyButton, 0, 0)layout.addWidget(textPasteButton, 0, 1)layout.addWidget(htmlCopyButton, 1, 0)layout.addWidget(htmlPasteButton, 1, 1)layout.addWidget(imageCopyButton, 2, 0)layout.addWidget(imagePasteButton, 2, 1)layout.addWidget(self.textlabel, 3, 0, 1, 2)layout.addWidget(self.imagelabel, 4, 0, 1, 2)self.setLayout(layout)self.setWindowTitle("Clipboard Demo")textCopyButton.clicked.connect(self.copyText)textPasteButton.clicked.connect(self.pasteText)htmlCopyButton.clicked.connect(self.copyHtml)htmlPasteButton.clicked.connect(self.pasteHtml)imageCopyButton.clicked.connect(self.copyImage)imagePasteButton.clicked.connect(self.pasteImage)def copyText(self):clipboard = QApplication.clipboard()clipboard.setText("Hello PyQt5")def pasteText(self):clipboard = QApplication.clipboard()self.textlabel.setText(clipboard.text())def copyHtml(self):mimeData = QMimeData()mimeData.setHtml("<b><font color=red>你好,michael</font></b>")clipboard = QApplication.clipboard()clipboard.setMimeData(mimeData)def pasteHtml(self):clipboard = QApplication.clipboard()mimeData = clipboard.mimeData()if mimeData.hasHtml():self.textlabel.setText(mimeData.html())def copyImage(self):clipboard = QApplication.clipboard()clipboard.setPixmap(QPixmap('logo.png'))def pasteImage(self):clipboard = QApplication.clipboard()self.imagelabel.setPixmap(clipboard.pixmap())if __name__ == '__main__':app = QApplication(sys.argv)w = myForm()w.show()sys.exit(app.exec_())

在这里插入图片描述

3. 日历与时间

3.1 QCalendar

  • 日历控件,基于月的视图
# _*_ coding: utf-8 _*_
# @Time : 2022/5/8 19:40
# @Author : Michael
# @File : calendar_demo.py
# @desc :
from PyQt5.QtCore import QDate
from PyQt5.QtWidgets import QWidget, QCalendarWidget, QLabel, QApplicationclass CalendarDemo(QWidget):def __init__(self):super(CalendarDemo, self).__init__()self.initUI()def initUI(self):self.cal = QCalendarWidget(self)self.cal.setGridVisible(True)self.cal.move(20, 50)self.cal.setMinimumDate(QDate(2000, 1, 1))self.cal.setMaximumDate(QDate(2100, 12, 31))self.cal.clicked[QDate].connect(self.showDate)self.label1 = QLabel(self)date = self.cal.selectedDate()self.label1.setText(date.toString('yyyy-MM-dd dddd'))self.label1.move(20, 10)self.setGeometry(300, 300, 300, 300)self.setWindowTitle('Calendar')def showDate(self, date):self.label1.setText(date.toString('yyyy-MM-dd dddd'))if __name__ == '__main__':import sysapp = QApplication(sys.argv)w = CalendarDemo()w.show()sys.exit(app.exec_())

在这里插入图片描述

3.2 QDateTimeEdit

  • 一个允许用户编辑日期时间的控件

在这里插入图片描述

4. 菜单栏、工具栏、状态栏

4.1 菜单栏 QMenuBar

# _*_ coding: utf-8 _*_
# @Time : 2022/5/8 20:24
# @Author : Michael
# @File : menubar_demo.py
# @desc :
from PyQt5.QtWidgets import QMainWindow, QHBoxLayout, QAction, QApplicationclass MenuBarDemo(QMainWindow):def __init__(self):super(MenuBarDemo, self).__init__()layout = QHBoxLayout()bar = self.menuBar() # 获取菜单栏file = bar.addMenu('文件') # 创建菜单栏文件菜单file.addAction('新建') # 在文件菜单中添加新建菜单save = QAction('保存', self) # 创建保存菜单save.setShortcut('Ctrl+S') # 设置快捷键file.addAction(save) # 在文件菜单中添加保存菜单edit = file.addMenu('编辑') # 在文件菜单中创建编辑菜单edit.addAction('复制') # 在编辑菜单中添加复制菜单edit.addAction('粘贴') # 在编辑菜单中添加粘贴菜单quit = QAction('退出', self) # 创建退出菜单quit.setShortcut('Ctrl+Q') # 设置快捷键file.addAction(quit) # 在文件菜单中添加退出菜单file.triggered[QAction].connect(self.processTrigger) # 菜单触发事件self.setLayout(layout)self.setWindowTitle('菜单栏demo')def processTrigger(self, q):print(q.text(), '被点击了')if __name__ == '__main__':import sysapp = QApplication(sys.argv)win = MenuBarDemo()win.show()sys.exit(app.exec_())

在这里插入图片描述

4.2 工具栏 QToolBar

工具栏通常可移动,位于菜单栏下方

# _*_ coding: utf-8 _*_
# @Time : 2022/5/8 20:36
# @Author : Michael
# @File : toolbar_demo.py
# @desc :
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QMainWindow, QVBoxLayout, QAction, QApplicationclass ToolBarDemo(QMainWindow):def __init__(self):super(ToolBarDemo, self).__init__()self.setWindowTitle('ToolBar')self.resize(300, 200)layout = QVBoxLayout()toolbar = self.addToolBar('文件')new = QAction(QIcon('../store.png'), '新建', self)toolbar.addAction(new)toolbar.actionTriggered[QAction].connect(self.toolbuttonPressed)open = QAction(QIcon('logo.png'), '打开', self)toolbar.addAction(open)self.setLayout(layout)def toolbuttonPressed(self, q):print("按下了:", q.text())if __name__ == '__main__':import sysapp = QApplication(sys.argv)main = ToolBarDemo()main.show()sys.exit(app.exec_())

在这里插入图片描述

4.3 状态栏 QStatusBar

MainWindow 对象 底部保留有一个水平状态栏,显示永久 or 临时 信息

# _*_ coding: utf-8 _*_
# @Time : 2022/5/8 20:53
# @Author : Michael
# @File : statusBar_demo.py
# @desc :
from PyQt5.QtWidgets import QMainWindow, QAction, QTextEdit, QStatusBar, QApplicationclass StatusBarDemo(QMainWindow):def __init__(self):super(StatusBarDemo, self).__init__()bar = self.menuBar()file = bar.addMenu('&File')file.addAction('&New')file.triggered[QAction].connect(self.processTrigger)self.setCentralWidget(QTextEdit())self.status_bar = QStatusBar()self.setWindowTitle("状态栏例子")self.setStatusBar(self.status_bar)def processTrigger(self, q):if q.text() == '&New':self.status_bar.showMessage(q.text() + ' was triggered', 3000)
if __name__ == '__main__':import sysapp = QApplication(sys.argv)main = StatusBarDemo()main.show()sys.exit(app.exec_())

在这里插入图片描述

5. QPrinter

其本质上也是一个绘图设备 QPaintDevice

# _*_ coding: utf-8 _*_
# @Time : 2022/5/8 21:14
# @Author : Michael
# @File : qprinter.py
# @desc :
from PyQt5.QtGui import QImage, QPixmap, QIcon, QPainter
from PyQt5.QtPrintSupport import QPrinter, QPrintDialog
from PyQt5.QtWidgets import QMainWindow, QLabel, QSizePolicy, QAction, QApplication
from PyQt5.QtCore import Qt, QPointclass printer_demo(QMainWindow):def __init__(self):super(printer_demo, self).__init__()self.setWindowTitle(self.tr("打印测试"))  # tr 函数用于以后翻译为其他语言self.imageLabel = QLabel()self.imageLabel.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)self.setCentralWidget(self.imageLabel)self.image = QImage()self.createActions()self.createMenus()self.createToolBars()if self.image.load('logo.png'):self.imageLabel.setPixmap(QPixmap.fromImage(self.image))self.resize(self.image.width(), self.image.height())def createActions(self):self.printAct = QAction(QIcon('../store.png'), self.tr("打印哦"), self)self.printAct.setShortcut('Ctrl+P')self.printAct.setStatusTip(self.tr("打印图像"))self.printAct.triggered.connect(self.printImage)def createMenus(self):printmenu = self.menuBar().addMenu(self.tr("打印菜单"))printmenu.addAction(self.printAct) #def createToolBars(self):printToolBar = self.addToolBar(self.tr("打印!"))printToolBar.addAction(self.printAct)def printImage(self):printer = QPrinter()printDialog = QPrintDialog(printer, self)if printDialog.exec_():print('打印中...')painter = QPainter(printer)rect = painter.viewport()print(rect)size = self.image.size()print(size)size.scale(rect.size(), Qt.KeepAspectRatio)print('after scale: ', size)painter.setViewport(rect.x(), rect.y(), size.width(), size.height())painter.setWindow(self.image.rect())print(self.image.rect())painter.drawImage(QPoint(0, 0), self.image)
if __name__ == '__main__':import sysapp = QApplication(sys.argv)window = printer_demo()window.show()sys.exit(app.exec_())

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/471014.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python网络爬虫系列(0)——爬虫概述 http协议复习

一、爬虫概述 知识点&#xff1a; 了解 爬虫的概念 了解 爬虫的作用 了解 爬虫的分类 掌握 爬虫的流程 1. 爬虫的概念 模拟浏览器&#xff0c;发送请求&#xff0c;获取响应 网络爬虫&#xff08;又被称为网页蜘蛛&#xff0c;网络机器人&#xff09;就是模拟客户端(主要指…

使用TFHpple解析html

https://github.com/topfunky/hpple 前期准备工作 引入静态库文件 添加库文件的 header search paths(注意,必须选中 All) 将从github上下载的源码包拖入工程当中 准备工作结束 使用详情 我们来解析网址 http://www.cnblogs.com/YouXianMing/ 中的title标签哦. 思路是这样子的:…

LeetCode 2269. 找到一个数字的 K 美丽值

文章目录1. 题目2. 解题1. 题目 一个整数 num 的 k 美丽值定义为 num 中符合以下条件的 子字符串 数目&#xff1a; 子字符串长度为 k 。子字符串能整除 num 。 给你整数 num 和 k &#xff0c;请你返回 num 的 k 美丽值。 注意&#xff1a; 允许有 前缀 0 。 0 不能整除任…

LeetCode 2270. 分割数组的方案数(前缀和)

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始长度为 n 的整数数组 nums 。 如果以下描述为真&#xff0c;那么 nums 在下标 i 处有一个 合法的分割 &#xff1a; 前 i 1 个元素的和 大于等于 剩下的 n - i - 1 个元素的和。下标 i 的右边 至少有一个 元素&#xff…

python网络爬虫系列(五)——数据提取 jsonpath模块

一、数据提取概述 知识点 了解 响应内容的分类了解 xml和html的区别 1. 响应内容的分类 在发送请求获取响应之后&#xff0c;可能存在多种不同类型的响应内容&#xff1b;而且很多时候&#xff0c;我们只需要响应内容中的一部分数据 结构化的响应内容 json字符串 可以使用re、…

LeetCode 2271. 毯子覆盖的最多白色砖块数(前缀和+二分查找)

文章目录1. 题目2. 解题1. 题目 给你一个二维整数数组 tiles &#xff0c;其中 tiles[i] [li, ri] &#xff0c;表示所有在 li < j < ri 之间的每个瓷砖位置 j 都被涂成了白色。 同时给你一个整数 carpetLen &#xff0c;表示可以放在 任何位置 的一块毯子。 请你返回…

Nimbus三Storm源码分析--Nimbus启动过程

Nimbus server, 首先从启动命令开始, 同样是使用storm命令"storm nimbus”来启动看下源码, 此处和上面client不同, jvmtype"-server", 最终调用"backtype.storm.daemon.nimbus"的mainnimbus是用clojure实现的, 但是clojure是基于JVM的, 所以在最终发布…

python网络爬虫系列(六)——数据提取 lxml模块

一、数据提取-lxml模块 知识点 了解 lxml模块和xpath语法的关系了解 lxml模块的使用场景了解 lxml模块的安装了解 谷歌浏览器xpath helper插件的安装和使用掌握 xpath语法-基础节点选择语法掌握 xpath语法-节点修饰语法掌握 xpath语法-其他常用语法掌握 lxml模块中使用xpath语…

LeetCode 2273. 移除字母异位词后的结果数组

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始的字符串 words &#xff0c;其中 words[i] 由小写英文字符组成。 在一步操作中&#xff0c;需要选出任一下标 i &#xff0c;从 words 中 删除 words[i] 。其中下标 i 需要同时满足下述两个条件&#xff1a; 0 < i …

python网络爬虫系列(七)——selenium的介绍 selenium定位获取标签对象并提取数据 selenium的其它使用方法

一、selenium的介绍 知识点&#xff1a; 了解 selenium的工作原理了解 selenium以及chromedriver的安装掌握 标签对象click点击以及send_keys输入 1. selenium运行效果展示 Selenium是一个Web的自动化测试工具&#xff0c;最初是为网站自动化测试而开发的&#xff0c;Seleniu…

LeetCode 2274. 不含特殊楼层的最大连续楼层数

文章目录1. 题目2. 解题1. 题目 Alice 管理着一家公司&#xff0c;并租用大楼的部分楼层作为办公空间。 Alice 决定将一些楼层作为 特殊楼层 &#xff0c;仅用于放松。 给你两个整数 bottom 和 top &#xff0c;表示 Alice 租用了从 bottom 到 top&#xff08;含 bottom 和 t…

python网络爬虫系列(八)——常见的反爬手段和解决方法

常见的反爬手段和解决思路 学习目标 了解 服务器反爬的原因了解 服务器常反什么样的爬虫了解 反爬虫领域常见的一些概念了解 反爬的三个方向了解 常见基于身份识别进行反爬了解 常见基于爬虫行为进行反爬了解 常见基于数据加密进行反爬 1 服务器反爬的原因 爬虫占总PV(PV是指…

LeetCode 2275. 按位与结果大于零的最长组合(位运算)

文章目录1. 题目2. 解题1. 题目 对数组 nums 执行 按位与 相当于对数组 nums 中的所有整数执行 按位与 。 例如&#xff0c;对 nums [1, 5, 3] 来说&#xff0c;按位与等于 1 & 5 & 3 1 。同样&#xff0c;对 nums [7] 而言&#xff0c;按位与等于 7 。 给你一个…

python网络爬虫系列(九)——打码平台的使用

验证码处理 学习目标 了解 验证码的相关知识掌握 图片识别引擎的使用了解 常见的打码平台掌握 通过打码平台处理验证码的方法 1.图片验证码 1.1 什么是图片验证码 验证码&#xff08;CAPTCHA&#xff09;是“Completely Automated Public Turing test to tell Computers an…

LeetCode 2278. 字母在字符串中的百分比

文章目录1. 题目2. 解题1. 题目 给你一个字符串 s 和一个字符 letter &#xff0c;返回在 s 中等于 letter 字符所占的 百分比 &#xff0c;向下取整到最接近的百分比。 示例 1&#xff1a; 输入&#xff1a;s "foobar", letter "o" 输出&#xff1a;3…

python网络爬虫系列(十)——chrome在爬虫中的使用

chrome浏览器使用方法介绍 学习目标 了解 新建隐身窗口的目的了解 chrome中network的使用了解 寻找登录接口的方法 1 新建隐身窗口 浏览器中直接打开网站&#xff0c;会自动带上之前网站时保存的cookie&#xff0c;但是在爬虫中首次获取页面是没有携带cookie的&#xff0c;这…

LeetCode 2279. 装满石头的背包的最大数量(贪心)

文章目录1. 题目2. 解题1. 题目 现有编号从 0 到 n - 1 的 n 个背包。 给你两个下标从 0 开始的整数数组 capacity 和 rocks 。 第 i 个背包最大可以装 capacity[i] 块石头&#xff0c;当前已经装了 rocks[i] 块石头。 另给你一个整数 additionalRocks &#xff0c;表示你可以…

python网络爬虫系列(十一)——JS的解析

JS的解析 学习目标&#xff1a; 了解 定位js的方法了解 添加断点观察js的执行过程的方法应用 js2py获取js的方法 1 确定js的位置 对于前面人人网的案例&#xff0c;我们知道了url地址中有部分参数&#xff0c;但是参数是如何生成的呢&#xff1f; 毫无疑问&#xff0c;参数肯…

[Leetcode]@python 107. Binary Tree Level Order Traversal II

题目链接 https://leetcode.com/problems/binary-tree-level-order-traversal-ii/ 题目原文 Given a binary tree, return the bottom-up level order traversal of its nodes values. (ie, from left to right, level by level from leaf to root). For example: Given binary…

LeetCode 2280. 表示一个折线图的最少线段数(几何)

文章目录1. 题目2. 解题1. 题目 给你一个二维整数数组 stockPrices &#xff0c;其中 stockPrices[i] [dayi, pricei] 表示股票在 dayi 的价格为 pricei 。 折线图 是一个二维平面上的若干个点组成的图&#xff0c;横坐标表示日期&#xff0c;纵坐标表示价格&#xff0c;折线…