使用Python Tkinter创建GUI应用程序

news2024/11/15 7:39:24

        大家好,当我们谈及使用Python Tkinter创建GUI应用程序时,我们涉及的不仅是技术和代码,更是关于创造力和用户体验的故事。Tkinter作为Python标准库中最常用的GUI工具包,提供了丰富的功能和灵活的接口,让开发者能够轻松地构建出各种各样的图形用户界面。Tkinter不仅易于学习和上手,而且具有强大的功能,足以满足各种应用场景的需求。从简单的计算器到复杂的数据可视化工具,Tkinter都能胜任。

一、Tkinter简介

        Tkinter是Python标准库中用于创建图形用户界面(GUI)的工具包。它基于Tk GUI工具包,Tkinter提供了访问Tk GUI工具包的Python接口,使得开发GUI应用程序变得相对简单。下面是关于Tkinter的一些详细介绍:

Tkinter的特点:

  1. 跨平台性:Tkinter是Python标准库的一部分,因此可以在几乎所有支持Python的操作系统上运行,包括Windows、Linux和macOS。
  2. 易学易用:Tkinter提供了相对简单的API,对于初学者来说很容易上手,同时也能够满足大多数简单到中等复杂度的GUI应用程序的需求。
  3. 集成度高:由于是Python标准库的一部分,因此不需要额外安装其他软件包或库,可以直接在Python环境中使用。
  4. 可扩展性:Tkinter提供了许多内置的小部件(widgets),如按钮、标签、文本框等,同时也支持自定义小部件和布局管理器。

Tkinter中的一些重要概念:

  1. 窗口(Window):所有Tkinter应用程序的基础是窗口,可以是主窗口或者其他类型的弹出窗口。
  2. 小部件(Widgets):Tkinter提供了各种小部件,如按钮、标签、文本框、列表框等,用于构建GUI界面。
  3. 布局管理器(Layout Managers):Tkinter提供了几种布局管理器来帮助开发者将小部件布置在窗口中的合适位置,常用的有Pack、Grid和Place。
  4. 事件驱动(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布局管理器将窗口划分为网格,并允许开发者将小部件放置在网格中的特定位置。可以通过指定rowcolumn参数来确定小部件所在的行和列。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事件驱动的基本原理

  1. 事件:在Tkinter中,事件可以是鼠标事件、键盘事件、窗口事件等,每个事件都有一个特定的类型和相关的属性,以描述事件的来源和内容。

  2. 事件绑定:通过调用小部件的bind()方法,可以将特定事件与相应的事件处理函数绑定起来。当指定的事件发生时,Tkinter会调用相应的事件处理函数来处理该事件。

  3. 事件处理函数:事件处理函数是用户自定义的函数,用于处理特定类型的事件。当相应类型的事件发生时,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

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

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

相关文章

《计算机网络微课堂》2-3 传输方式

本节课我们介绍几种传输方式&#xff1a; 串行传输和并行传输同步传输和异步传输单工&#xff0c;半双工‍‍以及全双工通信 ​​ ‍ 串行 我们首先来看串行传输和并行传输&#xff0c;串行传输是指‍‍数据是一个比特依次发送的&#xff0c;因此在发送端和接收端之间‍‍只…

YOLOv10 论文学习

论文链接&#xff1a;https://arxiv.org/pdf/2405.14458 代码链接&#xff1a;https://github.com/THU-MIG/yolov10 解决了什么问题&#xff1f; 实时目标检测是计算机视觉领域的研究焦点&#xff0c;目的是以较低的延迟准确地预测图像中各物体的类别和坐标。它广泛应用于自动…

速看!!!24上软考-信息系统项目管理师真题回忆,考点已更新

整理了24上半年软考高级信息系统项目管理师的考试真题&#xff0c;软考一个批次一套题&#xff0c;现在都是机考&#xff0c;收集题目比较困难&#xff0c;希望能给个小小的赞支持一下。 注意&#xff1a;当天考试的宝子们可以对答案预估分数&#xff01;后面场次的宝子可以提…

基于jeecgboot-vue3的Flowable新建流程定义(一)

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 1、vue3版本因为流程分类是动态的&#xff0c;不再固定了&#xff0c;所以新建的时候需要选择建立哪种流程类型的流程 代码如下&#xff1a; <!-- 选择模型的流程类型对话框 -->&…

Spring Cloud学习笔记(Nacos):配置中心基础和代码样例

这是本人学习的总结&#xff0c;主要学习资料如下 - 马士兵教育 1、Overview2、样例2.1、Dependency2.2、配置文件的定位2.3、bootstrap.yml2.4、配置中心新增配置2.5、验证 1、Overview 配置中心用于管理配置项和配置文件&#xff0c;比如平时写的application.yml就是配置文件…

【MySQL】聊聊脏页flush的原理和控制策略

flush的时机 当更新一条SQL的时候&#xff0c;其实是先写undo日志&#xff0c;然后更新数据&#xff0c;二阶段写入redo 和 bin log。对于更新数据&#xff0c;其实是只修改了changer buffer中的数据&#xff0c;比如将name qxlxi, 但是磁盘数据页没有和内存页数据保持一致。…

删除指定目录

题目描述 我们定义一种目录结构字符串(类似Windows的 tree /f 的输出内容),用它来表达目录树的结构,如图所示: 目录结构字符串的输入仅含数字、字母和|-,其中:|- 表示子目录的层次符号;字母或数字组成目录名(字母大小写敏感)。 某一子目录挂接在其前面、最近的上一层…

【Linux系统编程】进程概念、进程排队、进程标识符、进程状态

目录 什么是进程&#xff1f; 浅谈进程排队 简述进程属性 进程属性之进程标识符 进程操作之进程创建 初识fork fork返回值 原理角度理解fork fork的应用 进程属性之进程状态 再谈进程排队 进程状态 运行状态 阻塞状态 挂起状态 Linux下的进程状态 “R”(运行状…

【Go专家编程——内存管理——垃圾回收】

垃圾回收 所谓的垃圾就上不在需要的内存块&#xff0c;垃圾如果不清理&#xff0c;这些内存块就没有办法再次被分配使用。在不支持垃圾回收的编程语言中&#xff0c;这些垃圾内存就上泄露的内存。 1. 垃圾回收算法 常见的垃圾回收算法有3种 引用计数&#xff1a;对每个对象…

SpringCloud的Config配置中心,为什么要分Server服务端和Client客户端?

SpringCloud的Config配置中心&#xff0c;为什么要分Server服务端和Client客户端&#xff1f; 在SpringCloud的Config配置中心中分了Server服务端和Client客户端&#xff0c;为什么需要这样分呢&#xff1f;它的思想是所有微服务的配置文件都放到git远程服务器上&#xff0c;让…

使用FFmpeg推流实现在B站24小时点歌直播

使用FFmpeg推流实现在B站24小时点歌直播 本文首发于个人博客 安装FFmpeg centos7 https://www.myfreax.com/how-to-install-ffmpeg-on-centos-7/ https://linuxize.com/post/how-to-install-ffmpeg-on-centos-7/ 使用FFmpeg在B站直播 https://zhuanlan.zhihu.com/p/2395…

机器学习(五) -- 监督学习(5) -- 线性回归1

系列文章目录及链接 上篇&#xff1a;机器学习&#xff08;五&#xff09; -- 监督学习&#xff08;4&#xff09; -- 集成学习方法 - 随机森林 下篇&#xff1a;机器学习&#xff08;五&#xff09; -- 监督学习&#xff08;5&#xff09; -- 线性回归2 前言 tips&#xff1…

Redis教程(十五):Redis的哨兵模式搭建

一、搭建Redis一主二从 分别复制三份Redis工作文件夹&#xff0c;里面内容一致 接着修改7002的配置文件&#xff0c;【redis.windows-service.conf】 port 7002 改成 port 7002 slaveof 127.0.0.1 7001 7003也同样修改 port 7003 slaveof 127.0.0.1 7001 这样就指定了700…

B站滑块登录之极验点选

滑块登录这些东西都不是很难&#xff0c;我个人的去处理的话一般会考虑三种方案&#xff0c;一个是自动化selenium 二是各类打码平台 三是ocr识别&#xff0c;本文是selenium接打码平台&#xff0c;也是个比较常规的操作。 先常规步骤跟着来吧&#xff0c;做登录的话把基本的模…

【启程Golang之旅】运算符与流程控制讲解

欢迎来到Golang的世界&#xff01;在当今快节奏的软件开发领域&#xff0c;选择一种高效、简洁的编程语言至关重要。而在这方面&#xff0c;Golang&#xff08;又称Go&#xff09;无疑是一个备受瞩目的选择。在本文中&#xff0c;带领您探索Golang的世界&#xff0c;一步步地了…

【qt】标准型模型 下

标准型模型 一.前言二.预览数据1.获取表头2.获取数据项 三.保存文件1.文件对话框获取保存文件名2.用文件名初始化文件对象3.打开文件对象4.用文件对象初始化文本流5.写入数据 四.格式1.居右2.居中3.居左4.粗体 五.模型的信号1.解决粗体action问题2.状态栏显示信息 六.总结 一.前…

【Spring Boot】深度复盘在开发搜索引擎项目中重难点的整理,以及遇到的困难和总结

&#x1f493; 博客主页&#xff1a;从零开始的-CodeNinja之路 ⏩ 收录文章&#xff1a;【Spring Boot】深度复盘在开发搜索引擎项目中重难点的整理&#xff0c;以及遇到的困难和总结 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 什么是搜索引…

NTFS文件系统文件寻址实操记录

前言 最近在学NTFS&#xff0c;发现网上的博客千篇一律&#xff0c;讲的不够通透&#xff0c;于是决定自己写一篇。 本文章通过寻找文件地址这个任务&#xff0c;讲述了NTFS文件系统$Boot文件、$MFT文件的结构&#xff0c;对$MFT文件中的A0、80属性进行了重点分析。 本文对于…

k8s-pod详解

一、Pod基本概念&#xff1a; 1.pod介绍&#xff1a; Pod是kubernetes中最小的资源管理组件&#xff0c;Pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。kubernetes中其他大多数组件都是围绕着Pod来进行支撑和扩展Pod功能的&#xff0c;例如&am…

vs2013使用qt Linguist以及tr不生效问题

一、qt Linguist&#xff08;语言家&#xff09;步骤流程 1、创建翻译文件,在qt选项中 2.选择对应所需的语言&#xff0c;得到.ts后缀的翻译文件 3.创建.pro文件&#xff0c;并将.ts配置在.pro文件中 3.使用qt Linguist 打开创建好的以.ts为后缀的翻译文件&#xff0c;按图所示…