【Python入门系列】第八篇:Python中GUI编程和图形界面设计

文章目录

  • 前言
  • 一、Tkinter、PyQt和wxPython库简单使用
    • 1、Tkinter简单使用
    • 2、PyQt简单使用
    • 3、wxPython简单使用
  • 二、Tkinter、PyQt和wxPython库实现计算器
    • 1、Tkinter实现计算器
    • 2、PyQt实现计算器
    • 3、wxPython实现计算器
  • 三、Tkinter、PyQt和wxPython库简单QQ聊天
    • 1、Tkinter实现QQ聊天
    • 2、PyQt实现QQ聊天
    • 3、wxPython实现QQ聊天
  • 四、Tkinter、PyQt和wxPython库贪吃蛇游戏
    • 1、Tkinter实现贪吃蛇游戏
    • 2、PyQt实现贪吃蛇游戏
  • 总结


前言

Python中的GUI编程是指使用Python语言创建图形用户界面(GUI)的过程。通过GUI,用户可以与程序进行交互,通过按钮、菜单、文本框等控件来操作程序。

Python提供了多个库和框架来实现GUI编程,其中最常用的是Tkinter、wxPython、PyQt和PyGTK等。这些库提供了丰富的控件和功能,使开发者能够轻松地创建各种类型的图形界面。

在GUI编程中,通常使用窗口(Window)作为程序的主要界面。可以在窗口中添加各种控件,如按钮、标签、文本框、复选框等,用于与用户进行交互。通过事件处理机制,可以对用户的操作进行响应,执行相应的函数或方法。

图形界面设计是指创建具有良好用户体验的界面。在设计过程中,需要考虑界面布局、颜色搭配、控件的摆放位置等因素,以确保用户能够方便地使用程序。

一、Tkinter、PyQt和wxPython库简单使用

1、Tkinter简单使用

Tkinter 是 Python 中常用的 GUI 编程库,用于创建图形用户界面。下面是 Tkinter 的简单使用说明:

  1. 导入 Tkinter 模块:
import tkinter as tk
  1. 创建主窗口:
root = tk.Tk()
  1. 添加控件:
    可以添加各种控件,如标签、按钮、文本框等。例如,添加一个标签和一个按钮:
label = tk.Label(root, text="Hello, Tkinter!")button = tk.Button(root, text="Click me!")
  1. 布局控件:
    使用网格布局(grid)或包装布局(pack)来安排控件的位置。例如,使用网格布局将标签和按钮放置在窗口中:
label.grid(row=0, column=0)button.grid(row=1, column=0)
  1. 运行主循环:
root.mainloop()

完整代码:

import tkinter as tk# 创建主窗口
window = tk.Tk()
window.title("GUI编程示例")# 创建标签
label = tk.Label(window, text="欢迎来到GUI编程!", font=("Arial", 16))
label.pack()# 创建按钮
button = tk.Button(window, text="点击我!", command=lambda: print("你点击了按钮!"))
button.pack()# 运行主循环
window.mainloop()

2、PyQt简单使用

PyQt 是 Python 中常用的 GUI 编程库,用于创建图形用户界面。下面是 PyQt 的简单使用说明:

  1. 导入 PyQt 模块:
from PyQt5 import QtWidgets
  1. 创建应用程序对象:
app = QtWidgets.QApplication([])
  1. 创建主窗口:
window = QtWidgets.QMainWindow()
  1. 添加控件:
    可以添加各种控件,如标签、按钮、文本框等。例如,添加一个标签和一个按钮:
label = QtWidgets.QLabel("Hello, PyQt!")button = QtWidgets.QPushButton("Click me!")
  1. 设置布局:
    使用布局管理器来安排控件的位置和大小。常用的布局管理器有 QVBoxLayout、QHBoxLayout、QGridLayout 等。例如,使用 QVBoxLayout 将标签和按钮放置在窗口中:
layout = QtWidgets.QVBoxLayout()layout.addWidget(label)layout.addWidget(button)
  1. 将布局设置给主窗口:
central_widget = QtWidgets.QWidget()central_widget.setLayout(layout)window.setCentralWidget(central_widget)
  1. 显示窗口:
window.show()
  1. 运行应用程序的主循环:
app.exec_()

完整代码:

from PyQt5 import QtWidgets# 创建应用程序
app = QtWidgets.QApplication([])# 创建主窗口
window = QtWidgets.QWidget()
window.setWindowTitle("GUI编程示例")# 创建标签
label = QtWidgets.QLabel("欢迎来到GUI编程!")
label.setFont(QtWidgets.QFont("Arial", 16))# 创建按钮
button = QtWidgets.QPushButton("点击我!")
button.clicked.connect(lambda: print("你点击了按钮!"))# 创建布局
layout = QtWidgets.QVBoxLayout()
layout.addWidget(label)
layout.addWidget(button)# 设置主窗口布局
window.setLayout(layout)# 显示主窗口
window.show()# 运行应用程序
app.exec_()

3、wxPython简单使用

wxPython 是 Python 中常用的 GUI 编程库,用于创建图形用户界面。下面是 wxPython 的简单使用说明:

  1. 导入 wxPython 模块:
import wx
  1. 创建应用程序对象:
app = wx.App()
  1. 创建顶级窗口:
frame = wx.Frame(None, title="Hello, wxPython!")
  1. 添加控件:
    可以添加各种控件,如标签、按钮、文本框等。例如,添加一个标签和一个按钮:
panel = wx.Panel(frame)label = wx.StaticText(panel, label="Hello, wxPython!")button = wx.Button(panel, label="Click me!")
  1. 设置布局:
    使用布局管理器来安排控件的位置和大小。常用的布局管理器有 BoxSizer、GridSizer、FlexGridSizer 等。例如,使用 BoxSizer 将标签和按钮放置在窗口中:
sizer = wx.BoxSizer(wx.VERTICAL)sizer.Add(label, 0, wx.ALL, 10)sizer.Add(button, 0, wx.ALL, 10)panel.SetSizer(sizer)
  1. 显示窗口:
frame.Show()
  1. 运行应用程序的主循环:
app.MainLoop()

完整代码:

import wx# 创建应用程序
app = wx.App()# 创建主窗口
frame = wx.Frame(None, title="GUI编程示例")# 创建面板
panel = wx.Panel(frame)# 创建标签
label = wx.StaticText(panel, label="欢迎来到GUI编程!", pos=(50, 50))
label.SetFont(wx.Font(16, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL))# 创建按钮
button = wx.Button(panel, label="点击我!", pos=(50, 100))
button.Bind(wx.EVT_BUTTON, lambda event: print("你点击了按钮!"))# 显示主窗口
frame.Show()# 运行应用程序
app.MainLoop()

二、Tkinter、PyQt和wxPython库实现计算器

1、Tkinter实现计算器

import tkinter as tkdef calculate():expression = entry.get()try:result = eval(expression)result_label.config(text="结果: " + str(result))except:result_label.config(text="无效的表达式")def clear():entry.delete(0, tk.END)result_label.config(text="结果:")window = tk.Tk()
window.title("复杂计算器")entry = tk.Entry(window, width=30)
entry.pack()button_frame = tk.Frame(window)
button_frame.pack()calculate_button = tk.Button(button_frame, text="计算", command=calculate)
calculate_button.grid(row=0, column=0)clear_button = tk.Button(button_frame, text="清除", command=clear)
clear_button.grid(row=0, column=1)result_label = tk.Label(window, text="结果:")
result_label.pack()window.mainloop()

2、PyQt实现计算器

from PyQt5 import QtWidgetsclass Calculator(QtWidgets.QWidget):def __init__(self):super().__init__()self.setWindowTitle("复杂计算器")self.layout = QtWidgets.QVBoxLayout()self.entry = QtWidgets.QLineEdit()self.layout.addWidget(self.entry)button_frame = QtWidgets.QWidget()button_layout = QtWidgets.QHBoxLayout(button_frame)self.layout.addWidget(button_frame)calculate_button = QtWidgets.QPushButton("计算")calculate_button.clicked.connect(self.calculate)button_layout.addWidget(calculate_button)clear_button = QtWidgets.QPushButton("清除")clear_button.clicked.connect(self.clear)button_layout.addWidget(clear_button)self.result_label = QtWidgets.QLabel("结果:")self.layout.addWidget(self.result_label)self.setLayout(self.layout)def calculate(self):expression = self.entry.text()try:result = eval(expression)self.result_label.setText("结果: " + str(result))except:self.result_label.setText("无效的表达式")def clear(self):self.entry.clear()self.result_label.setText("结果:")app = QtWidgets.QApplication([])
calculator = Calculator()
calculator.show()
app.exec_()

3、wxPython实现计算器

import wxclass CalculatorFrame(wx.Frame):def __init__(self):super().__init__(parent=None, title="复杂计算器")self.panel = wx.Panel(self)self.entry = wx.TextCtrl(self.panel)self.calculate_button = wx.Button(self.panel, label="计算")self.clear_button = wx.Button(self.panel, label="清除")self.result_label = wx.StaticText(self.panel, label="结果:")self.calculate_button.Bind(wx.EVT_BUTTON, self.calculate)self.clear_button.Bind(wx.EVT_BUTTON, self.clear)sizer = wx.BoxSizer(wx.VERTICAL)sizer.Add(self.entry, proportion=1, flag=wx.EXPAND)sizer.Add(self.calculate_button, flag=wx.EXPAND)sizer.Add(self.clear_button, flag=wx.EXPAND)sizer.Add(self.result_label, flag=wx.EXPAND)self.panel.SetSizer(sizer)def calculate(self, event):expression = self.entry.GetValue()try:result = eval(expression)self.result_label.SetLabel("结果: " + str(result))except:self.result_label.SetLabel("无效的表达式")def clear(self, event):self.entry.Clear()self.result_label.SetLabel("结果:")app = wx.App()
frame = CalculatorFrame()
frame.Show()
app.MainLoop()

三、Tkinter、PyQt和wxPython库简单QQ聊天

1、Tkinter实现QQ聊天

import tkinter as tkdef send_message():message = entry.get()# 发送消息的逻辑处理print("发送消息:", message)entry.delete(0, tk.END)window = tk.Tk()
window.title("QQ聊天系统")
window.geometry("400x300")message_box = tk.Text(window)
message_box.pack(pady=10)entry = tk.Entry(window)
entry.pack(pady=10)send_button = tk.Button(window, text="发送", command=send_message)
send_button.pack()window.mainloop()

2、PyQt实现QQ聊天

from PyQt5 import QtWidgetsdef send_message():message = entry.text()# 发送消息的逻辑处理print("发送消息:", message)entry.clear()app = QtWidgets.QApplication([])
window = QtWidgets.QWidget()
window.setWindowTitle("QQ聊天系统")
window.setGeometry(100, 100, 400, 300)message_box = QtWidgets.QTextEdit(window)
message_box.setGeometry(10, 10, 380, 200)entry = QtWidgets.QLineEdit(window)
entry.setGeometry(10, 220, 300, 30)send_button = QtWidgets.QPushButton(window, text="发送")
send_button.setGeometry(320, 220, 60, 30)
send_button.clicked.connect(send_message)window.show()
app.exec_()

3、wxPython实现QQ聊天

import wxclass ChatWindow(wx.Frame):def __init__(self):super().__init__(None, title="QQ聊天系统", size=(400, 300))panel = wx.Panel(self)sizer = wx.BoxSizer(wx.VERTICAL)self.message_box = wx.TextCtrl(panel, style=wx.TE_MULTILINE)sizer.Add(self.message_box, 1, wx.EXPAND | wx.ALL, 10)self.entry = wx.TextCtrl(panel)sizer.Add(self.entry, 0, wx.EXPAND | wx.ALL, 10)send_button = wx.Button(panel, label="发送")sizer.Add(send_button, 0, wx.ALIGN_CENTER | wx.ALL, 10)send_button.Bind(wx.EVT_BUTTON, self.send_message)panel.SetSizer(sizer)self.Show()def send_message(self, event):message = self.entry.GetValue()# 发送消息的逻辑处理print("发送消息:", message)self.entry.Clear()app = wx.App()
ChatWindow()
app.MainLoop()

四、Tkinter、PyQt和wxPython库贪吃蛇游戏

1、Tkinter实现贪吃蛇游戏

import tkinter as tk
import randomWIDTH = 400
HEIGHT = 400
DELAY = 100
DOT_SIZE = 20class SnakeGame(tk.Canvas):def __init__(self, master):super().__init__(master, width=WIDTH, height=HEIGHT, background="black")self.snake = [(100, 100), (80, 100), (60, 100)]self.direction = "Right"self.food = self.create_food()self.score = 0self.bind_all("<Key>", self.on_key_press)self.pack()self.after(DELAY, self.move_snake)def create_food(self):x = random.randint(1, (WIDTH-DOT_SIZE) / DOT_SIZE) * DOT_SIZEy = random.randint(1, (HEIGHT-DOT_SIZE) / DOT_SIZE) * DOT_SIZEreturn self.create_oval(x, y, x+DOT_SIZE, y+DOT_SIZE, fill="white")def move_snake(self):head_x, head_y = self.snake[0]if self.direction == "Right":new_head = (head_x + DOT_SIZE, head_y)elif self.direction == "Left":new_head = (head_x - DOT_SIZE, head_y)elif self.direction == "Up":new_head = (head_x, head_y - DOT_SIZE)else:new_head = (head_x, head_y + DOT_SIZE)self.snake.insert(0, new_head)if self.check_collision():self.game_over()else:self.delete(self.snake[-1])if self.snake[0] == self.food:self.score += 1self.create_food()else:self.snake.pop()for x, y in self.snake:self.create_rectangle(x, y, x+DOT_SIZE, y+DOT_SIZE, fill="green")self.after(DELAY, self.move_snake)def check_collision(self):head_x, head_y = self.snake[0]return (head_x < 0 orhead_x >= WIDTH orhead_y < 0 orhead_y >= HEIGHT or(head_x, head_y) in self.snake[1:])def game_over(self):self.delete(tk.ALL)self.create_text(WIDTH/2, HEIGHT/2,text=f"Game Over! Score: {self.score}",fill="white",font=("Arial", 20),)def on_key_press(self, event):key = event.keysymif key == "Right" and self.direction != "Left":self.direction = "Right"elif key == "Left" and self.direction != "Right":self.direction = "Left"elif key == "Up" and self.direction != "Down":self.direction = "Up"elif key == "Down" and self.direction != "Up":self.direction = "Down"root = tk.Tk()
root.title("Snake Game")
snake_game = SnakeGame(root)
root.mainloop()

2、PyQt实现贪吃蛇游戏

from PyQt5 import QtWidgets, QtCore, QtGui
import random
WIDTH = 400
HEIGHT = 400
DELAY = 100
DOT_SIZE = 20class SnakeGame(QtWidgets.QWidget):def __init__(self):super().__init__()self.snake = [(100, 100), (80, 100), (60, 100)]self.direction = "Right"self.food = self.create_food()self.score = 0self.timer = QtCore.QTimer(self)self.timer.timeout.connect(self.move_snake)self.timer.start(DELAY)self.setWindowTitle("贪吃蛇游戏")self.setGeometry(100, 100, WIDTH, HEIGHT)self.show()def paintEvent(self, event):qp = QtGui.QPainter()qp.begin(self)self.draw_snake(qp)self.draw_food(qp)qp.end()def draw_snake(self, qp):qp.setBrush(QtGui.QColor(0, 255, 0))for x, y in self.snake:qp.drawRect(x, y, DOT_SIZE, DOT_SIZE)def draw_food(self, qp):qp.setBrush(QtGui.QColor(255, 255, 255))qp.drawEllipse(*self.food, DOT_SIZE, DOT_SIZE)def create_food(self):x = random.randint(1, (WIDTH-DOT_SIZE) / DOT_SIZE) * DOT_SIZEy = random.randint(1, (HEIGHT-DOT_SIZE) / DOT_SIZE) * DOT_SIZEreturn (x, y)def move_snake(self):head_x, head_y = self.snake[0]if self.direction == "Right":new_head = (head_x + DOT_SIZE, head_y)elif self.direction == "Left":new_head = (head_x - DOT_SIZE, head_y)elif self.direction == "Up":new_head = (head_x, head_y - DOT_SIZE)else:new_head = (head_x, head_y + DOT_SIZE)self.snake.insert(0, new_head)if self.check_collision():self.game_over()else:self.snake.pop()if self.snake[0] == self.food:self.score += 1self.create_food()self.update()def check_collision(self):head_x, head_y = self.snake[0]return (head_x < 0 orhead_x >= WIDTH orhead_y < 0 orhead_y >= HEIGHT or(head_x, head_y) in self.snake[1:])def game_over(self):self.timer.stop()QtWidgets.QMessageBox.information(self, "游戏结束", f"游戏结束!得分: {self.score}")def keyPressEvent(self, event):key = event.key()if key == QtCore.Qt.Key_Right and self.direction != "Left":self.direction = "Right"elif key == QtCore.Qt.Key_Left and self.direction != "Right":self.direction = "Left"elif key == QtCore.Qt.Key_Up and self.direction != "Down":self.direction = "Up"elif key == QtCore.Qt.Key_Down and self.direction != "Up":self.direction = "Down"app = QtWidgets.QApplication([])
snake_game = SnakeGame()
app.exec_()```##  3、wxPython实现贪吃蛇游戏
```csharp
import wx
import randomWIDTH = 400
HEIGHT = 400
DELAY = 100
DOT_SIZE = 20class SnakeGame(wx.Frame):def __init__(self):super().__init__(None, title="贪吃蛇游戏", size=(WIDTH, HEIGHT))self.snake = [(100, 100), (80, 100), (60, 100)]self.direction = "Right"self.food = self.create_food()self.score = 0self.timer = wx.Timer(self)self.Bind(wx.EVT_TIMER, self.move_snake, self.timer)self.timer.Start(DELAY)self.Bind(wx.EVT_PAINT, self.on_paint)self.Bind(wx.EVT_KEY_DOWN, self.on_key_down)self.Centre()self.Show()def on_paint(self, event):dc = wx.PaintDC(self)self.draw_snake(dc)self.draw_food(dc)def draw_snake(self, dc):dc.SetBrush(wx.Brush(wx.Colour(0, 255, 0)))for x, y in self.snake:dc.DrawRectangle(x, y, DOT_SIZE, DOT_SIZE)def draw_food(self, dc):dc.SetBrush(wx.Brush(wx.Colour(255, 255, 255)))dc.DrawCircle(*self.food, DOT_SIZE//2)def create_food(self):x = random.randint(1, (WIDTH-DOT_SIZE) // DOT_SIZE) * DOT_SIZEy = random.randint(1, (HEIGHT-DOT_SIZE) // DOT_SIZE) * DOT_SIZEreturn (x, y)def move_snake(self, event):head_x, head_y = self.snake[0]if self.direction == "Right":new_head = (head_x + DOT_SIZE, head_y)elif self.direction == "Left":new_head = (head_x - DOT_SIZE, head_y)elif self.direction == "Up":new_head = (head_x, head_y - DOT_SIZE)else:new_head = (head_x, head_y + DOT_SIZE)self.snake.insert(0, new_head)if self.check_collision():self.game_over()else:self.snake.pop()if self.snake[0] == self.food:self.score += 1self.food = self.create_food()self.Refresh()def check_collision(self):head_x, head_y = self.snake[0]return (head_x < 0 orhead_x >= WIDTH orhead_y < 0 orhead_y >= HEIGHT or(head_x, head_y) in self.snake[1:])def game_over(self):self.timer.Stop()wx.MessageBox(f"游戏结束!得分: {self.score}", "游戏结束")self.Close()def on_key_down(self, event):key_code = event.GetKeyCode()if key_code == wx.WXK_RIGHT and self.direction != "Left":self.direction = "Right"elif key_code == wx.WXK_LEFT and self.direction != "Right":self.direction = "Left"elif key_code == wx.WXK_UP and self.direction != "Down":self.direction = "Up"elif key_code == wx.WXK_DOWN and self.direction != "Up":self.direction = "Down"app = wx.App()
SnakeGame()
app.MainLoop()

总结

Python的GUI编程和图形界面设计相对简单易学,适用于各种应用程序的开发,包括桌面应用、游戏、数据可视化等。通过使用Python的GUI编程,开发者可以快速地创建功能强大、用户友好的图形界面应用程序。

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

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

相关文章

蓝牙AOA基站定位的优势与应用前景

在科技飞速发展的今天&#xff0c;人们对于定位技术的精度和稳定性要求越来越高。蓝牙AOA基站定位技术应运而生&#xff0c;以其高精度和低通信开销的特点&#xff0c;正逐渐改变我们对室内定位的认知。本文我们就一起来具体了解一下关于蓝牙AOA基站定位技术的优势及应用前景&a…

数据结构(3)栈、队列、数组

1 栈 1.1 栈的定义 后进先出【LIFO】 1.2 基本操作 元素进栈出栈 只能在栈顶进行&#xff01;&#xff01;&#xff01; 经常考的题&#xff1a; 穿插的进行进栈和出栈 可能有多个选项 1.3 顺序栈 1.3.1 初始化 下标是从0开始的 1.3.2 进栈 更简单的写法&#xff1a; 1.3…

JavaScript 闭包 css html

闭包 什么是闭包 JavaScript的作用域包括全局作用域和函数作用域和块级作用域。 在JavaScript作用域环境中访问变量的权利是由内向外的&#xff0c;内部作用域可以获得当前作用域下的变量&#xff0c;并且可以获得包含当前作用域的外层作用域下的变量&#xff0c;反之则不能…

纯血鸿蒙开发实战—如何开发出一个鸿蒙购物应用!

HarmonyOS 支持应用以 Ability 为单位进行部署&#xff0c;Ability 可以分为 FA&#xff08;Feature Ability&#xff09;和 PA&#xff08;Particle Ability&#xff09;两种类型。 本篇 Codelab 将会使用 UI 组件开发出一个 HarmonyOS 购物应用。 HarmonyOS 为开发者提供了…

TikTok广告投放攻略——广告类型详解

TikTok广告是品牌或创作者付费向特定目标受众展示的推广内容&#xff08;通常是全屏视频&#xff09;。TikTok 上的广告是一种社交媒体营销形式&#xff0c;通常旨在提高广告商的知名度或销售特定产品或服务。 就 TikTok广告投放而言&#xff0c;其组织层级分为三个层级&#x…

行心科技与研草堂携手,共绘医康养新生态的食疗养生蓝图

在健康产业蓬勃发展的当下&#xff0c;广州市行心信息科技有限公司&#xff08;以下简称“行心科技”&#xff09;与研草堂携手合作&#xff0c;共同亮相于2024年第34届健博会暨中国大健康产业文化节。现场&#xff0c;行心科技董事长林泳强、顾问王志文老师与研草堂的厂商齐聚…

@EnableResourceServer资源服务注解源码分析

文章目录 学习参考EnableResourceServer概要ResourceServerConfiguration属性定义configure(HttpSecurity)ResourceServerSecurityConfigurerinit(HttpSecurit)configure(HttpSecurity) 学习参考 Spring Security框架配置运行流程完整分析 - 【必看】 Security OAuth2 授权 &…

vue3之拆若依--记实现后台管理首页(左侧菜单栏、头部信息区域...)

效果图 前期准备 启动若依在本地 启动若依后台,跑在自己本地: 这里对于如何下载若依相关的前后端代码请参考若依官网:RuoYi 若依官方网站 |后台管理系统|权限管理系统|快速开发框架|企业管理系统|开源框架|微服务框架|前后端分离框架|开源后台系统|RuoYi|RuoYi-Vue|RuoYi-…

【Java毕业设计】基于JavaWeb的在线购物网站的设计与实现

文章目录 摘 要ABSTRACT目 录1 概述1.1 研究背景及意义1.2 国内外研究现状1.3 拟研究内容1.4 系统开发技术1.4.1 vue技术1.4.2 B/S结构1.4.3 Spring Boot框架1.4.4 MySQL数据库1.4.5 MVC模式 2 系统需求分析2.1 可行性分析2.2 功能需求分析 3 系统设计3.1 功能结构设计3.2 系统…

Python数据框操作 -- DataFrame列名和索引设置

先创建一个数据框&#xff1a; import pandas as pd df pd.DataFrame({a:[1,1,2,3,4], b:[5,6,7,8,8]}) 重新设置数据框的列名&#xff0c;使数据框的列名为“A”和“B”&#xff1a; df.columns [A,B] 设置A列为数据框的索引&#xff1a; df1 df.set_index(A, drop …

怎么用PHP语言实现远程控制两路照明开关

怎么用PHP语言实现远程控制两路开关呢&#xff1f; 本文描述了使用PHP语言调用HTTP接口&#xff0c;实现控制两路开关&#xff0c;两路开关可控制两路照明、排风扇等电器。 可选用产品&#xff1a;可根据实际场景需求&#xff0c;选择对应的规格 序号设备名称厂商1智能WiFi墙…

git clone 文件名中文、有冒号等问题 fatal: repository ‘***/r/鏍″洯鏅烘収椋熷爞/.git/‘ not found

记录一个git问题&#xff0c;比较有意思&#xff0c;也比较难找。 背景 首先把代码拉下来&#xff0c;发现给我报错。 怀疑 刚开始以为是仓库地址变了&#xff0c;但是发现仓库地址并没有变过。 交流 然后寻找解决方案。因为同事也遇到过&#xff0c;同事交了我一招&…

【西瓜书】2.模型评估与选择

1.经验误差与过拟合 &#xff08;1&#xff09;错误率、精度 &#xff08;2&#xff09;误差&#xff1a;训练误差/经验误差、泛化误差 &#xff08;3&#xff09;过拟合、欠拟合 欠拟合好克服&#xff0c;过拟合无法彻底避免 2.三大任务——评估方法 泛化误差的评估方法&a…

永久域名存在吗?

在互联网的世界里&#xff0c;域名是企业与个人在线身份的重要标识&#xff0c;它不仅关系到品牌形象&#xff0c;还可能影响搜索引擎优化(SEO)和用户体验。因此&#xff0c;拥有一个“永久”域名&#xff0c;即一个长期稳定、不受时间限制的域名&#xff0c;是许多网站所有者的…

STM32F103VE和STM32F407VE的引脚布局

STM32F103VE vs STM32F407VE 引脚对比表 引脚 STM32F103VE STM32F407VE 备注 1 VSS VSS 地 2 VDD VDD 电源 3 VSSA VSSA 模拟地 4 VDDA VDDA 模拟电源 5 OSC_IN OSC_IN 外部时钟输入 6 OSC_OUT OSC_OUT 外部时钟输出 7 NRST NRST 复位 8 PC13 (GPIO) PC13 (GPIO) GPIO 9 PC14 (…

SD6410高效同步降压DC-DC稳压器集成电路可输出1.5输入电压

SD6410是高效、高频同步降压DC-DC稳压 器集成电路&#xff0c;可输出高达1.5A的输出电流。 SD6410可在2.3V至5.5V的宽输入电压范围 内工作&#xff0c;并集成了具有极低RDS(ON)的 主开关和同步开关&#xff0c;以最大限度地减少导通 损耗 它是为单节锂离子(Li)电池供电的便携式…

ffmpeg视频编码原理和实战-(5)对编码过程进行封装并解决丢帧问题

头文件&#xff1a; xencode.h #pragma once #include <mutex> #include<vector> struct AVCodecContext; struct AVPacket; struct AVFrame; class XEncode { public:///// 创建编码上下文/// para codec_id 编码器ID号&#xff0c;对应ffmpeg/// return 编码上…

如何永久擦除Android手机中的所有个人数据?

在这个数字化的时代&#xff0c;确保您的个人数据的安全和隐私至关重要。如果您计划出售或回收您的Android手机&#xff0c;了解如何正确擦除Android手机是至关重要的。本综合指南将引导您通过安全擦除Android手机的分步过程&#xff0c;以保护您的敏感信息。 手机是极其敏感的…

vllm lora、gptq、awq推理使用

1)lora推理 docker run --gpus all -v /ai/Qwen1.5-7B-Chat:/qwen-7b -v /ai/lora:/lora -p 10860:10860 --ipc

反转链表的三种方法--面试必考(图例超详细解析,小白一看就会!!!)

目录 一、前言 二、题目描述 三、解题方法 ⭐ 头插法 --- 创建新的链表 ⭐ 迭代法 --- 三指针 ⭐ 递归法 四、总结与提炼 五、共勉 一、前言 反转链表这道题&#xff0c;可以说是--链表专题--&#xff0c;最经典的一道题&#xff0c;也是在面试中频率最高的一道题目&…