【二】为Python Tk GUI窗口添加一些组件和绑定一些组件事件

文章目录

    • 背景
    • 系统环境
    • 添加一些组件
      • 添加一个Tab标签
      • Frame标签内添加两个单选框、按钮
      • 为按钮添加事件(预览图片、生成图片按钮和事件)
    • 运行示例
      • 添加notebook组件和frame组件(见标题【添加一个Tab标签】)
      • 在frame组件上添加单选框和按钮(见标题【Frame标签内添加两个单选框、按钮】)
      • 在按钮上添加事件(见标题【为按钮添加事件(预览图片、生成图片按钮和事件)】)
        • 点击图片预览
        • 预览图片展示
        • 点击生成图片

背景

        这是一个系列文章。上一篇【【一】创建Python TK GUI窗口,并简单设置窗口-CSDN博客】
        使用python脚本写一个小工具。因为命令行运行的使用会有dos窗口,交互也不是很方便,开发环境运行也不方便分享给别人用,所以想到使用一个简单、易学、好上手的GUI工具给包装一下,达到一个直观、易用的目的,也可以打包分享给别人。

系统环境

  • python 3.0
  • 开发环境windows 11,最低打包运行环境windows 10
  • 开发工具PyCharm

添加一些组件

添加一个Tab标签

main_tk.py

# -*- coding: UTF-8 -*-

from tkinter import Tk
from tkinter import Frame # frame子页面
from tkinter.messagebox import askyesno
from tkinter.ttk import Notebook  # Tab标签
from threading import Thread
from sys import exit

"""
首行配置输出中文乱码
引入tk依赖:最好使用from的方式引入,避免后续打包的时候会加入很多无用的包,造成运行文件过大
"""


class MainTk:
    """MainTk: 主窗口配置对象"""

    _root = None
    """私有成员变量,不能通过对象点的方式获得,必须通过get方式获取"""

    _thread = None
    """线程对象"""

    def __init__(self, root: Tk):
        self._root = root
        """设置窗口大小和位置"""
        width = 700  # 窗口宽度
        height = 500  # 窗口高度
        position_x = 300  # 窗口距离屏幕左边的水平距离
        position_y = 100  # 窗口距离屏幕右边的水平距离
        geometry = str(width) + 'x' + str(height) + '+' + str(position_x) + '+' + str(position_y)
        self._root.geometry(geometry)

        """设置窗口标题"""
        self._root.title('Tools')

        """设置窗口图标:图标路径,我这里logo放在运行main的当前目录"""
        self._root.iconbitmap('logo.ico')

        """点击右上角关闭窗口的监听"""
        self._root.protocol("WM_DELETE_WINDOW", lambda: self.thread_it(self.close_app()))

        """==================================="""
        """创建一个Tab标签"""
        self.add_image_notebook()

    def add_image_notebook(self):
        # 创建一个Tab标签对象,并指定宽高,内容填充边距
        notebook = Notebook(self._root, width=680, height=460, padding=3)

        """
            添加notebook的子页面:Frame
            参数:
                bg:frame背景颜色
                width:宽度
                height:高度
        """

        frame = Frame(notebook, bg='#f8f7f6', width=680, height=460)
        notebook.add(child=frame, text='图片格式转换')

        """
            grid网格布局: 使用网格化布局。这里需要注意的是布局方式不能混用,不能既使用grid网格布局又实用pack布局
            参数:
                row:放在第x行,从0开始
                column: 放在第x列,从0开始
                rowspan: 合并行单元格
                columnspan: 合并列单元格
                padx:设置水平方向的内填充距离
                pady:设置垂直方向的内填充距离
                ipadx: 设置水平方向的外部填充距离
                ipady: 设置垂直方向的外部填充距离
                
        """
        notebook.grid(row=0, column=0, rowspan=12, columnspan=12, padx=10, pady=5)

    def thread_it(self, func, *args):
        self._thread = Thread(target=func, args=args, daemon=True)
        self._thread.start()

    def close_app(self):
        ans = askyesno(title='提示', message='是否确定退出程序?')
        if ans:
            # 销毁窗口
            self._root.destroy()
            exit()
        else:
            return None


if '__main__' == __name__:
    tk = Tk()
    main_tk = MainTk(root=tk)

    # 启动窗口
    tk.mainloop()

Frame标签内添加两个单选框、按钮

main_tk.py

# -*- coding: UTF-8 -*-

from tkinter import Tk
from tkinter import Frame
from tkinter import Radiobutton  # 单选框
from tkinter import Button  # 按钮
from tkinter.constants import DISABLED  # 引入通用常量,禁用
from tkinter.constants import NORMAL  # 引入通用常量,启用
from tkinter import StringVar  # 变量
from tkinter.messagebox import askyesno
from tkinter.ttk import Notebook  # Tab标签
from threading import Thread
from sys import exit

"""
首行配置输出中文乱码
引入tk依赖:最好使用from的方式引入,避免后续打包的时候会加入很多无用的包,造成运行文件过大
"""


class MainTk:
    """MainTk: 主窗口配置对象"""

    _root = None
    """私有成员变量,不能通过对象点的方式获得,必须通过get方式获取"""

    _thread = None
    """线程对象"""

    def __init__(self, root: Tk):
        self._root = root
        """设置窗口大小和位置"""
        width = 700  # 窗口宽度
        height = 500  # 窗口高度
        position_x = 300  # 窗口距离屏幕左边的水平距离
        position_y = 100  # 窗口距离屏幕右边的水平距离
        geometry = str(width) + 'x' + str(height) + '+' + str(position_x) + '+' + str(position_y)
        self._root.geometry(geometry)

        """设置窗口标题"""
        self._root.title('Tools')

        """设置窗口图标:图标路径,我这里logo放在运行main的当前目录"""
        self._root.iconbitmap('logo.ico')

        """点击右上角关闭窗口的监听"""
        self._root.protocol("WM_DELETE_WINDOW", lambda: self.thread_it(self.close_app()))

        """==================================="""
        """创建一个Tab标签"""
        self.add_image_notebook()

    def add_image_notebook(self):
        # 创建一个Tab标签对象,并指定宽高,内容填充边距
        notebook = Notebook(self._root, width=680, height=460, padding=3)

        """
            添加notebook的子页面:Frame
            参数:
                bg:frame背景颜色
                width:宽度
                height:高度
        """

        frame = Frame(notebook, bg='#f8f7f6', width=680, height=460)

        """
            在frame内添加其他组件:
                Radiobutton单选框:
                    参数:
                        master:单选框的上级组件
                        text: 单选框显示的文本
                        variable: 标识为同一组单选框,不和其他类型冲突
                        cursor: 鼠标悬浮到单选框时的样式 hand2手型
                        state: 单选框状态,使用引入的常量表示,NORMAL,一般状态;DISABLED,禁用状态
                Button按钮:
                    参数:
                        
        """
        val = StringVar(value='to_ico')  # 给默认值
        r_btn1 = Radiobutton(frame, text='图片转ico', value='to_ico', variable=val, cursor='hand2', state=NORMAL)
        r_btn2 = Radiobutton(frame, text='图片转svg', value='to_svg', variable=val, cursor='hand2', state=DISABLED)

        # 单选框添加到窗口
        r_btn1.grid(row=0, column=0)
        r_btn2.grid(row=0, column=1)

        change_btn = Button(frame, text='选择预览')
        convert_btn = Button(frame, text='生成图片')

        change_btn.grid(row=0, column=2, padx=10)
        convert_btn.grid(row=0, column=3, padx=10)

        # frame添加到notebook
        notebook.add(child=frame, text='图片格式转换')

        """
            grid网格布局: 使用网格化布局。这里需要注意的是布局方式不能混用,不能既使用grid网格布局又实用pack布局
            参数:
                row:放在第x行,从0开始
                column: 放在第x列,从0开始
                rowspan: 合并行单元格
                columnspan: 合并列单元格
                padx:设置水平方向的外填充距离
                pady:设置垂直方向的外填充距离
                ipadx: 设置水平方向的内填充距离
                ipady: 设置垂直方向的内填充距离
                
        """
        notebook.grid(row=0, column=0, rowspan=12, columnspan=12, padx=10, pady=5)

    def thread_it(self, func, *args):
        self._thread = Thread(target=func, args=args, daemon=True)
        self._thread.start()

    def close_app(self):
        ans = askyesno(title='提示', message='是否确定退出程序?')
        if ans:
            # 销毁窗口
            self._root.destroy()
            exit()
        else:
            return None


if '__main__' == __name__:
    tk = Tk()
    main_tk = MainTk(root=tk)

    # 启动窗口
    tk.mainloop()

为按钮添加事件(预览图片、生成图片按钮和事件)

main_tk.py

# -*- coding: UTF-8 -*-

from tkinter import Tk
from tkinter import Frame
from tkinter import Radiobutton  # 单选框
from tkinter import Button  # 按钮
from tkinter import Label  # 文本标签,可以借助文本标签展示图片
from tkinter import filedialog  # 导入文件路径选择
from tkinter.constants import DISABLED  # 引入通用常量,禁用
from tkinter.constants import NORMAL  # 引入通用常量,启用
from tkinter.constants import N  # 引入通用常量,位置
from tkinter.constants import S  # 引入通用常量,位置
from tkinter.constants import W  # 引入通用常量,位置
from tkinter.constants import E  # 引入通用常量,位置
from tkinter import StringVar  # 变量
from tkinter.messagebox import askyesno
from tkinter.messagebox import showerror  # 错误对话提示框
from tkinter.messagebox import showinfo  # 消息提示对话提示框
from tkinter.ttk import Notebook  # Tab标签
from threading import Thread
from PIL import Image, ImageTk  # pip3 install Image
from sys import exit

"""
首行配置输出中文乱码
引入tk依赖:最好使用from的方式引入,避免后续打包的时候会加入很多无用的包,造成运行文件过大
"""


class MainTk:
    """MainTk: 主窗口配置对象"""

    _root = None
    """私有成员变量,不能通过对象点的方式获得,必须通过get方式获取"""

    _thread = None
    """线程对象"""

    r_val = None

    #
    _img_lab_desc = None
    _img_lab = None
    # 图片本地地址
    _image_file_path = None

    # 设置成全局变量:子页面
    frame = None

    # 按钮
    change_btn = None
    convert_btn = None

    def __init__(self, root: Tk):
        self._root = root
        """设置窗口大小和位置"""
        width = 700  # 窗口宽度
        height = 500  # 窗口高度
        position_x = 300  # 窗口距离屏幕左边的水平距离
        position_y = 100  # 窗口距离屏幕右边的水平距离
        geometry = str(width) + 'x' + str(height) + '+' + str(position_x) + '+' + str(position_y)
        self._root.geometry(geometry)

        """设置窗口标题"""
        self._root.title('Tools')

        """设置窗口图标:图标路径,我这里logo放在运行main的当前目录"""
        self._root.iconbitmap('logo.ico')

        """点击右上角关闭窗口的监听"""
        self._root.protocol("WM_DELETE_WINDOW", lambda: self.thread_it(self.close_app()))

        """==================================="""
        """创建一个Tab标签"""
        self.add_image_notebook()

    def add_image_notebook(self):
        # 创建一个Tab标签对象,并指定宽高,内容填充边距
        notebook = Notebook(self._root, width=680, height=460, padding=3)

        """
            添加notebook的子页面:Frame
            参数:
                bg:frame背景颜色
                width:宽度
                height:高度
        """

        self.frame = Frame(notebook, bg='#f8f7f6', width=680, height=460)

        """
            在frame内添加其他组件:
                Radiobutton单选框:
                    参数:
                        master:单选框的上级组件
                        text: 单选框显示的文本
                        variable: 标识为同一组单选框,不和其他类型冲突
                        cursor: 鼠标悬浮到单选框时的样式 hand2手型
                        state: 单选框状态,使用引入的常量表示,NORMAL,一般状态;DISABLED,禁用状态
                Button按钮:
                    参数:
                        
        """
        self.r_val = StringVar(value='to_ico')  # 给默认值
        r_btn1 = Radiobutton(self.frame, text='图片转ico', value='to_ico', variable=self.r_val, cursor='hand2',
                             state=NORMAL)
        r_btn2 = Radiobutton(self.frame, text='图片转svg', value='to_svg', variable=self.r_val, cursor='hand2',
                             state=DISABLED)

        # 单选框添加到窗口
        r_btn1.grid(row=0, column=0)
        r_btn2.grid(row=0, column=1)

        self.change_btn = Button(self.frame, text='选择预览', command=self.change_image)
        self.convert_btn = Button(self.frame, text='生成图片', state=DISABLED, command=self.to_convert)

        self.change_btn.grid(row=0, column=2, padx=10)
        self.convert_btn.grid(row=0, column=3, padx=10)

        # frame添加到notebook
        notebook.add(child=self.frame, text='图片格式转换')

        """
            grid网格布局: 使用网格化布局。这里需要注意的是布局方式不能混用,不能既使用grid网格布局又实用pack布局
            参数:
                row:放在第x行,从0开始
                column: 放在第x列,从0开始
                rowspan: 合并行单元格
                columnspan: 合并列单元格
                padx:设置水平方向的外填充距离
                pady:设置垂直方向的外填充距离
                ipadx: 设置水平方向的内填充距离
                ipady: 设置垂直方向的内填充距离
                
        """
        notebook.grid(row=0, column=0, rowspan=12, columnspan=12, padx=10, pady=5)

    def change_image(self):
        """
            选择图片进行预览
        """

        # 使用文件选择框:弹出对话框,选择指定类型的文件。返回选择文件的绝对路径
        d_path = filedialog.askopenfilename(title='选择图片',
                                            filetypes=[('Image File', "*.png *.jpg *.jpeg *.svg")])
        if not d_path:
            return
        # 选择的图片赋值给成员变量,方便转换图片的时候使用
        self._image_file_path = d_path
        # 获取到单选框选择的value值
        val = self.r_val.get()

        # 判断是否符合单选框选中的值,决定执行怎样预览图片
        if val == 'to_ico' or val == 'to_svg':
            self.show_image(self.frame, self._image_file_path)
        else:
            self.show_default(self.frame, self._image_file_path)

    def show_image(self, parent_frame: Frame, file_image_path: str):
        print('file_path:', file_image_path)
        self._img_lab_desc = Label(parent_frame, text='图片预览')
        self._img_lab_desc.grid(row=1, column=0, columnspan=24, padx=(0, 0), sticky='NSWE')

        # ====================================
        # https://blog.csdn.net/fjdmy001/article/details/78498150
        # 如果Label展示图片不能显示出来,变量前面加一个global就能正常显示了
        global img, photo_image
        img = Image.open(file_image_path)
        photo_image = ImageTk.PhotoImage(img.resize((180, 180)))
        self._img_lab = Label(parent_frame, image=photo_image, height=300, width=250)
        # ====================================
        """
            sticky: 对齐方式
                N:向上对齐
                S:向下对齐
                W:向左对齐
                E:向右对齐
        """
        self._img_lab.grid(row=2, column=0, columnspan=24, padx=(0, 0), pady=(5, 0), sticky='NSWE')

        if file_image_path is not None or file_image_path != '':
            self.convert_btn.config(state=NORMAL)

    def show_default(self, parent_frame: Frame, file_image_path):
        self._img_lab_desc = Label(parent_frame, text='该格式暂不支持预览,可直接转换')
        self._img_lab_desc.grid(row=1, column=0, columnspan=24, padx=(0, 0), sticky=N + S + W + E)

        if file_image_path is not None or file_image_path != '':
            self.convert_btn.config(state=NORMAL)

    def to_convert(self):
        """
            去进行图片转换
        """
        tip = True
        # 获取需要处理的转换类型
        ty = self.r_val.get()

        if ty == 'to_ico':
            self.image_to_ico(self._image_file_path)
        elif ty == 'to_svg':
            self.image_to_svg(self._image_file_path)
        else:
            tip = False
            showerror('提示', '未处理的转换类型.')
        if tip:
            showinfo('提示', '转换完成')

    def image_to_ico(self, file_path, icon_sizes=None):
        """
            图片转换为ico
        """
        # 给默认值
        if icon_sizes is None:
            icon_sizes = [(64, 64)]
        # 处理图片名
        arr = file_path.split('/')
        file_name = arr[len(arr) - 1].split('.')[0]
        # 打开文件提示框,选择图片生成路径
        save = filedialog.asksaveasfile(title='下载路径', initialfile=file_name + '.ico',
                                        filetypes=[("Image Types", "*.ico")])
        print('dp: %s' % save.name)
        # 以只读的方式打开png图片
        image = Image.open(file_path, 'r')
        # icon_sizes = [(16, 16), (32, 32), (48, 48), (64, 64)]
        # icon_sizes = [(64, 64)]
        image.save(save.name, sizes=icon_sizes)

    def image_to_svg(self, file_path):
        """
           图片转换为svg
        """
        # 处理图片名
        arr = file_path.split('/')
        file_name = arr[len(arr) - 1].split('.')[0]
        # 打开文件提示框,选择图片生成路径
        save = filedialog.asksaveasfile(title='下载路径', initialfile=file_name + '.svg',
                                        filetypes=[("Image Types", "*.svg")])

        print('dp: %s' % save.name)
        image = Image.open(file_path).convert('RGBA')
        data = image.load()
        width, height = image.size
        out = open(save.name, "w")
        out.write('<?xml version="1.0" encoding="UTF-8" standalone="no"?>\n')
        out.write('<svg id="svg2" xmlns="http://www.w3.org/2000/svg" version="1.1" \
                        width="%(x)i" height="%(y)i" viewBox="0 0 %(x)i %(y)i">\n' % \
                  {'x': width, 'y': height})

        for y in range(height):
            for x in range(width):
                rgba = data[x, y]
                rgb = '#%02x%02x%02x' % rgba[:3]
                if rgba[3] > 0:
                    out.write('<rect width="1" height="1" x="%i" y="%i" fill="%s" \
                            fill-opacity="%.2f" />\n' % (x, y, rgb, rgba[3] / 255.0))
        out.write('</svg>\n')
        out.close()

    def thread_it(self, func, *args):
        self._thread = Thread(target=func, args=args, daemon=True)
        self._thread.start()

    def close_app(self):
        ans = askyesno(title='提示', message='是否确定退出程序?')
        if ans:
            # 销毁窗口
            self._root.destroy()
            exit()
        else:
            return None


if '__main__' == __name__:
    tk = Tk()
    main_tk = MainTk(root=tk)

    # 启动窗口
    tk.mainloop()

运行示例

添加notebook组件和frame组件(见标题【添加一个Tab标签】)

image.png

在frame组件上添加单选框和按钮(见标题【Frame标签内添加两个单选框、按钮】)

image.png

在按钮上添加事件(见标题【为按钮添加事件(预览图片、生成图片按钮和事件)】)

点击图片预览

image.png

预览图片展示

image.png

点击生成图片

image.png
image.png

生成的icon图标,就可以作为python左上角的图标展示了,同时还可以用作打包exe图标。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

dpdk20.11.9 编译arm版本以及在arm 应用中引用dpdk20.11.9

以往19版本的dpdk 都是可以直接用make 的方式进行编译, e.g, make Tx86_64-native-linux-gcc install 为了和客户那边用的DPDK 版本一致, 这次要用dpdk20.11.9, 并且要把之前跑在X86 版本的服务器上的程序跑在ARM 版本上. 目前有两个问题: 1. 编译出arm 版本的dpdk. 2. 把…

Spark与云存储的集成:S3、Azure Blob Storage

在现代数据处理中&#xff0c;云存储服务如Amazon S3和Azure Blob Storage已成为存储和管理数据的热门选择。与此同时&#xff0c;Apache Spark作为大数据处理框架也备受欢迎。本文将深入探讨如何在Spark中集成云存储服务&#xff0c;并演示如何与S3和Azure Blob Storage进行互…

R语言安装教程(附安装包链接)

R是用于统计分析、绘图的语言和操作环境。R是属于GNU系统的一个自由、免费、源代码开放的软件&#xff0c;它是一个用于统计计算和统计制图的优秀工具。 Mac支持M1芯片&#xff0c;下载其中的arm即可&#xff0c;其余下载另一个文件 下载链接&#xff1a; 链接: https://pan…

Python如何使用Excel文件

使用Python操作Office——EXCEL 首先介绍下office win32 com接口&#xff0c;这个是MS为自动化提供的操作接口&#xff0c;比如我们打开一个EXCEL文档&#xff0c;就可以在里面编辑VB脚本&#xff0c;实现我们自己的效果。对于这种一本万利的买卖&#xff0c;Python怎么能放过…

怎么样检查自己系统上的Python环境中是否有某个包(扩展库)?

比如我们这里想看下有没有库pytz 很简单&#xff0c;进入Python的命令行&#xff0c;然后输入下面的命令&#xff1a; import pytz如果有这个库&#xff0c;则不会报错&#xff0c;否则会报错。 Windows的测试结果如下&#xff1a; Centos的测试结果如下&#xff1a;

【LV12 DAY12-13 GPIO C 语言与寄存器封装】

GPIO 通用型输入输出&#xff0c;GPIO可以控制连接在其引脚实现信号的输入和输出 芯片的引脚和外部设备相连从而实现与外部硬件的通讯&#xff0c;控制&#xff0c;信号采集的功能。 控制CHG_COK引脚输出为高电平&#xff0c;LED亮&#xff0c;输出为低电平&#xff0c;LED熄灭…

麦芯(MachCore)开发教程1 --- 设备软件中间件

黄国强 2024/1/10 acloud163.com 对任何公司来说&#xff0c;在短时间内开发一款高质量设备专用软件&#xff0c;是一件不太容易做到的事情。麦芯是笔者发明的一款设备软件中间件产品。麦芯致力于给设备厂商提供一个开发工具和平台&#xff0c;让客户快速高效的开发自己的设备专…

Unity Delaunay三角剖分算法 动态生成

Unity Delaunay三角剖分算法 动态生成 Delaunay三角剖分Delaunay三角剖分 定义Delaunay 边Delaunay 空圆特性 Delaunay 三角形Delaunay 最大化最小角特性 Delaunay 三角形特征Delaunay 算法Delaunay Lawson算法Delaunay Bowyer-Watson算法 Unity Delaunay三角剖分 应用Unity 工…

SpringBoot3 WebFlux 可观测最佳实践

前言 链路追踪是可观测性软件系统的一个非常好的工具。它使开发人员能够了解应用程序中和应用程序之间不同交互发生的时间、地点和方式。同时让观测复杂的软件系统变得更加容易。 从Spring Boot 3开始&#xff0c;Spring Boot 中用于链路追踪的旧 Spring Cloud Sleuth 解决方…

08、Kafka ------ 消息存储相关的配置-->消息过期时间设置、查看主题下的消息存活时间等配置

目录 消息存储相关的配置★ 消息的存储介绍★ 消息过期时间及处理方式演示&#xff1a;log.cleanup.policy 属性配置 ★ 修改指定主题的消息保存时间演示&#xff1a;将 test2 主题下的消息的保存时间设为10个小时1、先查看test2主题下的配置2、然后设置消息的保存时间3、然后再…

JavaScript基础课程

JavaScript 基础 - 第1天 了解变量、数据类型、运算符等基础概念&#xff0c;能够实现数据类型的转换&#xff0c;结合四则运算体会如何编程。 体会现实世界中的事物与计算机的关系 理解什么是数据并知道数据的分类 理解变量存储数据的“容器” 掌握常见运算符的使用&#x…

SpringSecurity集成JWT实现后端认证授权保姆级教程-授权配置篇

&#x1f341; 作者&#xff1a;知识浅谈&#xff0c;CSDN签约讲师&#xff0c;CSDN博客专家&#xff0c;华为云云享专家&#xff0c;阿里云专家博主 &#x1f4cc; 擅长领域&#xff1a;全栈工程师、爬虫、ACM算法 &#x1f492; 公众号&#xff1a;知识浅谈 &#x1f525;网站…

【Spring Boot】SpringMVC入门

1.什么是springMVC MVC就是把一个项目分成了三部分&#xff1a; MVC是一种思想。Spring进行了实现,称为Spring MVC。SpringBoot是创建SpringMVC项目的一种方式而已。springMVC对于MVC做出了一些改变&#xff1a; 当前阶段,MVC的概念又发生了一些变化,后端开发人员不涉及前端页…

【JaveWeb教程】(18) MySQL数据库开发之 MySQL数据库设计-DDL 如何查询、创建、使用、删除数据库数据表 详细代码示例讲解

目录 2. 数据库设计-DDL2.1 项目开发流程2.2 数据库操作2.2.1 查询数据库2.2.2 创建数据库2.2.3 使用数据库2.2.4 删除数据库 2.3 图形化工具2.3.1 介绍2.3.2 安装2.3.3 使用2.2.3.1 连接数据库2.2.3.2 操作数据库 2.3 表操作2.3.1 创建2.3.1.1 语法2.3.1.2 约束2.3.1.3 数据类…

从0到1实现html文件转换为markdown文档(进度0.1)

Spider-Man 前言准备环境1、node.js2、git 执行指令顺序报错及其解决方案一、npm 错误&#xff01;可以在以下位置找到此运行的完整日志解决方案 二、没有修改权限解决方案&#xff1a; 注意事项总结 前言 当我们处理文档时&#xff0c;常常会遇到将HTML文档转换为Markdown文档…

微信小程序:发送小程序订阅消息

文档&#xff1a;小程序订阅消息&#xff08;用户通过弹窗订阅&#xff09;开发指南 目录 步骤一&#xff1a;获取模板 ID步骤二&#xff1a;小程序端获取参数2.1、获取消息下发权限2.2、获取登录凭证&#xff08;code&#xff09; 步骤三&#xff1a;后端调用接口下发订阅消息…

从生活入手学编程(1):Edge浏览器设置自动刷新专业教程

一、前言 我们都知道&#xff0c;Edge浏览器运行时的速度卡的实在是感人…… 于是今天&#xff0c;我就突发奇想&#xff0c;来看一看怎么刷新并且还能保留页面内容。 二、探索 首先&#xff0c;我在此提醒您&#xff0c;在使用这种方法时要非常小心。因为更改网页源代…

一级倒立摆控制 - 非线性 MPC 控制及 MATLAB 实现

系列文章目录 前言 本示例使用非线性模型预测控制器对象和块实现对小车上倒立摆的摆动和平衡控制。 本示例需要 Optimization Toolbox™ 软件为非线性 MPC 提供默认的非线性编程求解器&#xff0c;以计算每个控制间隔的最优控制动作。 一、摆锤/小车装配 本例中的被控对象是…

[笔记]学习做微信小程序

学习视频&#xff1a;前端微信小程序开发教程 本篇文章 只对关键内容笔记&#xff0c;用于自用。 这里写目录标题 注册、下载、安装我的小程序ID&#xff1a;wxe1fbd6939d8797d8我的小游戏ID&#xff1a;wx8b2c3e47ac9127b7开发者工具外观代理设置 创建第一个小程序主界面5个组…

Redis:原理速成+项目实战——Redis实战8(基于Redis的分布式锁及优化)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;Redis&#xff1a;原理速成项目实战——Redis实战7&#xff08;优惠券秒杀细节解决超卖、一人一单问题&#xff09; &#x1f4d…