使用Python Tkinter创建GUI应用程序
大家好,当我们谈及使用Python Tkinter创建GUI应用程序时,我们涉及的不仅是技术和代码,更是关于创造力和用户体验的故事。Tkinter作为Python标准库中最常用的GUI工具包,提供了丰富的功能和灵活的接口,让开发者能够轻松地构建出各种各样的图形用户界面。Tkinter不仅易于学习和上手,而且具有强大的功能,足以满足各种应用场景的需求。从简单的计算器到复杂的数据可视化工具,Tkinter都能胜任。
一、Tkinter简介
Tkinter是Python标准库中用于创建图形用户界面(GUI)的工具包。它基于Tk GUI工具包,Tkinter提供了访问Tk GUI工具包的Python接口,使得开发GUI应用程序变得相对简单。下面是关于Tkinter的一些详细介绍:
Tkinter的特点:
- 跨平台性:Tkinter是Python标准库的一部分,因此可以在几乎所有支持Python的操作系统上运行,包括Windows、Linux和macOS。
- 易学易用:Tkinter提供了相对简单的API,对于初学者来说很容易上手,同时也能够满足大多数简单到中等复杂度的GUI应用程序的需求。
- 集成度高:由于是Python标准库的一部分,因此不需要额外安装其他软件包或库,可以直接在Python环境中使用。
- 可扩展性:Tkinter提供了许多内置的小部件(widgets),如按钮、标签、文本框等,同时也支持自定义小部件和布局管理器。
Tkinter中的一些重要概念:
- 窗口(Window):所有Tkinter应用程序的基础是窗口,可以是主窗口或者其他类型的弹出窗口。
- 小部件(Widgets):Tkinter提供了各种小部件,如按钮、标签、文本框、列表框等,用于构建GUI界面。
- 布局管理器(Layout Managers):Tkinter提供了几种布局管理器来帮助开发者将小部件布置在窗口中的合适位置,常用的有Pack、Grid和Place。
- 事件驱动(Event-Driven):Tkinter使用事件驱动的编程模型,通过绑定事件处理函数来响应用户操作,如点击按钮或键盘输入等。
二、窗口
当使用Python的Tkinter库创建GUI应用程序时,窗口是整个界面的基础。窗口提供了一个可视化的容器,用于放置各种GUI元素,如按钮、标签、文本框等。在Tkinter中,窗口通常称为Tk
对象的实例。
1、创建窗口
要创建一个窗口,首先需要导入Tkinter库,然后创建一个Tk对象的实例,这就是主窗口。通常,可以使用Tk()
函数来创建一个窗口实例。
import tkinter as tk# 创建主窗口
root = tk.Tk()
2、设置窗口属性
可以使用title()
方法为窗口设置标题,使用geometry()
方法设置窗口的大小和位置。
# 设置窗口标题
root.title("My Window")# 设置窗口大小和位置
root.geometry("400x300+200+100") # 宽x高+水平偏移量+垂直偏移量
3、显示窗口
创建窗口后,需要调用mainloop()
方法进入Tkinter的主事件循环,以便窗口能够响应用户的操作。
# 进入主事件循环
root.mainloop()
4、关闭窗口
在应用程序运行过程中,可以通过调用窗口对象的destroy()
方法来关闭窗口。
# 关闭窗口
root.destroy()
5、窗口属性和方法
窗口对象还提供了一些其他方法和属性,用于控制窗口的外观和行为,例如:
title
:窗口标题geometry
:窗口大小和位置config
:配置窗口属性iconbitmap
:设置窗口图标resizable
:设置窗口是否可调整大小
6、示例
创建一个简单的窗口。
import tkinter as tk# 创建主窗口
root = tk.Tk()
root.title("My Window")
root.geometry("400x300+200+100")# 进入主事件循环
root.mainloop()
三、小部件
小部件(Widgets)是构成Tkinter GUI界面的基本元素,它们包括各种可视化组件,如按钮、标签、文本框、列表框等。Tkinter提供了多种内置的小部件,同时也支持创建自定义的小部件。
1、标签(Label)
标签用于显示文本或图像,是GUI界面中常用的一种小部件。
import tkinter as tk# 创建主窗口
root = tk.Tk()
root.title("Label Example")# 创建标签
label = tk.Label(root, text="Hello, Tkinter!")
label.pack()# 进入主事件循环
root.mainloop()
2、按钮(Button)
按钮用于触发用户交互操作,如点击按钮执行某些操作。
import tkinter as tk# 按钮点击事件处理函数
def button_click():label.config(text="Button Clicked!")# 创建主窗口
root = tk.Tk()
root.title("Button Example")# 创建标签
label = tk.Label(root, text="Hello, Tkinter!")
label.pack()# 创建按钮,并绑定点击事件处理函数
button = tk.Button(root, text="Click Me", command=button_click)
button.pack()# 进入主事件循环
root.mainloop()
3、文本框(Entry)
文本框用于接收用户输入的文本信息。
import tkinter as tk# 获取文本框内容并显示在标签中
def show_text():text = entry.get()label.config(text=text)# 创建主窗口
root = tk.Tk()
root.title("Entry Example")# 创建文本框
entry = tk.Entry(root)
entry.pack()# 创建按钮,点击按钮显示文本框内容
button = tk.Button(root, text="Show Text", command=show_text)
button.pack()# 创建标签用于显示文本框内容
label = tk.Label(root)
label.pack()# 进入主事件循环
root.mainloop()
4、列表框(Listbox)
列表框用于显示多个选项,并允许用户选择其中之一或多个。
import tkinter as tk# 获取用户选择的列表项并显示在标签中
def show_selection():selection = listbox.get(tk.ACTIVE)label.config(text=f"Selected Item: {selection}")# 创建主窗口
root = tk.Tk()
root.title("Listbox Example")# 创建列表框
listbox = tk.Listbox(root)
listbox.pack()# 添加选项到列表框中
for item in ["Option 1", "Option 2", "Option 3"]:listbox.insert(tk.END, item)# 创建按钮,点击按钮显示用户选择的列表项
button = tk.Button(root, text="Show Selection", command=show_selection)
button.pack()# 创建标签用于显示用户选择的列表项
label = tk.Label(root)
label.pack()# 进入主事件循环
root.mainloop()
5、文本域(Text)
文本域用于显示多行文本,通常用于显示大段文本或允许用户进行多行输入。
import tkinter as tk# 获取文本域内容并显示在标签中
def show_text():text = text_area.get("1.0", tk.END) # 从第一行第一列开始获取所有文本label.config(text=text)# 创建主窗口
root = tk.Tk()
root.title("Text Example")# 创建文本域
text_area = tk.Text(root, height=5, width=30)
text_area.pack()# 创建按钮,点击按钮显示文本域内容
button = tk.Button(root, text="Show Text", command=show_text)
button.pack()# 创建标签用于显示文本域内容
label = tk.Label(root, wraplength=200) # 设置标签文字换行长度
label.pack()# 进入主事件循环
root.mainloop()
6、滚动条(Scrollbar)
滚动条用于在小部件中滚动内容,如文本域或列表框。
import tkinter as tk# 创建主窗口
root = tk.Tk()
root.title("Scrollbar Example")# 创建文本域
text_area = tk.Text(root, height=10, width=30)
text_area.pack(side=tk.LEFT, fill=tk.Y)# 创建滚动条
scrollbar = tk.Scrollbar(root, command=text_area.yview)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)# 将文本域与滚动条关联
text_area.config(yscrollcommand=scrollbar.set)# 进入主事件循环
root.mainloop()
7、组合框(Combobox)
组合框是一个下拉菜单,用户可以从中选择一个选项。
import tkinter as tk
from tkinter import ttk# 获取用户选择的选项并显示在标签中
def show_selection():selection = combobox.get()label.config(text=f"Selected Item: {selection}")# 创建主窗口
root = tk.Tk()
root.title("Combobox Example")# 创建组合框
options = ["Option 1", "Option 2", "Option 3"]
combobox = ttk.Combobox(root, values=options)
combobox.pack()# 创建按钮,点击按钮显示用户选择的选项
button = tk.Button(root, text="Show Selection", command=show_selection)
button.pack()# 创建标签用于显示用户选择的选项
label = tk.Label(root)
label.pack()# 进入主事件循环
root.mainloop()
8、滑块(Scale)
滑块允许用户在预定义的范围内选择一个值,通常用于调整参数或设置参数值。
import tkinter as tk# 获取滑块的值并显示在标签中
def show_value(value):label.config(text=f"Slider Value: {value}")# 创建主窗口
root = tk.Tk()
root.title("Scale Example")# 创建滑块
scale = tk.Scale(root, from_=0, to=100, orient=tk.HORIZONTAL, command=show_value)
scale.pack()# 创建标签用于显示滑块的值
label = tk.Label(root)
label.pack()# 进入主事件循环
root.mainloop()
9、复选框(Checkbutton)
复选框允许用户选择或取消选择一个或多个选项。
import tkinter as tk# 获取复选框的状态并显示在标签中
def show_state():state = var.get()label.config(text=f"Checkbox State: {state}")# 创建主窗口
root = tk.Tk()
root.title("Checkbutton Example")# 创建变量用于存储复选框的状态
var = tk.IntVar()# 创建复选框
checkbutton = tk.Checkbutton(root, text="Check Me", variable=var, command=show_state)
checkbutton.pack()# 创建标签用于显示复选框的状态
label = tk.Label(root)
label.pack()# 进入主事件循环
root.mainloop()
10、单选按钮(Radiobutton)
单选按钮允许用户在一组选项中选择一个选项。
import tkinter as tk# 获取单选按钮的值并显示在标签中
def show_selection():selection = var.get()label.config(text=f"Selected Option: {selection}")# 创建主窗口
root = tk.Tk()
root.title("Radiobutton Example")# 创建变量用于存储单选按钮的值
var = tk.StringVar()# 创建单选按钮
for option in ["Option 1", "Option 2", "Option 3"]:radiobutton = tk.Radiobutton(root, text=option, variable=var, value=option, command=show_selection)radiobutton.pack()# 创建标签用于显示单选按钮的值
label = tk.Label(root)
label.pack()# 进入主事件循环
root.mainloop()
11、文件选择框(Filedialog)
文件选择框用于让用户选择文件或目录。
import tkinter as tk
from tkinter import filedialog# 打开文件选择框并显示选择的文件路径
def open_file():file_path = filedialog.askopenfilename()label.config(text=f"Selected File: {file_path}")# 创建主窗口
root = tk.Tk()
root.title("Filedialog Example")# 创建按钮,点击按钮打开文件选择框
button = tk.Button(root, text="Open File", command=open_file)
button.pack()# 创建标签用于显示选择的文件路径
label = tk.Label(root)
label.pack()# 进入主事件循环
root.mainloop()
四、布局管理器
布局管理器(Layout Managers)是Tkinter中用于确定窗口中小部件位置和大小的工具。Tkinter提供了三种主要的布局管理器:Pack、Grid和Place。每种布局管理器都有其特定的方式来组织和排列小部件,以便在窗口中创建期望的布局。
1、Pack 布局管理器
Pack布局管理器会自动将小部件按照水平或垂直方向进行堆叠,它会自动调整小部件的大小以适应窗口大小变化,并且可以简单地实现对小部件的对齐。Pack布局管理器通过pack()
方法来指定小部件的排列方式。
import tkinter as tk# 创建主窗口
root = tk.Tk()
root.title("Pack Layout Example")# 创建三个按钮,并使用Pack布局管理器进行排列
button1 = tk.Button(root, text="Button 1")
button1.pack()button2 = tk.Button(root, text="Button 2")
button2.pack()button3 = tk.Button(root, text="Button 3")
button3.pack()# 进入主事件循环
root.mainloop()
2、Grid 布局管理器
Grid布局管理器将窗口划分为网格,并允许开发者将小部件放置在网格中的特定位置。可以通过指定row
和column
参数来确定小部件所在的行和列。Grid布局管理器通过grid()
方法来指定小部件的位置。
import tkinter as tk# 创建主窗口
root = tk.Tk()
root.title("Grid Layout Example")# 创建三个按钮,并使用Grid布局管理器进行排列
button1 = tk.Button(root, text="Button 1")
button1.grid(row=0, column=0)button2 = tk.Button(root, text="Button 2")
button2.grid(row=0, column=1)button3 = tk.Button(root, text="Button 3")
button3.grid(row=1, column=0, columnspan=2)# 进入主事件循环
root.mainloop()
3、Place 布局管理器
Place布局管理器允许开发者直接指定小部件的位置和大小,相对于父容器的坐标。这种布局管理器通常用于实现更高级别的布局效果,如绘图或动画。Place布局管理器通过place()
方法来指定小部件的位置和大小。
import tkinter as tk# 创建主窗口
root = tk.Tk()
root.title("Place Layout Example")# 创建一个标签,并使用Place布局管理器进行定位
label = tk.Label(root, text="Hello, Tkinter!", bg="lightblue")
label.place(x=50, y=50)# 创建一个按钮,并使用Place布局管理器进行定位
button = tk.Button(root, text="Click Me")
button.place(x=100, y=100)# 进入主事件循环
root.mainloop()
五、事件驱动
Tkinter的事件模型基于发布-订阅(Publish-Subscribe)模式,其中包含了两个关键的概念:事件和事件处理函数。
- 事件(Event):事件是用户执行操作时发生的动作,如鼠标点击、键盘输入等。每个事件都有一个事件类型(如Button-1表示鼠标左键点击)和相关的事件数据(如鼠标点击的位置)。
- 事件处理函数(Event Handler):事件处理函数是与特定事件相关联的函数,当事件发生时,事件处理函数会被调用执行,以响应该事件。
1、Tkinter事件驱动的基本原理
-
事件:在Tkinter中,事件可以是鼠标事件、键盘事件、窗口事件等,每个事件都有一个特定的类型和相关的属性,以描述事件的来源和内容。
-
事件绑定:通过调用小部件的
bind()
方法,可以将特定事件与相应的事件处理函数绑定起来。当指定的事件发生时,Tkinter会调用相应的事件处理函数来处理该事件。 -
事件处理函数:事件处理函数是用户自定义的函数,用于处理特定类型的事件。当相应类型的事件发生时,Tkinter会自动调用相应的事件处理函数,并将事件对象作为参数传递给该函数。
2、Tkinter事件绑定
在Tkinter中,可以通过调用小部件的bind()
方法来绑定事件和事件处理函数。bind()
方法接受两个参数:要绑定的事件类型和要调用的事件处理函数。当指定的事件发生时,Tkinter会调用相关的事件处理函数来处理该事件。
示例:绑定鼠标点击事件
import tkinter as tk# 鼠标点击事件处理函数
def mouse_click(event):print("Mouse Clicked at", event.x, event.y)# 创建主窗口
root = tk.Tk()
root.title("Event Handling Example")# 创建一个标签,并在鼠标点击事件上绑定事件处理函数
label = tk.Label(root, text="Click Here")
label.pack()
label.bind("<Button-1>", mouse_click) # "<Button-1>"表示鼠标左键点击事件# 进入主事件循环
root.mainloop()
3、常见的Tkinter事件类型
Tkinter支持各种不同类型的事件,包括鼠标事件、键盘事件、窗口事件等。以下是一些常见的Tkinter事件类型:
- 鼠标事件:如点击、释放、移动等。
- 键盘事件:如按键、释放键等。
- 窗口事件:如窗口关闭、窗口调整大小等。
- 小部件事件:如焦点进入、焦点离开、滚动条滚动等。
鼠标事件示例
import tkinter as tk# 鼠标点击事件处理函数
def on_click(event):print("Mouse Clicked at", event.x, event.y)# 鼠标释放事件处理函数
def on_release(event):print("Mouse Released at", event.x, event.y)# 鼠标移动事件处理函数
def on_move(event):print("Mouse Moved to", event.x, event.y)# 创建主窗口
root = tk.Tk()
root.title("Mouse Events Example")# 创建一个标签,并绑定鼠标事件处理函数
label = tk.Label(root, text="Click, Release or Move Mouse Here!")
label.pack()label.bind("<Button-1>", on_click) # 绑定鼠标左键点击事件
label.bind("<ButtonRelease-1>", on_release) # 绑定鼠标左键释放事件
label.bind("<Motion>", on_move) # 绑定鼠标移动事件# 进入主事件循环
root.mainloop()
键盘事件示例
import tkinter as tk# 键盘按键事件处理函数
def on_key_press(event):print("Key Pressed:", event.keysym)# 键盘释放键事件处理函数
def on_key_release(event):print("Key Released:", event.keysym)# 创建主窗口
root = tk.Tk()
root.title("Keyboard Events Example")# 绑定键盘按键事件处理函数
root.bind("<KeyPress>", on_key_press)
root.bind("<KeyRelease>", on_key_release)# 进入主事件循环
root.mainloop()
窗口事件示例
import tkinter as tk# 窗口关闭事件处理函数
def on_close():print("Window Closed")root.destroy() # 销毁窗口# 创建主窗口
root = tk.Tk()
root.title("Window Events Example")# 绑定窗口关闭事件处理函数
root.protocol("WM_DELETE_WINDOW", on_close)# 进入主事件循环
root.mainloop()
小部件事件示例
import tkinter as tk# 焦点进入事件处理函数
def on_focus_in(event):print("Focus In")# 焦点离开事件处理函数
def on_focus_out(event):print("Focus Out")# 滚动条滚动事件处理函数
def on_scroll(event):print("Scrollbar Scrolled to", event)# 创建主窗口
root = tk.Tk()
root.title("Widget Events Example")# 创建文本框和滚动条
text = tk.Text(root, height=10, width=30)
scrollbar = tk.Scrollbar(root, command=text.yview)
text.config(yscrollcommand=scrollbar.set)
text.pack(side=tk.LEFT)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)# 绑定小部件事件处理函数
text.bind("<FocusIn>", on_focus_in) # 绑定焦点进入事件
text.bind("<FocusOut>", on_focus_out) # 绑定焦点离开事件
scrollbar.bind("<Motion>", on_scroll) # 绑定滚动条滚动事件# 进入主事件循环
root.mainloop()
六、打包为可执行文件
将Python Tkinter程序打包成Windows和macOS下的应用程序的过程有些不同。下面将分别介绍如何打包为Windows和macOS下的应用程序。
在Windows下打包为可执行文件:
1、安装PyInstaller
pip install pyinstaller
2、打包应用程序
在命令行中,切换到Python Tkinter应用程序的目录,并执行以下命令:
pyinstaller --onefile your_script.py
这将在dist目录中生成一个名为your_script.exe
的可执行文件,即Windows下的可执行文件。
在macOS下打包为应用程序:
1、安装PyInstaller
pip install pyinstaller
2、打包应用程序
在命令行中,切换到Python Tkinter应用程序的目录,并执行以下命令:
pyinstaller --onefile --windowed your_script.py
这将在dist目录中生成一个名为your_script.app
的macOS应用程序。
PyInstaller参数介绍:
1、基本参数:
- --onefile:生成一个单个的可执行文件,而不是打包成多个文件。
- --noconsole:生成的可执行文件不会显示控制台窗口。
- --windowed:生成一个没有控制台窗口的可执行文件。
2、文件和路径相关参数:
- --distpath:指定生成的可执行文件的输出目录。
- --specpath:指定生成的spec文件的输出目录。
- --workpath:指定工作目录,PyInstaller在此处将生成临时文件。
3、数据和资源文件相关参数:
- --add-data:将额外的数据文件(如图像、音频文件等)复制到可执行文件中。语法为`--add-data "source_path;destination_path"。
- --add-binary:将额外的二进制文件复制到可执行文件中。语法为
--add-binary "source_path;destination_path"
。
4、图标相关参数:
- --icon:指定应用程序的图标文件。
5、其他参数:
- --clean:在打包之前先清理之前生成的临时文件和输出目录。
- --debug:生成更详细的调试信息,用于调试打包过程中的问题。
- --log-level:指定日志记录的级别,可以是DEBUG、INFO、WARN、ERROR或CRITICAL。
注意事项:
- 如果应用程序包含额外的资源文件(如图像、文本文件等),您可能需要使用
--add-data
选项告诉PyInstaller将这些文件包含在可执行文件中。 - 在macOS上打包时,可以使用
--icon
选项指定应用程序的图标,例如:--icon=your_icon.icns
。
相关文章:

使用Python Tkinter创建GUI应用程序
大家好,当我们谈及使用Python Tkinter创建GUI应用程序时,我们涉及的不仅是技术和代码,更是关于创造力和用户体验的故事。Tkinter作为Python标准库中最常用的GUI工具包,提供了丰富的功能和灵活的接口,让开发者能够轻松地…...

使用 RT 矩阵进行 3D 点云变换详解(基于 PCL 和 Eigen 库)
在 3D 点云处理中,RT 矩阵是一个常用的工具,用于对点云进行旋转和平移操作。本文将详细介绍 RT 矩阵的概念,并通过一个示例程序演示如何基于 PCL 和 Eigen 库将一帧点云进行矩阵变换再输出。 本教程的示例代码和点云数据可在 GitHub 下载。 什…...

CTFHUB技能树——SSRF(二)
目录 上传文件 FastCGI协议 Redis协议 上传文件 题目描述:这次需要上传一个文件到flag.php了.祝你好运 index.php与上题一样,使用POST请求的方法向flag.php传递参数 //flag.php页面源码 <?phperror_reporting(0);if($_SERVER["REMOTE_ADDR&…...

Vue3实现简单的瀑布流效果,可抽离成组件直接使用
先来看下效果图: 瀑布流中的内容可进行自定义,这里的示例图是通过不同背景颜色的展示进行区分,每个瀑布流中添加了自定义图片和文字描述。 实现方式: 1.建立子组件(可单独抽离)写出瀑布流的样式 文件名为…...
【已解决】C#如何消除Halcon上一次显示窗口的涂层
前言 在通过C#进行封装Halcon的时候发现一个问题,就是如果我重新去标定一个图像的时候不能把上一次的清掉,然后之前的会覆盖掉原来的,这个确实是这样,但是如果说现在的图像面积比之前的小的那么就没有任何效果显示,因…...

XShell-连接-Centos 7
XShell 连接Centos 7 一.准备 安装XShell XShell下载地址: 在虚拟机上安装Centos 7,具体操作自行学习 二.Centos 7的准备 1.网络适配器修改为NAT 2.获取IP 输入命令: ip addr我的Centos 7对外IP为192.168.174.129 三.XShell连接Cento…...
vue3 组件刷新
在 Vue 3 中,如果你想刷新一个组件,有几种方法可以实现。 使用 key 属性: 当你想要强制重新渲染一个组件时,你可以为其添加一个独特的 key 属性。当 key 属性的值改变时,Vue 会强制组件重新创建。 <template> <MyComp…...

Java进阶学习笔记14——模板方法设计模式
面试和看源码。 谈到设计模式: 1、解决了什么问题? 2、怎么写? 模板方法设计模式解决了什么问题? 解决方法中存在重复代码的问题。 写法: 1)定义一个抽象类: 2)在里面定义两个方…...

Centos7静态路由和动态路由
路由,即路由选择(Routing),是指在计算机网络中选择数据传输路径的过程。路由器(Router)是执行路由选择功能的网络设备。路由的主要目的是在复杂的网络结构中,选择最佳路径将数据包从源节点传递到…...

戴尔(Dell)服务器运行状况监控
戴尔(Dell)服务器因其加速的性能、增强的自动化和简化的管理而受到全球许多组织的青睐,许多组织将其业务关键应用程序和功能放在戴尔(Dell)服务器中,因此,有效的戴尔(Dell࿰…...

微信小程序毕业设计-智慧旅游平台系统项目开发实战(附源码+演示视频+LW)
大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:微信小程序毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计…...

抖音小店新规又来了!平台下调了两项门槛,惊掉商家下巴!
大家好,我是电商糖果 平台这几年为了快速发展电商项目,一直在向商家释放友好政策,目的就是为了吸引更多的商家入驻。 这不官方5月30日起下调了两个门槛,让不少商家大呼不可思议。 第一个就是保证金下调。 平台按照商家经营类目…...

【启程Golang之旅】运算符与流程控制讲解
欢迎来到Golang的世界!在当今快节奏的软件开发领域,选择一种高效、简洁的编程语言至关重要。而在这方面,Golang(又称Go)无疑是一个备受瞩目的选择。在本文中,带领您探索Golang的世界,一步步地了…...
Docker: exec命令浅析
简介 Docker exec命令是Docker提供的一个强大工具,用于在正在运行的容器中执行命令。在此将介绍Docker exec命令的用法和示例,帮助大家更好地理解和使用这个命令。 Docker是一种流行的容器化平台,允许用户在容器中运行应用程序。有时候&#…...
c++的查漏补缺 1、函数指针
今天写链表的插入排序时遇到了一个问题 void InsertionSortList(ListNode* head, int n){if (!head||!head->next) return nullptr;auto dummy new ListNode(-1);dummy->next head;auto pre head;auto cur head->next;while (cur ! NULL){auto tmp dummy;if (pre…...

uniapp+php服务端实现苹果iap内购的消耗性项目和非续期订阅项目,前后端代码加逻辑分析
前言:公司的项目app在上架苹果商店时发现人家要求里面的部分购买项目必须使用iap购买的方式,使用原本的微信支付方式审核不给通过,无奈只能重新研究这个东西。做起来还是有点麻烦,主要是网上的文章很少,不能直接硬抄。…...

【代码随想录】【算法训练营】【第11天】 [20]有效的括号 [1047]删除字符串中的所有相邻重复项 [150]逆波兰表达式求值
前言 思路及算法思维,指路 代码随想录。 题目来自 LeetCode。 day 11,周六,又开始变的困难了~ 题目详情 [20] 有效的括号 题目描述 20 有效的括号 解题思路 前提:括号匹配 思路:利用栈的后入先出特性…...
vue实现图片懒加载
在src中创建一个directives文件夹在里面创建一个lazy.js文件 在main.js中引入 import lazy from ./directives/lazy app.directive(lazy, lazy) 在app.vue中 <script setup lang"ts"> import { RouterLink, RouterView } from vue-router import HelloWorl…...

Python | Leetcode Python题解之第101题对称二叉树
题目: 题解: class Solution:# 在【100. 相同的树】的基础上稍加改动def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:if p is None or q is None:return p is qreturn p.val q.val and self.isSameTree(p.left, q.ri…...

Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...