PyQt5 基本窗口控件(按钮类/对话框类)

文章目录

    • 1. 按钮类
      • 1.1 QPushButton
      • 1.2 QRadioButton
      • 1.3 QCheckBox
      • 1.4 QComboBox 下拉列表
      • 1.5 QSpinBox 计数器
      • 1.6 QSlider 滑动条
    • 2. 对话框类
      • 2.1 QDialog
      • 2.2 QMessageBox
      • 2.3 QInputDialog
      • 2.4 QFontDialog
      • 2.5 QFileDialog

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

1. 按钮类

所有的按钮都是继承自 QAbstractButton

1.1 QPushButton

  • 长方形,文本标题 or 图标

设置快捷键:QPushButton('&Download')& 后面的字符就是快捷键,ALT + D 执行

# _*_ coding: utf-8 _*_
# @Time : 2022/5/4 21:01
# @Author : Michael
# @File : qpush_button1.py
# @desc :import sysfrom PyQt5.QtGui import QIcon, QPixmap
from PyQt5.QtWidgets import QDialog, QVBoxLayout, QPushButton, QApplicationclass Form(QDialog):def __init__(self, parent=None):super().__init__(parent)self.setWindowTitle("QPushButton例子")layout = QVBoxLayout()self.button1 = QPushButton("Button1")self.button1.setCheckable(True)  # 设置按钮已经被选中,表示按钮保持已点击和释放状态self.button1.toggle()  # 切换按钮的状态self.button1.clicked.connect(lambda: self.whichButton(self.button1))# lambda 函数作用,可以传递更多的参数进去 self.button1self.button1.clicked.connect(self.btnstate)layout.addWidget(self.button1)self.button2 = QPushButton("image")self.button2.setIcon(QIcon(QPixmap("logo.png"))) # 设置图标self.button2.clicked.connect(lambda: self.whichButton(self.button2))layout.addWidget(self.button2)self.button3 = QPushButton("disabled button")self.button3.setEnabled(False) # 禁用layout.addWidget(self.button3)self.button4 = QPushButton("&Cancel")self.button4.setDefault(True)self.button4.clicked.connect(lambda: self.whichButton(self.button4))layout.addWidget(self.button4)self.setLayout(layout)def btnstate(self):if self.button1.isChecked():print("button1 is pressed")else:print("button1 is released")def whichButton(self, btn):print("clicked button is " + btn.text())if __name__ == '__main__':app = QApplication(sys.argv)ui = Form()ui.show()sys.exit(app.exec_())

在这里插入图片描述

1.2 QRadioButton

  • 单选按钮组里,一次只能选中一个单选按钮
  • 要选中多个,需要使用 QGroupBox,QButtonGroup多个按钮组合
  • 按钮切换状态时,会发送 toggled 信号
# _*_ coding: utf-8 _*_
# @Time : 2022/5/4 21:34
# @Author : Michael
# @File : radio_button1.py
# @desc :
from PyQt5.QtWidgets import QWidget, QHBoxLayout, QRadioButton, QApplicationclass radio_button(QWidget):def __init__(self):super(radio_button, self).__init__()layout = QHBoxLayout()self.button1 = QRadioButton("Button1")self.button1.setChecked(True) # 默认选中self.button1.toggled.connect(lambda: self.btnstate(self.button1))layout.addWidget(self.button1)self.button2 = QRadioButton("Button2")self.button2.toggled.connect(lambda: self.btnstate(self.button2))layout.addWidget(self.button2)self.setLayout(layout)self.setWindowTitle("RadioButton例子")def btnstate(self, btn):if btn.text() == "Button1":if btn.isChecked():print("Button1 is selected")else:print("Button1 is deselected")elif btn.text() == "Button2":if btn.isChecked():print("Button2 is selected")else:print("Button2 is deselected")if __name__ == '__main__':import sysapp = QApplication(sys.argv)example = radio_button()example.show()sys.exit(app.exec_())

在这里插入图片描述

1.3 QCheckBox

一组带文本标签的复选框(可设置文本 or 图标),可选多个选项

注意:有选中、没选中、半选中(setTristate)3 种状态

# _*_ coding: utf-8 _*_
# @Time : 2022/5/4 21:58
# @Author : Michael
# @File : check_box1.py
# @desc :
from PyQt5.QtWidgets import QWidget, QGroupBox, QHBoxLayout, QCheckBox, QVBoxLayout, QApplication
from PyQt5.QtCore import Qtclass checkBox(QWidget):def __init__(self):super().__init__()groupbox = QGroupBox("CheckBoxes")groupbox.setFlat(True)layout = QHBoxLayout()self.checkbox1 = QCheckBox("&CheckBox1")self.checkbox1.setChecked(True)self.checkbox1.stateChanged.connect(lambda: self.checkbox_state(self.checkbox1))layout.addWidget(self.checkbox1)self.checkbox2 = QCheckBox("CheckBox2")self.checkbox2.toggled.connect(lambda: self.checkbox_state(self.checkbox2))layout.addWidget(self.checkbox2)self.checkbox3 = QCheckBox("CheckBox3")self.checkbox3.setTristate(True)self.checkbox3.setCheckState(Qt.PartiallyChecked)self.checkbox3.stateChanged.connect(lambda: self.checkbox_state(self.checkbox3))layout.addWidget(self.checkbox3)groupbox.setLayout(layout)main_layout = QVBoxLayout()main_layout.addWidget(groupbox)self.setLayout(main_layout)self.setWindowTitle("CheckBoxes例子")def checkbox_state(self, checkbox):checkbox1_state = self.checkbox1.text() + ', isChecked=' + str(self.checkbox1.isChecked()) + ', checkState=' + str(self.checkbox1.checkState()) + '\n'checkbox2_state = self.checkbox2.text() + ', isChecked=' + str(self.checkbox2.isChecked()) + ', checkState=' + str(self.checkbox2.checkState()) + '\n'checkbox3_state = self.checkbox3.text() + ', isChecked=' + str(self.checkbox3.isChecked()) + ', checkState=' + str(self.checkbox3.checkState()) + '\n'print(checkbox1_state, checkbox2_state, checkbox3_state)if __name__ == '__main__':import sysapp = QApplication(sys.argv)main = checkBox()main.show()sys.exit(app.exec_())

在这里插入图片描述

1.4 QComboBox 下拉列表

# _*_ coding: utf-8 _*_
# @Time : 2022/5/4 22:19
# @Author : Michael
# @File : qcomboBox1.py
# @desc :
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel, QComboBox, QApplicationclass combo_box1(QWidget):def __init__(self):super(combo_box1, self).__init__()self.setWindowTitle("combo_box例子")self.resize(300, 200)layout = QVBoxLayout()self.label1 = QLabel("选择语言")self.cb = QComboBox()self.cb.addItem("C")self.cb.addItem("C++")self.cb.addItem("Python")self.cb.addItems(["Java", "C#", "PHP"])self.cb.currentIndexChanged.connect(self.selectionchange)layout.addWidget(self.label1)layout.addWidget(self.cb)self.setLayout(layout)def selectionchange(self):self.label1.setText("你选择的语言是:" + self.cb.currentText())print('items in the list are:')for i in range(self.cb.count()):print(f'item {i} = {self.cb.itemText(i)}')print(f'current idx {i} selection changed to {self.cb.currentIndex()}')print('-'*10)if __name__ == '__main__':import sysapp = QApplication(sys.argv)combo_box1 = combo_box1()combo_box1.show()sys.exit(app.exec_())

在这里插入图片描述

1.5 QSpinBox 计数器

# _*_ coding: utf-8 _*_
# @Time : 2022/5/4 22:43
# @Author : Michael
# @File : spin_box1.py
# @desc :
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel, QSpinBox, QDoubleSpinBox, QApplication
from PyQt5.QtCore import Qtclass spin_box1(QWidget):def __init__(self):super(spin_box1, self).__init__()self.setWindowTitle("SpinBox例子")self.resize(300, 100)layout = QVBoxLayout()self.lb1 = QLabel("当前得分:")self.lb1.setAlignment(Qt.AlignCenter)layout.addWidget(self.lb1)self.spbox = QSpinBox()self.spbox.setRange(0, 100)self.spbox.setValue(60)self.spbox.setSingleStep(2)self.spbox.valueChanged.connect(self.value_change)layout.addWidget(self.spbox)self.lb2 = QLabel("当前平均分:")self.lb2.setAlignment(Qt.AlignCenter)layout.addWidget(self.lb2)self.spbox_double = QDoubleSpinBox()self.spbox_double.setRange(0.0, 100.0)self.spbox_double.setValue(60.0)self.spbox_double.setDecimals(2)self.spbox_double.setSingleStep(0.50)self.spbox_double.valueChanged.connect(self.value_change1)layout.addWidget(self.spbox_double)self.setLayout(layout)def value_change(self):self.lb1.setText("当前得分:" + str(self.spbox.value()))def value_change1(self):self.lb2.setText("当前平均分:" + str(self.spbox_double.value()))if __name__ == '__main__':import sysapp = QApplication(sys.argv)w = spin_box1()w.show()sys.exit(app.exec_())

在这里插入图片描述

1.6 QSlider 滑动条

# _*_ coding: utf-8 _*_
# @Time : 2022/5/5 8:20
# @Author : Michael
# @File : slider1.py
# @desc :
from PyQt5.QtGui import QFont
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel, QSlider, QApplication
from PyQt5.QtCore import Qtclass slider_demo(QWidget):def __init__(self):super().__init__()self.setWindowTitle("滑块控件")self.resize(300, 100)layout = QVBoxLayout()self.label1 = QLabel('hello michael')self.label1.setAlignment(Qt.AlignCenter)layout.addWidget(self.label1)self.slider1 = QSlider(Qt.Horizontal)  # 水平方向self.slider1.setMinimum(10)  # 最小值self.slider1.setMaximum(50)  # 最大值self.slider1.setSingleStep(3)  # 步长self.slider1.setValue(20)  # 当前值self.slider1.setTickPosition(QSlider.TicksBelow)  # 刻度位置self.slider1.setTickInterval(5)  # 刻度间隔layout.addWidget(self.slider1)self.slider1.valueChanged.connect(self.value_changed)self.setLayout(layout)def value_changed(self):print('当前滑块的值为:', self.slider1.value())size = self.slider1.value()self.label1.setFont(QFont('Arial', size))if __name__ == '__main__':import sysapp = QApplication(sys.argv)demo = slider_demo()demo.show()sys.exit(app.exec_())

在这里插入图片描述

2. 对话框类

2.1 QDialog

  • 窗口模态
    非模态,可以和程序其他窗口交互
    窗口模态,程序未处理完当前窗口时,将阻止与父窗口对话
    应用程序模态,阻止与任何其他窗口进行交互
# _*_ coding: utf-8 _*_
# @Time : 2022/5/5 8:57
# @Author : Michael
# @File : qdialog1.py
# @desc :
from PyQt5.QtWidgets import QMainWindow, QPushButton, QDialog, QApplication
from PyQt5.QtCore import Qtclass qdialog_demo(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("QDialog例子")self.resize(300, 200)self.button = QPushButton("弹出对话框", self)self.button.move(50, 50)self.button.clicked.connect(self.showdialog)def showdialog(self):dialog = QDialog()btn = QPushButton("ok", dialog)btn.move(50, 50)dialog.setWindowTitle("提交文件")dialog.setWindowModality(Qt.ApplicationModal)# 设置应用程序模态,只有关闭弹出窗口后,才能关闭主窗口dialog.exec_()
if __name__ == '__main__':import sysapp = QApplication(sys.argv)main = qdialog_demo()main.show()sys.exit(app.exec_())

在这里插入图片描述

2.2 QMessageBox

有很多常用的,提示,警告,错误,询问,关于等,差别只是样式图标不一样

# _*_ coding: utf-8 _*_
# @Time : 2022/5/5 9:30
# @Author : Michael
# @File : qmessagebox1.py
# @desc :
from PyQt5.QtWidgets import QWidget, QPushButton, QMessageBox, QApplicationclass QMessageBox1(QWidget):def __init__(self):super(QMessageBox1, self).__init__()self.setWindowTitle("QMessageBox1例子")self.resize(300, 200)self.button1 = QPushButton('点击弹出消息', self)self.button1.move(50, 50)self.button1.clicked.connect(self.msg)def msg(self):reply = QMessageBox.warning(self, 'Message标题', '你好,世界!', QMessageBox.Yes | QMessageBox.No, QMessageBox.No)if reply == QMessageBox.Yes:print('点击了Yes')else:print('点击了No')if __name__ == '__main__':import sysapp = QApplication(sys.argv)main = QMessageBox1()main.show()sys.exit(app.exec_())

在这里插入图片描述

2.3 QInputDialog

  • 由一个文本框,两个按钮(OK,Cancel),提交的信息可以被父窗口使用
# _*_ coding: utf-8 _*_
# @Time : 2022/5/5 9:49
# @Author : Michael
# @File : input_dialog1.py
# @desc :
from PyQt5.QtWidgets import QWidget, QFormLayout, QPushButton, QLineEdit, QInputDialog, QApplicationclass input_dialog1(QWidget):def __init__(self):super().__init__()layout = QFormLayout()self.btn1 = QPushButton('获取列表里的选项')self.btn1.clicked.connect(self.get_list_item)self.lineEdit1 = QLineEdit()layout.addRow(self.btn1, self.lineEdit1)self.btn2 = QPushButton('获取字符串')self.btn2.clicked.connect(self.get_str)self.lineEdit2 = QLineEdit()layout.addRow(self.btn2, self.lineEdit2)self.btn3 = QPushButton('获取整数')self.btn3.clicked.connect(self.get_int)self.lineEdit3 = QLineEdit()layout.addRow(self.btn3, self.lineEdit3)self.setLayout(layout)self.setWindowTitle('获取输入')def get_list_item(self):items = ('C', 'C++', 'Java', 'Python')item, ok = QInputDialog.getItem(self, '请选择语言', '语言列表', items, 0, False)if ok and item:self.lineEdit1.setText(item)def get_str(self):text, ok = QInputDialog.getText(self, '输入字符串对话框', '请输入字符串')if ok:self.lineEdit2.setText(text)def get_int(self):num, ok = QInputDialog.getInt(self, '输入整数对话框', '请输入整数')if ok:self.lineEdit3.setText(str(num))
if __name__ == '__main__':import sysapp = QApplication(sys.argv)win = input_dialog1()win.show()sys.exit(app.exec_())

在这里插入图片描述

2.4 QFontDialog

  • 字体选择对话框
# _*_ coding: utf-8 _*_
# @Time : 2022/5/5 22:18
# @Author : Michael
# @File : qfont_dialog1.py
# @desc :
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QPushButton, QLabel, QFontDialog, QApplicationclass fontDialog(QWidget):def __init__(self):super().__init__()layout = QVBoxLayout()self.fontButton = QPushButton('选择字体')self.fontButton.clicked.connect(self.chooseFont)layout.addWidget(self.fontButton)self.line1 = QLabel('hello michael, 你好啊')layout.addWidget(self.line1)self.setLayout(layout)self.setWindowTitle('字体对话框')def chooseFont(self):font, ok = QFontDialog.getFont()if ok:self.line1.setFont(font)
if __name__ == '__main__':import sysapp = QApplication(sys.argv)ui = fontDialog()ui.show()sys.exit(app.exec_())

在这里插入图片描述

2.5 QFileDialog

  • 打开、保存文件,可以设置文件类型过滤和初始位置
# _*_ coding: utf-8 _*_
# @Time : 2022/5/5 22:40
# @Author : Michael
# @File : file_dialog1.py
# @desc :
import timefrom PyQt5.QtCore import QDir
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QPushButton, QLabel, QTextEdit, QFileDialog, QApplicationclass file_dialog1(QWidget):def __init__(self):super(file_dialog1, self).__init__()layout = QVBoxLayout()self.btn = QPushButton('加载图片')self.btn.clicked.connect(self.loadfile)layout.addWidget(self.btn)self.label = QLabel()layout.addWidget(self.label)self.btn1 = QPushButton('加载文本文件')self.btn1.clicked.connect(self.loadfiles)layout.addWidget(self.btn1)self.content = QTextEdit() # 文本框layout.addWidget(self.content)self.setLayout(layout)self.setWindowTitle('文件对话框')def loadfile(self):fname, _ = QFileDialog.getOpenFileName(self, '打开文件', './', '图片文件(*.jpg *.png *gif)')self.label.setPixmap(QPixmap(fname))def loadfiles(self):dlog = QFileDialog()dlog.setFileMode(QFileDialog.AnyFile)dlog.setFilter(QDir.Files)if dlog.exec_():fnames = dlog.selectedFiles()print(fnames)with open(fnames[0], 'r', encoding='utf-8') as f:data = f.read()self.content.setText(data)
if __name__ == '__main__':import sysapp = QApplication(sys.argv)ui = file_dialog1()ui.show()sys.exit(app.exec_())

在这里插入图片描述

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

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

相关文章

python网络爬虫系列(二)——ProxyHandler处理器实现代理IP

ProxyHandler处理器(代理): 很多网站会检测某一段时间某个IP的访问次数(通过流量统计,系统日志等),如果访问次数多的不像正常人,它会禁止这个lP的访问。 所以我们可以设置一些代理服…

LeetCode 2264. 字符串中最大的 3 位相同数字

文章目录1. 题目2. 解题1. 题目 给你一个字符串 num ,表示一个大整数。如果一个整数满足下述所有条件,则认为该整数是一个 优质整数 : 该整数是 num 的一个长度为 3 的 子字符串 。该整数由唯一一个数字重复 3 次组成。 以字符串形式返回 …

四则运算个人项目进展

一、项目要求 基本要求:将10-20道四则运算题目写入文档,程序读取并输出题目,同时计算出正确结果。使用者对每道题目计算答案,答对进行提示,答错输出正确结果。分别记录回答正确、错误的数目并输出。四则运算题目基本要…

python网络爬虫系列(一)——urllib库(urlopen、urlretrieve、urlencode、parse-qs、urlparse和urlsplit、request.Request类)

urllib库 urllib库是Python中一个最基本的网络请求库。可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返回的数据。 一、urlopen函数: 在Python3的urllib库中,所有和网络请求相关的方法,都被集…

LeetCode 2265. 统计值等于子树平均值的节点数(DFS)

文章目录1. 题目2. 解题1. 题目 给你一棵二叉树的根节点 root ,找出并返回满足要求的节点数,要求节点的值等于其 子树 中值的 平均值 。 注意: n 个元素的平均值可以由 n 个元素 求和 然后再除以 n ,并 向下舍入 到最近的整数。…

LeetCode 2267. 检查是否有合法括号字符串路径(BFS)

文章目录1. 题目2. 解题1. 题目 一个括号字符串是一个 非空 且只包含 ( 和 ) 的字符串。 如果下面 任意 条件为 真 ,那么这个括号字符串就是 合法的 。 字符串是 () 。字符串可以表示为 AB(A 连接 B),A 和 B 都是合法括号序列。…

python网络爬虫系列(三)——cookie的原理、保存与加载

一、什么是cookie? 在网站中,http请求是无状态的.也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户。 cookie的出现就是为了解决这个问题,第一次登录后服务器返回一些数据(cookie)给浏览器,然后浏览器保存在本地,当…

LeetCode 2266. 统计打字方案数(动态规划)

文章目录1. 题目2. 解题1. 题目 Alice 在给 Bob 用手机打字。数字到字母的 对应 如下图所示。 为了 打出 一个字母,Alice 需要 按 对应字母 i 次,i 是该字母在这个按键上所处的位置。 比方说,为了按出字母 s ,Alice 需要按 7 四…

大学毕业4年-回顾和总结(2)-钱,收入和支出

过年回家,长辈最喜欢问两件事。第一件事,谈朋友没有啊。第二件事,现在一个月搞多少钱。 如果你和他们说,一个月工资是1万,那么他们立刻认为,你现在手上应该有十多万了。 上班族听了,心里…

python网络爬虫系列(四)——requests模块

requests模块 知识点: 掌握 headers参数的使用掌握 发送带参数的请求掌握 headers中携带cookie掌握 cookies参数的使用掌握 cookieJar的转换方法掌握 超时参数timeout的使用掌握 代理ip参数proxies的使用掌握 使用verify参数忽略CA证书掌握 requests模块发送post请…

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

文章目录1. 窗口绘图类1.1 QPainter绘制文字绘制点1.2 QPen1.3 QBrush1.4 QPixmap2. 拖拽与剪贴板2.1 拖拽2.2 剪贴板 QClipboard3. 日历与时间3.1 QCalendar3.2 QDateTimeEdit4. 菜单栏、工具栏、状态栏4.1 菜单栏 QMenuBar4.2 工具栏 QToolBar4.3 状态栏 QStatusBar5. QPrint…

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

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

使用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 中符合以下条件的 子字符串 数目: 子字符串长度为 k 。子字符串能整除 num 。 给你整数 num 和 k ,请你返回 num 的 k 美丽值。 注意: 允许有 前缀 0 。 0 不能整除任…

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

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

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

一、数据提取概述 知识点 了解 响应内容的分类了解 xml和html的区别 1. 响应内容的分类 在发送请求获取响应之后,可能存在多种不同类型的响应内容;而且很多时候,我们只需要响应内容中的一部分数据 结构化的响应内容 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 …