【Python】实现一个类似于Thief的摸鱼软件

news2025/1/9 2:12:50

一 背景说明

        之前用Thief摸鱼(Thief官网),觉得挺好用。对于其最基本的TXT摸鱼,准备在Python中扩展一下功能,使其能够通过爬虫,支持爬取热门小说网站的内容。

        软件已经开源到:MoFish软件开源地址

        功能是,可以悄咪咪地看本地的txt电子书或者爬取有效电子书网站(例如:纵横中文网)的电子书资源,提供设置界面以便修改配置文件。

二 设计实现

        工具包含以下几个模块类:

        【1】配置参数类:支持对配置Json文件进行读写;

        【2】界面操作类:支持绑定键盘/鼠标按键进行上下翻页、老板键等功能;

        【3】最小化托盘类:支持程序最小化到系统托盘,实现快捷操作、配置以及退出;

三 配置参数类

        配置参数类 cfgJsonRW 可以在初始化的时候读取配置文件信息,并提供单独修改当前页数的方法 cfgJsonWritePage 和修改所有参数的方法 cfgJsonWriteAll 。代码如下:

import json

class cfgJsonRW(object):
    def __init__(self):
        with open("cfg.json") as json_file:
            cfg = json.load(json_file)

        self.file_name = cfg["file_name"]       # 文件名
        self.coding_mode = cfg["coding_mode"]   # 编码格式
        self.char_num = cfg["char_num"]         # 每页字数
        self.is_prog = cfg["is_prog"]           # 是否显示进度
        self.web_num = cfg["web_num"]           # 一次性读取网页自动加载的章节(不宜太多,会卡死)

        self.key_boss = cfg["key_boss"]         # 老板键
        self.key_up = cfg["key_up"]             # 上翻键
        self.key_down = cfg["key_down"]         # 下翻键

        self.label_width = cfg["label_width"]   # 文本框宽度
        self.font_color = cfg["font_color"]     # 文本颜色
        self.font_size = cfg["font_size"]       # 文本大小

        self.page_now = cfg["page_now"]         # 记录当前页并写json,方便下一次进程序时直接跳转

        #打印配置信息
        cfg_info1 = "【1 文件读取】\n文件名:%s\n编码方式:%s\n每页字数:%d\n是否显示进度:%d\n一次性读取章节数:%d\n" % (str(self.file_name), self.coding_mode, self.char_num, self.is_prog, self.web_num)
        cfg_info2 = "【2 按键设置】\n老板键:%s\n上翻键:%s\n下翻键:%s\n" % (str(self.key_boss), str(self.key_up), str(self.key_down))
        cfg_info3 = "【3 文本样式】\n文本框宽度:%d\n文本颜色:%s\n文本大小:%d\n" % (self.label_width, self.font_color, self.font_size)
        cfg_info4 = "【4 其他配置】\n当前页:%d\n" % self.page_now
        self.cfg_info = "----【配置信息】----\n" + cfg_info1 + cfg_info2 + cfg_info3 + cfg_info4
        print(self.cfg_info)

    def cfgJsonWritePage(self, now_page):
        self.page_now = now_page
        with open("cfg.json") as json_file:
            cfg = json.load(json_file)
            cfg["page_now"] = self.page_now
        with open("cfg.json", "w") as json_file:
            json.dump(cfg, json_file)

    def cfgJsonWriteAll(self, para):
        str = {}
        str["file_name"] = para["file_name"].get()
        str["coding_mode"] = para["coding_mode"].get()
        str["char_num"] = para["char_num"].get()
        str["is_prog"] = para["is_prog"].get()
        str["web_num"] = para["web_num"].get()
        str["key_boss"] = para["key_boss"].get()
        str["key_up"] = para["key_up"].get()
        str["key_down"] = para["key_down"].get()
        str["label_width"] = para["label_width"].get()
        str["font_color"] = para["font_color"].get()
        str["font_size"] = para["font_size"].get()
        str["page_now"] = para["page_now"].get()
        with open("cfg.json") as json_file:
            cfg = json.load(json_file)
            if len(str["file_name"]) != 0:
                cfg["file_name"] = str["file_name"]
            if len(str["coding_mode"]) != 0:
                cfg["coding_mode"] = str["coding_mode"]
            if len(str["char_num"]) != 0:
                cfg["char_num"] = int(str["char_num"])
            if len(str["is_prog"]) != 0:
                cfg["is_prog"] = int(str["is_prog"])
            if len(str["web_num"]) != 0:
                cfg["web_num"] = int(str["web_num"])
            if len(str["key_boss"]) != 0:
                cfg["key_boss"] = str["key_boss"]
            if len(str["key_up"]) != 0:
                cfg["key_up"] = str["key_up"]
            if len(str["key_down"]) != 0:
                cfg["key_down"] = str["key_down"]
            if len(str["label_width"]) != 0:
                cfg["label_width"] = int(str["label_width"])
            if len(str["font_color"]) != 0:
                cfg["font_color"] = str["font_color"]
            if len(str["font_size"]) != 0:
                cfg["font_size"] = int(str["font_size"])
            if len(str["page_now"]) != 0:
                cfg["page_now"] = int(str["page_now"])
        with open("cfg.json", "w") as json_file:
            json.dump(cfg, json_file)

        配置文件 cfg.json 结构如下:

{"file_name": "test.txt", "coding_mode": "utf8", "char_num": 200, "is_prog": 1, "web_num": 20, "key_boss": "<F7>", "key_up": "<Up>", "key_down": "<Down>", "label_width": 900, "font_color": "black", "font_size": 9, "page_now": 63}

四 界面操作类

        界面操作类 winExec 支持在初始化的时候绑定鼠标和键盘,鼠标拖动界面、鼠标双击退出、老板键、上下翻页键等操作均在此类中完成。代码如下:

class winExec(object):
    def __init__(self, win_main, win_cfg, win_content, all_page):
        self.root = win_main
        self.cfg = win_cfg
        self.con = win_content
        self.root.bind("<Button-1>", self.mouseDown)  # 按下鼠标左键绑定MouseDown函数
        self.root.bind("<B1-Motion>", self.mouseMove)  # 鼠标左键按住拖曳事件,3个函数都不要忘记函数写参数
        self.root.bind("<Double-Button-1>", self.commExit)  # 双击鼠标左键,关闭窗体
        self.root.bind("<Escape>", self.commExit)  # 退出
        self.root.bind(self.cfg.key_boss, self.keyBoss)  #按下键盘隐藏窗口
        self.root.bind(self.cfg.key_up, self.keyUp)  #向上翻页
        self.root.bind(self.cfg.key_down, self.keyDown)  #向下翻页
        self.boss_flag = 0
        self.now_page = self.cfg.page_now
        self.all_page = all_page

    def mouseDown(self, event):  #鼠标按下
        self.mousX, self.mousY = event.x, event.y  # 获取鼠标相对于窗体左上角的X/Y坐标

    def mouseMove(self, event):  #鼠标移动
        self.root.geometry(f'+{event.x_root - self.mousX}+{event.y_root - self.mousY}')  # 窗体移动代码(event.x_root/event.y_root为窗体相对于屏幕左上角的X/Y)

    def commExit(self, event):  #通用退出(双击或者Esc)
        self.root.destroy()

    def keyBoss(self, event):  #老板键
        if self.boss_flag == 0:
            self.root.attributes("-alpha", 0)
            self.boss_flag = 1
        else:
            self.root.attributes("-alpha", 1)
            self.boss_flag = 0

    def keyUp(self, event):  #向上翻页
        self.now_page = self.now_page - 1
        if self.cfg.is_prog == 0:
            info.set(self.con[self.now_page * self.cfg.char_num : (self.now_page + 1) * self.cfg.char_num])
        else:
            info.set(self.con[self.now_page * self.cfg.char_num : (self.now_page + 1) * self.cfg.char_num] + " (%d/%d)" % (self.now_page, self.all_page))
        self.cfg.cfgJsonWritePage(self.now_page)  #当前页写json文件存储

    def keyDown(self, event):  #向下翻页
        self.now_page = self.now_page + 1
        if self.cfg.is_prog == 0:
            info.set(self.con[self.now_page * self.cfg.char_num : (self.now_page + 1) * self.cfg.char_num])
        else:
            info.set(self.con[self.now_page * self.cfg.char_num : (self.now_page + 1) * self.cfg.char_num] + " (%d/%d)" % (self.now_page, self.all_page))
        self.cfg.cfgJsonWritePage(self.now_page)  #当前页写json文件存储

五 最小化托盘界面类

        最小化托盘类 sysTray 支持程序最小化托盘,通过托盘图标,实现快捷操作(老板键、上下翻页)、配置(通过GUI界面与Json文件进行交互)以及退出。代码如下:

import threading
import pystray  # 最小化到托盘
from PIL import Image # 导入 PIL 库中的 Image 模块
import tkinter  # 绘制操作界面
from tkinter import messagebox
from tkinter.filedialog import askopenfilename

class sysTray(object):
    def __init__(self, win_main, win_cfg, win_exec):  #主界面/配置类/操作类
        self.root = win_main
        self.cfg = win_cfg
        self.exec = win_exec
        self.tray = {}

    def createSysTray(self):  # 使用 Pystray 创建系统托盘图标
        menu = (
            pystray.MenuItem('老板键', self.trayKeyBoss),
            pystray.MenuItem('上一页', self.trayKeyUp),
            pystray.MenuItem('下一页', self.trayKeyDown),
            pystray.Menu.SEPARATOR,  # 在系统托盘菜单中添加分隔线
            pystray.MenuItem('配置', self.trayConfig),
            pystray.Menu.SEPARATOR,  # 在系统托盘菜单中添加分隔线
            pystray.MenuItem('退出', self.trayExit)
        )
        image = Image.open("mofish.ico")
        self.icon = pystray.Icon("name", image, "mofish", menu)
        threading.Thread(target=self.icon.run, daemon=True).start()

    def trayKeyBoss(self):
        self.exec.keyBoss(self.cfg.key_boss)

    def trayKeyUp(self):
        self.exec.keyUp(self.cfg.key_up)

    def trayKeyDown(self):
        self.exec.keyDown(self.cfg.key_down)

    def trayExit(self, icon: pystray.Icon):
        icon.stop()             # 停止 Pystray 的事件循环
        self.root.destroy()     # 销毁应用程序的主窗口和所有活动

    def trayConfig(self):
        self.winTray = tkinter.Toplevel(self.root)
        self.winTray.title('配置信息')
        frame1 = tkinter.Frame(self.winTray)
        frame1.pack()
        frame2 = tkinter.Frame(self.winTray)
        frame2.pack()
        frame3 = tkinter.Frame(self.winTray)
        frame3.pack()
        frame4 = tkinter.Frame(self.winTray)
        frame4.pack()

        l1 = tkinter.Label(frame1, text='文件名', fg='blue').grid(row=0, column=0)
        self.tray["file_name"] = tkinter.StringVar()
        e1 = tkinter.Entry(frame1, width=40, textvariable=self.tray["file_name"]).grid(row=0, column=1)
        b1 = tkinter.Button(frame1, text="路径",fg='white', bg='dodgerblue', command=self.selectPath).grid(row=0, column=2)
        l2 = tkinter.Label(frame1, text='编码格式', fg='blue').grid(row=0, column=3)
        self.tray["coding_mode"] = tkinter.StringVar()
        e2 = tkinter.Entry(frame1, width=5, textvariable=self.tray["coding_mode"]).grid(row=0, column=4)

        l3 = tkinter.Label(frame2, text='当前页数', fg='blue').grid(row=0, column=0)
        self.tray["page_now"] = tkinter.StringVar()
        e3 = tkinter.Entry(frame2, textvariable=self.tray["page_now"]).grid(row=0, column=1)
        l4 = tkinter.Label(frame2, text='每页字数', fg='blue').grid(row=0, column=2)
        self.tray["char_num"] = tkinter.StringVar()
        e4 = tkinter.Entry(frame2, textvariable=self.tray["char_num"]).grid(row=0, column=3)
        l5 = tkinter.Label(frame2, text='显示进度', fg='blue').grid(row=1, column=0)
        self.tray["is_prog"] = tkinter.StringVar()
        e5 = tkinter.Entry(frame2, textvariable=self.tray["is_prog"]).grid(row=1, column=1)
        l6 = tkinter.Label(frame2, text='加载网页', fg='blue').grid(row=1, column=2)
        self.tray["web_num"] = tkinter.StringVar()
        e6 = tkinter.Entry(frame2, textvariable=self.tray["web_num"]).grid(row=1, column=3)

        l7 = tkinter.Label(frame3, text='老板键', fg='blue').grid(row=0, column=0)
        self.tray["key_boss"] = tkinter.StringVar()
        e7 = tkinter.Entry(frame3, textvariable=self.tray["key_boss"]).grid(row=0, column=1)
        l8 = tkinter.Label(frame3, text='上翻键', fg='blue').grid(row=1, column=0)
        self.tray["key_up"] = tkinter.StringVar()
        e8 = tkinter.Entry(frame3, textvariable=self.tray["key_up"]).grid(row=1, column=1)
        l9 = tkinter.Label(frame3, text='下翻键', fg='blue').grid(row=2, column=0)
        self.tray["key_down"] = tkinter.StringVar()
        e9 = tkinter.Entry(frame3, textvariable=self.tray["key_down"]).grid(row=2, column=1)
        l10 = tkinter.Label(frame3, text='文本宽度', fg='blue').grid(row=0, column=2)
        self.tray["label_width"] = tkinter.StringVar()
        e10 = tkinter.Entry(frame3, textvariable=self.tray["label_width"]).grid(row=0, column=3)
        l11 = tkinter.Label(frame3, text='字体颜色', fg='blue').grid(row=1, column=2)
        self.tray["font_color"] = tkinter.StringVar()
        e11 = tkinter.Entry(frame3, textvariable=self.tray["font_color"]).grid(row=1, column=3)
        l12 = tkinter.Label(frame3, text='字体大小', fg='blue').grid(row=2, column=2)
        self.tray["font_size"] = tkinter.StringVar()
        e12 = tkinter.Entry(frame3, textvariable=self.tray["font_size"]).grid(row=2, column=3)

        b2 = tkinter.Button(frame4, text="保存",fg='white', bg='dodgerblue', width=15, command=lambda:self.saveCfg(self.tray))
        b2.pack()

        self.loadCfg()

    def selectPath(self):  #路径选择
        self.tray["file_name"].set(askopenfilename())

    def loadCfg(self):  #加载配置
        self.tray["file_name"].set(self.cfg.file_name)     # 文件名
        self.tray["coding_mode"].set(self.cfg.coding_mode) # 编码格式
        self.tray["page_now"].set(self.cfg.page_now)  # 当前页数
        self.tray["char_num"].set(self.cfg.char_num)  # 每页字数
        self.tray["is_prog"].set(self.cfg.is_prog)  # 是否显示进度
        self.tray["web_num"].set(self.cfg.web_num)  # 自动加载网页数
        self.tray["key_boss"].set(self.cfg.key_boss)  # 老板键
        self.tray["key_up"].set(self.cfg.key_up)  # 上翻键
        self.tray["key_down"].set(self.cfg.key_down)  # 下翻键
        self.tray["label_width"].set(self.cfg.label_width)  # 文本宽度
        self.tray["font_color"].set(self.cfg.font_color)  # 字体颜色
        self.tray["font_size"].set(self.cfg.font_size)  # 字体大小

    def saveCfg(self, para):  #保存配置
        self.cfg.cfgJsonWriteAll(para)
        if tkinter.messagebox.askokcancel('提示', '配置保存成功,重启才能生效!\n是否需要重启?'):
            self.trayExit(self.icon)

        最小化托盘以及配置界面效果如下:

六 主程序

        主程序里创建主界面,并配合上面的几个模块,实现隐蔽看本地TXT功能(如果路径中包含“http”关键字,则认为是网页,自动爬取网页内容并显示)。代码如下:

import tkinter  # 绘制操作界面
import requests
from bs4 import BeautifulSoup
from config import cfgJsonRW
from tray import sysTray

win = tkinter.Tk()
win_cfg = cfgJsonRW()
if "http" in win_cfg.file_name:
    win_content, all_page = readWeb(win_cfg.file_name, win_cfg.char_num, win_cfg.web_num)  # 读取网页(输入参数:文件名/每页字数/一次性加载网页章节数)
else:
    win_content, all_page = readFile(win_cfg.file_name, win_cfg.coding_mode, win_cfg.char_num)  # 读取文件(输入参数:文件名/编码方式/每页字数)
win_exec = winExec(win, win_cfg, win_content, all_page)

win.overrideredirect(True)  # 实现隐藏了整个标题栏的窗口
win.attributes("-transparentcolor", 'snow')  #将snow颜色设置为透明色,可以替换不同的颜色
win.attributes("-topmost", True)  # 将窗口保持最前
info = tkinter.StringVar()
info.set("Welcome to MoFish !\n" + win_cfg.cfg_info)
text = tkinter.Label(win, anchor="nw", justify='left', bg='snow', wraplength=win_cfg.label_width, fg=win_cfg.font_color, font=("", win_cfg.font_size), textvariable=info).pack()  #把已经变成透明色的snow色设置为背景

sysTray(win, win_cfg, win_exec).createSysTray() # 创建最小化托盘对象

win.mainloop()

        实际使用效果如下:

 

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

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

相关文章

ReID专栏(一) 任务与数据集概述

前言 本专栏针对Closed-world的ReID任务&#xff0c;首先介绍本任务的目标与主要数据集&#xff0c;包括行人重识别、跨模态行人重识别与车辆重识别。然后从三类表征学习的角度解读相关论文&#xff0c;表征学习是本任务的核心&#xff0c;大量重识别工作都致力于提高表征学习的…

uboot源码结构、配置、编译

目录 1.uboot源码结构 1.1uboot源码获取 1.2 uboot的特点 1.3 uboot源码结构 2、uboot配置与编译 2.1uboot配置 2.2 uboot编译 1.uboot源码结构 1.1uboot源码获取 uboot是一个开源的软件。开源有两层含义。一是可以免费用、二是开放源代码 uboot源码下载 http://www.denx…

记一次线上MQ堆积问题处理

背景 线上订单服务10个POD节点&#xff0c;某kafka tpoic原有6个分区。 问题现象 上午11.30左右一波下单高峰&#xff0c;根据分布式消息告警发现有少量消息堆积&#xff0c;但是堆积量不大&#xff0c;持续几分钟后恢复正常。 下午1点后出现新一轮高峰&#xff0c;出现了大…

window环境安装kafka

一、配置系统环境变量 JAVA_HOME 二、配置安装zookeeper 1、下载安装包 https://zookeeper.apache.org/releases.html#download 2、 解压并进入ZooKeeper目录&#xff0c;如&#xff1a;D:\kafka\zookeeper\conf, 将“zoo_sample.cfg”重命名为“zoo.cfg”, 3、打开“zoo.c…

机器学习集成学习——GBDT(Gradient Boosting Decision Tree 梯度提升决策树)算法

系列文章目录 机器学习神经网络——Adaboost分离器算法 机器学习之SVM分类器介绍——核函数、SVM分类器的使用 机器学习的一些常见算法介绍【线性回归&#xff0c;岭回归&#xff0c;套索回归&#xff0c;弹性网络】 文章目录 系列文章目录 前言 一、GBDT(Gradient Boos…

PHP学习笔记第三天

前言 作者简介&#xff1a;不知名白帽&#xff0c;网络安全学习者。 博客主页&#xff1a;不知名白帽的博客_CSDN博客-网络安全,CTF,内网渗透领域博主 网络安全交流社区&#xff1a;https://bbs.csdn.net/forums/angluoanquan 目录 PHP if..else PHP switch PHP数组 PHP数…

【AI 孙燕姿 || AI 音色转换】RVC 使用图文教程:教你如何实现无难度男女换声(伪音)以及 AI 孙燕姿!

最近&#xff0c;视频网站音乐区up主掀了“AI孙燕姿”的风潮。这种使用AI技术提取某位歌手的音色&#xff0c;再用其替换另一位歌手音色的方式&#xff0c;可以实现接近歌手本人翻唱的逼真效果。除孙燕姿外&#xff0c;面对周杰伦、陶喆、陈奕迅、王菲等众多具有独特嗓音的歌手…

YOLOv3: An Incremental Improvement 全文翻译

YOLOv3 论文全篇完整翻译 摘要 本文介绍了YOLO的一些更新内容&#xff01;我们进行了一系列小的设计改进&#xff0c;以使其更好。我们还训练了一个相当不错的新网络。它比上一版稍微大一些&#xff0c;但更加准确。不过不用担心&#xff0c;它依然保持了快速性能。在320320像…

C++数据结构:图结构入门

C数据结构 线性顺序表&#xff08;数组&#xff09; 线性顺序表&#xff08;链表&#xff09; Python风格双向链表的实现 散列表简单实现&#xff08;hash表&#xff09; 栈和队列的应用 二叉树之一&#xff08;数组存储&#xff09; 二叉树之二&#xff08;二叉搜索树&#x…

驱动开发:内核PE结构VA与FOA转换

本章将继续探索内核中解析PE文件的相关内容&#xff0c;PE文件中FOA与VA,RVA之间的转换也是很重要的&#xff0c;所谓的FOA是文件中的地址&#xff0c;VA则是内存装入后的虚拟地址&#xff0c;RVA是内存基址与当前地址的相对偏移&#xff0c;本章还是需要用到《驱动开发&#x…

第二十篇、基于Arduino uno,获取MFRC-522 RFID射频IC卡模块的信息,并进行识别——结果导向

0、结果 说明&#xff1a;先来看看串口调试助手显示的结果&#xff0c;"卡号"对应的是IC卡的卡号&#xff0c;"1号已进入"表示识别到正确的卡&#xff0c;也就是之前录入的卡号&#xff0c;因此可以应用到门禁。如果是你想要的&#xff0c;可以接着往下看…

OLED和LCD对比

OLED和LCD对比 今天等离子已不复存在&#xff0c;OLED 出现了新的竞争者。在本概述中&#xff0c;我们将了解这两种技术之间的差异、优缺点等。 我们将从简短介绍每种显示技术的工作原理开始。我们将使用术语“面板”&#xff0c;因为显示技术是功能性电视屏幕的一个组成部分…

(字符串 ) 151. 反转字符串中的单词 ——【Leetcode每日一题】

❓151. 反转字符串中的单词 难度&#xff1a;中等 给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。 注意&…

面向对象编程 实验三 sduwh 子窗口与控件的基本用法、资源的使用 参考实验报告1

源自网络收集&#xff0c;仅供参考 实验三收集到两份完整报告&#xff0c;这是其一&#xff0c;另一份见本专栏下一篇文章。 实验题目 《面向对象程序设计》 实验三 实验题目&#xff1a;子窗口与控件的基本用法、资源的使用 整体目的&#xff1a;理解、窗口之间的消息传送…

DAY08_JavaScrip

目录 1 JavaScript1.1 JavaScript简介1.2 JavaScript引入方式1.2.1 内联脚本1.2.2 内部脚本1.2.3 外部脚本 1.3 JavaScript基础语法1.3.1 书写语法1.3.2 输出语句1.3.3 变量1.3.4 数据类型1.3.5 运算符1.3.5.1 \和区别1.3.5.2 类型转换 1.3.6 流程控制语句1.3.6.1 if 语句1.3.6…

常见设计模式

单例模式 单例对象的类必须保证只有一个实例存在&#xff0c;整个系统只能使用一个对象实例&#xff0c;优点&#xff1a;不会频繁地创建和销毁对象&#xff0c;浪费系统资源。缺点是没有抽象层&#xff0c;难以扩展。 单例模式的常见写法&#xff1a; 饿汉式单例模式的写法&…

免安装版MySQL数据库的安装和卸载

说明&#xff1a;MySQL早些版本有分安装版和免安装版&#xff0c;可在官网&#xff08;https://dev.mysql.com/downloads/mysql/&#xff09;下载&#xff0c;推荐使用最新版本&#xff0c;是免安装版的&#xff0c;下载完配置一下就可以用。 推荐使用最新版本 安装 我这里以…

第3章“程序的机器级表示”:过程

文章目录 3.7 过程3.7.1 栈帧3.7.2 转移控制3.7.3 寄存器使用惯例3.7.4 过程示例3.7.5 递归过程 3.7 过程 一个过程调用包括将数据&#xff08;以过程参数和返回值的形式&#xff09;和控制从代码的一部分传递到另一部分。另外&#xff0c;它还必须在进入时为过程的局部变量分…

金融人不能错过的中国人民大学与加拿大女王大学金融硕士,你不能不知道

金融行业是一个发展飞速的行业&#xff0c;越来越多的优秀人士的涌入&#xff0c;让本就卷起来的金融行业变得异常拥挤&#xff0c;怎么办&#xff0c;想留有一席之地只能不断的提升与攀登&#xff0c;金融人不能错过的中国人民大学与加拿大女王大学金融硕士&#xff0c;你不能…

架构EA演进

架构演进 目录概述需求&#xff1a; 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,challenge Survive. happy for hardess to solve den…