作者: k, k

  • python把图片横向拼接成一张图片

    由AI讯飞星火大模型辅助:

    import os
    from PIL import Image
    
    def get_image_files(folder_path):
        image_files = []
        for file in os.listdir(folder_path):
            if file.lower().endswith(('.png', '.jpg', '.jpeg', '.gif', '.bmp')):
                image_files.append(os.path.join(folder_path, file))
        return image_files
    
    def sort_image_files(image_files):
        return sorted(image_files, key=lambda x: int(''.join(filter(str.isdigit, x.split('/')[-1].split('.')[0]))))
    
    def merge_images(image_files, output_path):
        images = [Image.open(x) for x in image_files]
        widths, heights = zip(*(i.size for i in images))
    
        total_width = sum(widths)
        max_height = max(heights)
    
        new_image = Image.new('RGB', (total_width, max_height))
    
        x_offset = 0
        for image in images:
            # 纵向拼接图片
            new_image.paste(image, (x_offset, 0))
            x_offset += image.size[0]
    
        new_image.save(output_path)
    
    if __name__ == '__main__':
        folder_path = '1' #这里是图片文件夹的位置(路径)-相对路径即可
        output_path = 'output/image.png'#这里是输出文件加的位置(路径)-相对路径即可
    
        image_files = get_image_files(folder_path)
        sorted_image_files = sort_image_files(image_files)
        merge_images(sorted_image_files, output_path)
    
  • uos安装ssh

    安装ssh
    sudo apt install openssh-server
    查看ssh服务是否运行
    ps -e|grep ssh
    开启ssh服务
    sudo /etc/init.d/ssh start
    修改ssh端口
    sudo vim /etc/ssh/sshd_config
    (#Port 22 处即为修改端口的地方,默认不修改也行)
    重启ssh服务
    sudo /etc/init.d/ssh stop
    sudo /etc/init.d/ssh start
    或者
    sudo /etc/init.d/ssh restart

  • js 随机密码生成器

    <!DOCTYPE html>
    <html lang="en">
        <style>
            *{
                margin: 0;
                padding: 0;
            }
        </style>
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>随机密码</title>
    </head>
    <script>
        function changeV() {
            var range = document.getElementById("range");
            document.getElementById("temValue").innerHTML = range.value;
        }
    
        function copyHandle() {
            let content = document.getElementById("passWord").value;
            let copy = (e) => {
                e.preventDefault()
                e.clipboardData.setData('text/plain', content)
                alert('复制成功')
                document.removeEventListener('copy', copy)
            }
            document.addEventListener('copy', copy)
            document.execCommand("Copy");
        }
    
        function randomStr() {
            let upperLetterIs = document.getElementById("upperLetter").checked;
            let lowerLetterIs = document.getElementById("lowerLetter").checked;
            let digitIs = document.getElementById("digit").checked;
            let specialStrIs = document.getElementById("specialStr").checked;
            let length = document.getElementById("range").value;
            if (upperLetterIs == true) {
                //定义随机数的取值字符数组
                var str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
            }
            if (lowerLetterIs == true) {
                var str = 'abcdefghijklmnopqrstuvwxyz';
            }
            if (digitIs == true) {
                var str = '0123456789';
            }
            if (upperLetterIs == true && lowerLetterIs == true) {
                var str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
            }
            if (upperLetterIs == true && digitIs == true) {
                var str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
            }
            if (lowerLetterIs == true && digitIs == true) {
                var str = 'abcdefghijklmnopqrstuvwxyz0123456789';
            }
            if (upperLetterIs == true && lowerLetterIs == true && digitIs == true) {
                var str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
            }
            //定义返回值
            let result = '';
            //遍历
            for (let i = 0; i < length; i++) {
                // 取随机下标
                let index = Math.floor(Math.random() * str.length);
                //拼接在result后面
                result += str[index];
            }
            //返回
            return result;
    
        }
    </script>
    
    <body>
        <div class="main">
            <h1>随机密码生成器</h1>
            <input type="text" id="passWord">
            <button onclick='document.getElementById("passWord").value = randomStr();'>生成</button>
            <button onclick="copyHandle()">复制</button>
            <br>
            密码长度:
            <span id="temValue">8</span>
            <input id="range" type="range" min="0" max="20" value="8" step="1" onchange="changeV()">
            <br>
            所用字符:
            <input type="checkbox" id="upperLetter">ABC
            <input type="checkbox" id="lowerLetter" checked>abc
            <input type="checkbox" id="digit" checked>123
            <input type="checkbox" id="specialStr">#$&
        </div>
    </body>
    <script>
        // 文本框初始化赋值
        document.getElementById("passWord").value = randomStr();
    
    
        // 获取复选框的引用  
        const checkboxes = document.querySelectorAll('input[type="checkbox"]');
    
        // 监听每个复选框的变化事件  
        checkboxes.forEach(checkbox => {
            checkbox.addEventListener('change', handleCheckboxChange);
        });
    
        // 处理复选框变化事件的函数  
        function handleCheckboxChange() {
            // 在这里执行所需的代码  
            document.getElementById("passWord").value = randomStr();
            console.log('One or more checkboxes have changed.');
        }
    </script>
    <style>
        .main {
            text-align: center;
        }
        .main > * {  
          margin: 10px 0; /* 设置上下外边距为 10px,左右外边距为 0 */  
        }
        h1{
            padding-top: 2em;
        } 
    </style>
    
    </html>

     

  • js markdown渲染成网页

    <!DOCTYPE html>
    <html lang="en">
    <script src="/markdown_to_html/cdn.jsdelivr.net_npm_marked_marked.min.js"></script>
    <script src="./prism.js"></script>
    <link rel="stylesheet" href="./prism.css">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>markdown转html</title>
    </head>
    
    <body>
        <div id="container"></div>
        <script>
            fetch('./Conqueror-sBlade/活动副本【叛军强袭】.md')
                .then(response => response.text())
                .then(data => {
                    // 在这里处理Markdown文件内容
                    const html = marked.parse(data);
                    const container = document.getElementById('container');
                    container.innerHTML = html;
                    Prism.highlightAll()
                });
        </script>
    </body>
    </html>

    做了一个本地使用的markdown应用,希望离网的情况下能够预览markdown文件,我的md文档都是直接使用typora拖拽进来的,用的相对路径,使用js prism渲染markdown后图片无法显示,其中的图片链接换成http或者https的方法才能够显示出来。

  • js 监听所有复选框一旦有变化将执行某段代码

    如果您希望在任意一个或多个复选框发生变化时执行某段代码,您可以将事件监听器添加到每个复选框上,并在事件处理函数中执行所需的代码。以下是一个示例:

    <!DOCTYPE html>  
    <html>  
    <head>  
      <title>监控复选框变化</title>  
    </head>  
    <body>  
      <input type="checkbox" id="checkbox1">  
      <input type="checkbox" id="checkbox2">  
      <input type="checkbox" id="checkbox3">  
      
      <script>  
        // 获取复选框的引用  
        const checkboxes = document.querySelectorAll('input[type="checkbox"]');  
      
        // 监听每个复选框的变化事件  
        checkboxes.forEach(checkbox => {  
          checkbox.addEventListener('change', handleCheckboxChange);  
        });  
      
        // 处理复选框变化事件的函数  
        function handleCheckboxChange() {  
          // 在这里执行所需的代码  
          console.log('One or more checkboxes have changed.');  
        }  
      </script>  
    </body>  
    </html>

    在上面的示例中,我们使用document.querySelectorAll获取了页面上所有复选框的引用,并将事件监听器添加到每个复选框上。当任意一个复选框发生变化时,handleCheckboxChange函数都将被调用,然后您可以在该函数中执行所需的代码。

  • 获取当前网络已连接的WIFI密码-来自utools插件

    const cp = require('child_process')
    let wifiPass
    if (utools.isWindows()) {
      let stdoutBuffer = cp.execFileSync('netsh', ['wlan', 'show', 'interface'])
      let stdoutText = new TextDecoder('gbk').decode(stdoutBuffer)
      let ret = /^\s*SSID\s*: (.+)\s*$/gm.exec(stdoutText)
      if (!ret) throw new Error('未找到网络已连接的 WiFi 名称')
      const args = ['wlan', 'show', 'profile', `name=${ret[1]}`, 'key=clear']
      stdoutBuffer = cp.execFileSync('netsh', args)
      stdoutText = new TextDecoder('gbk').decode(stdoutBuffer)
      ret = /^\s*(?:Key Content|关键内容)\s*: (.+)\s*$/gm.exec(stdoutText)
      if (!ret) throw new Error('未能获取 WiFi 密码')
      wifiPass = ret[1]
    } else if (utools.isMacOS()) {
      let stdoutText = cp.execFileSync('/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport', ['-I']).toString()
    	if (stdoutText.includes('AirPort: Off')) throw new Error('WiFi 已关闭')
    	let ret = /^\s*SSID: (.+)\s*$/gm.exec(stdoutText)
      if (!ret) throw new Error('未找到网络已连接的 WiFi 名称')
    	const args = ['find-generic-password', '-D', 'AirPort network password', '-wa', ret[1]]
      wifiPass = cp.execFileSync('security', args).toString().trim()
    }
    utools.copyText(wifiPass)
    print('WiFi 密码已复制')
    return 'WiFi 密码:' + wifiPass
    

     

  • html-cookie

    a.html

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
    </head>
    
    <body>
      <input id="userName" type="text" />
      <input id="passwords" type="password" />
      <button id="btn">设置</button>
      <button onclick="login()">传递cookie</button>
      <button onclick="deletecookie()">删除</button>
    
    </body>
    <script>
      //设置cookie
      var setCookie = function (name, value, day) {
        //当设置的时间等于0时,不设置expires属性,cookie在浏览器关闭后删除
        var expires = day * 24 * 60 * 60 * 1000;
        var exp = new Date();
        exp.setTime(exp.getTime() + expires);
        document.cookie = name + "=" + value + ";expires=" + exp.toUTCString();
      };
      //删除cookie
      var delCookie = function (name) {
        setCookie(name, ' ', -1);
      };
      //传递cookie
      function login() {
        var name = document.getElementById("userName");
        var pass = document.getElementById("passwords");
        setCookie('userName', name.value, 7)
        setCookie('password', pass.value, 7);
        location.href = 'b.html'
      }
      function deletecookie() {
        delCookie('userName', ' ', -1)
      }
    </script>
    
    </html>

    b.html

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
    </head>
    
    <body>
      <button onclick="getcookie()">获取</button>
    </body>
    <script>
      //获取cookie代码
      var getCookie = function (name) {
        var arr;
        var reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
        if (arr = document.cookie.match(reg)) {
          return arr[2];
        }
        else
          return null;
      };
      //点击获取按钮之后调用的函数
      function getcookie() {
        console.log(getCookie("userName"));
        console.log(getCookie("password"))
      }
    </script>
    
    </html>

     

  • html懒加载-lazyload-html

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
    </head>
    
    <body>
      <div>
        <img id="img" src="./img/loading.gif" img-src="./img/img1.jpg" alt="">
        <img id="img" src="./img/loading.gif" img-src="./img/img2.jpg" alt="">
        <img id="img" src="./img/loading.gif" img-src="./img/1.jpg" alt="">
        <img id="img" src="./img/loading.gif" img-src="./img/2.jpg" alt="">
        <img id="img" src="./img/loading.gif" img-src="./img/3.jpg" alt="">
      </div>
    </body>
    
    <script>
      function lazyLoad() {
        // 1、 获取 页面 可视区域高度
        var h = window.innerHeight;
        // 2、 获取 滚动 高度
        var y = window.scrollY;
        // 3、获取所有图片
        // var imgs=document.querySelectorAll("img");
        var imgs = document.querySelectorAll("img");
        for (let i = 0; i < imgs.length; i++) {
          if (h + y > imgs[i].offsetTop) {
            // console.log("图片"+i+"进入可视区域了")
            setTimeout(function () {
              imgs[i].src = imgs[i].getAttribute("img-src");
            }, 2000)
          }
        }
      }
      lazyLoad();
      window.onscroll = function () {
        lazyLoad();
      }
    </script>
    
    </html>

  • python tkinter 导入菜单模块

    在 Python 中,使用 Tkinter 库创建 GUI 应用程序时,可以使用 Menu 类来创建菜单。Menu 类提供了一些方法和属性,可以用于创建菜单和菜单项,并将它们添加到应用程序中。

    以下是一个简单的示例,演示如何在 Tkinter 应用程序中创建菜单:

    import tkinter as tk  
      
    def do_something():  
        print("Menu item clicked!")  
      
    # 创建主窗口  
    root = tk.Tk()  
      
    # 创建菜单  
    menu = tk.Menu(root)  
    root.config(menu=menu)  
      
    # 创建菜单项  
    file_menu = tk.Menu(menu)  
    menu.add_cascade(label="File", menu=file_menu)  
    file_menu.add_command(label="Open", command=do_something)  
    file_menu.add_command(label="Save", command=do_something)  
    file_menu.add_separator()  
    file_menu.add_command(label="Exit", command=root.quit)  
      
    # 创建另一个菜单项  
    edit_menu = tk.Menu(menu)  
    menu.add_cascade(label="Edit", menu=edit_menu)  
    edit_menu.add_command(label="Cut", command=do_something)  
    edit_menu.add_command(label="Copy", command=do_something)  
    edit_menu.add_command(label="Paste", command=do_something)  
      
    # 运行应用程序  
    root.mainloop()

    在这个示例中,我们首先创建了一个主窗口 root。然后,我们创建了一个 Menu 对象,并将其添加到主窗口中。接下来,我们创建了两个子菜单 file_menu 和 edit_menu,并将它们添加到主菜单中。最后,我们将一些菜单项添加到子菜单中,并将它们与一些回调函数关联起来。在运行应用程序时,用户可以单击菜单项来触发相应的回调函数。

  • python tkinter点击一个按钮,新增一个界面

    在 Tkinter 中,你可以使用 Toplevel 窗口来创建新的界面。以下是一个简单的例子,当你点击按钮时,会打开一个新的窗口:

    import tkinter as tk  
      
    def new_window():  
        new_window = tk.Toplevel(root)  
        new_window.title("新窗口")  
        label = tk.Label(new_window, text="这是一个新窗口")  
        label.pack()  
      
    root = tk.Tk()  
    button = tk.Button(root, text="打开新窗口", command=new_window)  
    button.pack()  
      
    root.mainloop()

    在这个例子中,new_window 函数会创建一个新的 Toplevel 窗口,并在其中添加一个标签。当用户点击按钮时,new_window 函数会被调用,打开新的窗口。