10天速通Tkinter库——Day7:主菜单及图鉴

news2024/12/23 6:16:40

本篇博客我将介绍Tkinter实践项目《植物杂交实验室》中的杂交实验室主菜单、基础植物图鉴、杂交植物图鉴、杂交植物更多信息四个页面的制作。

它们作为主窗口的子页面实例,除了继承主窗口的基础设置(如图标、标题、尺寸等等)、还可以使用主窗口的属性和方法(如数据变量self.hybridizationPlants、页面跳转方法switch_to_screen等等),以及在constants.py中的常量定义和tool.py中定义的通用组件。具体实现见博客10天速通Tkinter库——Day6:项目整体框架介绍

目录

1. 杂交实验室主界面

2. 基础植物图鉴

3. 杂交植物图鉴和更多信息界面

3.1 杂交植物图鉴

3.2 更多信息页面

4. 总结


1. 杂交实验室主界面

bcc94b0d241346318e654c0902732942.png

这个界面非常简单:背景图片 + 五个按钮 + 一个框

8cd2c64220fb4e74af59fb3c73a257b0.png

首先创建一个名为BreedingScreen的类,这个类继承自Tkinter的Frame类,并且使用create_background加载一张背景图片。

class BreedingScreen(tk.Frame):
    """杂交实验室主菜单界面"""
    def __init__(self, parent):
        super().__init__(parent)
        self.breeding_background = create_background(self,breedingScreen_path)

 然后是五个按钮,直接使用create_button生成,并且定义点击事件函数,就是调用root.switch_to_screen方法:

        # 基础植物图鉴按钮
        self.base_catalog_button = create_button(self,
                                                 dark_image_path=plantCatalogButton1_path,
                                                 light_image_path=plantCatalogButton2_path,
                                                 width=360,
                                                 height=180,
                                                 locate_x=81,
                                                 locate_y=104,
                                                 command=self.on_base_catalog_button_click)
        # 杂交植物图鉴按钮
        self.hybrid_catalog_button = create_button(self,
                                                 dark_image_path=hybridCatalogButton1_path,
                                                 light_image_path=hybridCatalogButton2_path,
                                                 width=360,
                                                 height=180,
                                                 locate_x=460,
                                                 locate_y=104,
                                                 command=self.on_hybrid_catalog_button_click)
        # 杂交实验室按钮
        self.experiment_button = create_button(self,
                                                 dark_image_path=experimentButton1_path,
                                                 light_image_path=experimentButton2_path,
                                                 width=360,
                                                 height=180,
                                                 locate_x=81,
                                                 locate_y=293,
                                                 command=self.on_experiment_button_click)
        # 杂交历记录按钮
        self.record_button = create_button(self,
                                                 dark_image_path=historyButton1_path,
                                                 light_image_path=historyButton2_path,
                                                 width=360,
                                                 height=180,
                                                 locate_x=450,
                                                 locate_y=293,
                                                 command=self.on_record_button_click)
        # 杂交建议显示器
        self.advice_text()
        # 关闭界面
        self.close_button = close_button(self,close1_1_path,close1_2_path)
        self.pack()

    def on_base_catalog_button_click(self):
        # 点击基础植物图鉴按钮的事件处理
        self.master.switch_to_screen('plant_catalog_screen')

    def on_hybrid_catalog_button_click(self):
        # 点击杂交植物图鉴按钮的事件处理
        self.master.children['hybrid_catalog_screen'].card_button_matrix(page=0)
        self.master.switch_to_screen('hybrid_catalog_screen')
        
    def on_experiment_button_click(self):
        # 点击杂交实验按钮的事件处理
        self.master.switch_to_screen('experiment_screen')
        
    def on_record_button_click(self):
        # 点击杂交记录按钮的事件处理
        self.master.children['record_screen'].all_record(page=0)
        self.master.switch_to_screen('record_screen')

最后需要单独实现的是循环建议框,这个框的构成有一点点复杂。因为我没有发现任何一种组件可以单独实现“背景+文字+无边框”,也可能我略有一点强迫症。于是我选择使用label加载背景,使用button显示文字,尽可能组合起来不违和。

    def advice_text(self):
        image = Image.open(advice_background_path)
        # 将图片转换为Tkinter可以使用的格式
        image = image.resize((663, 89), Image.Resampling.LANCZOS)
        photo = ImageTk.PhotoImage(image)

        background_label = tk.Label(self, image=photo,bd=0)
        background_label.place(x=106,y=470)
        self.photo = photo

        suggestions = ["你可以尝试不同的杂交方式", 
                       "也许使用不同类型的植物效果会更好!", 
                       "当亲本植物超过四种,会发生糟糕的事!", 
                       "如果没有想法,就去看看历史记录吧!", 
                       "你需要避免完全相反的属性,比如冰与火"]
        random_index = random.randint(0, len(suggestions)-1)
        suggestion = suggestions[random_index]
        button = tk.Button(self,text=suggestion,font=("Times New Roman", 19, "bold"),
                           fg="gold",
                           width=39,height=1,
                           bd=0,background="saddlebrown",
                           command=None,
                           activebackground="saddlebrown"
                           )
        button.place(x=145,y=492)
        self.after(60000,self.advice_text)
  1. suggestions列表包含了五条建议文本。
  2. random.randint(0, len(suggestions)-1):生成一个随机数,作为suggestions列表的索引。
  3. suggestion = suggestions[random_index]:根据随机索引选择一条建议。
  4. 创建一个Tkinter的Button组件,用于显示建议文本。这里设置了按钮的字体、颜色、大小、背景色等属性。
  5. button.place(x=145,y=492):将按钮放置在窗口的指定位置。
  6. self.after(60000, self.advice_text):设置一个定时器,60000毫秒(即一分钟)后再次调用advice_text方法。

2. 基础植物图鉴

0d597889ff4e4419816980c48fc471f1.gif

 这个界面看似内容很少,但是,按钮矩阵的实现还是稍微带点难度。

181d88c06b5d4087b103b456d1400080.png

 创建一个名为PlantCatalogScreen的类,这个类继承自Tkinter的Frame类。

class PlantCatalogScreen(tk.Frame):
    """基础植物图鉴
    1. 卡片矩阵
    2. 植物说明
    """
    def __init__(self, parent):
        super().__init__(parent)
        self.breeding_background = create_background(self,basalcatalog_background_path)
        self.close_button = close_button(self,close2_1_path,close2_2_path,clear=94)
        self.back_button = back_button(self,back2_1_path,back2_2_path,clear=94)
        self.empty_describe = empty_describe(self)

类的初始化:

  1. create_background:加载一张背景图片。
  2. close_button:创建了一个关闭按钮。
  3. back_button:创建了一个返回按钮。
  4. empty_describe:创建了一个空白描述区域,用于在没有具体植物信息时显示。
    def card_button_matrix(self):
        """创建基础植物卡片矩阵"""
        card_frame = tk.Frame(self)
        card_frame.place(x=28,y=88)
        for row in range(6):
            for col in range(8):
                def on_click(row, col):
                    card_music.play()
                    """卡片点击事件, 展示植物说明"""
                    label = tk.Label(self, image=self.master.basal_plant_describe[row][col], bd=0)
                    label.place(x=530, y=94)                
                button = tk.Button(card_frame, image=self.master.basal_plant_card[row][col])
                button.config(borderwidth=0,highlightthickness=0)
                button.grid(row=row, column=col,sticky="NSEW")
                button.bind('<Button-1>', lambda event, r=row, c=col: on_click(r, c))
  1. card_button_matrix 方法:这个方法用于创建植物卡片矩阵。

    • card_frame:创建了一个新框架用于放置卡片按钮。

    • 使用 grid 布局管理器来放置卡片按钮,每行有8个按钮,共6行。

    • 对于每个卡片按钮,定义了一个点击事件处理器 on_click。当卡片被点击时:

      • 播放音效(card_music.play())。
      • 显示植物的详细说明。这通过创建一个新的标签(tk.Label)并设置其图像(self.master.basal_plant_describe[row][col])来实现。
  2. 卡片按钮的创建:每个卡片按钮都是一个 tk.Button 实例,它使用了原始卡片图片,并设置了边框宽度和高亮厚度为0,以使按钮看起来更简洁。

    • 每个按钮都绑定了一个点击事件处理器 on_click,处理器接收行和列作为参数,并在按钮被点击时调用。
  3. 卡片和描述的图片是主界面初始化时加载的,使用self.master.basal_plant_describe和self.master.basal_plant_card进行调用。

3. 杂交植物图鉴和更多信息界面

05d59a22a1d9438fa919cbf21428aa8b.gif

3.1 杂交植物图鉴

这个界面复杂的点在于:

  1. 杂交植物数据是动态的
  2. 上下页需要切换

c2502b8f80c34709b1691de820aaa176.png

先来看看杂交植物json数据:

    {
        "id": 1,
        "parent_base_plant_ids": [ 1, 2 ],
        "hybridization_method": 1,
        "new_hybrid": false
    }

 字段分别是植物id,亲本植物id列表,获得的杂交方法,以及是否为新植物。而图鉴界面只加载new_hybrid值为false的植物,亲本植物id列表和杂交方法会传给更多信息页面。

class HybridCatalogScreen(tk.Frame):
    """基础植物图鉴

    1. 卡片矩阵(翻页功能, 包含两个页面)
    2. 植物说明
    3. 更多信息
    """
    def __init__(self, parent):
        super().__init__(parent)
        self.breeding_background = create_background(self,hybridCatalog_background_path)
        self.close_button = close_button(self,close2_1_path,close2_2_path,clear=82)
        self.back_button = back_button(self,back2_1_path,back2_2_path,clear=82)        
        self.empty_describe = empty_describe(self,Y=82)

 同样的,创建一个杂交植物图鉴类,包括对父类的tk.Frame的继承、加载一张背景图片,一个关闭按钮、一个返回按钮以及一张空白描述图片。

        self.ahead_buttton = create_button(self,
                                           dark_image_path=ahead1_1_path,
                                           light_image_path=ahead1_2_path,
                                           width=110,
                                           height=27,
                                           locate_x=265,
                                           locate_y=566,
                                           command=self.on_ahead_button_click)
        self.next_buttton = create_button(self,
                                           dark_image_path=next1_1_path,
                                           light_image_path=next1_2_path,
                                           width=110,
                                           height=27,
                                           locate_x=377,
                                           locate_y=566,
                                           command=self.on_next_button_click)

这是上一页和下一页按钮的创建,点击事件定义如下:

    def on_ahead_button_click(self):
        """上一页按钮点击事件"""
        if self.page==1:
            self.page_change = True
            self.page=0
            self.card_button_matrix(page=self.page)
            self.empty_describe = empty_describe(self,Y=82)
            self.pack()
        self.page_change = False

    def on_next_button_click(self):
        """下一页按钮点击事件"""
        if self.page==0 and self.plants_num>48:
            self.page_change = True
            self.page=1
            self.card_button_matrix(page=self.page)
            self.empty_describe = empty_describe(self,Y=82)
            self.pack()
        self.page_change = False

on_ahead_button_click 方法

  • 功能: 当用户点击“上一页”按钮时,此方法被调用。它检查当前页面是否为第一页(self.page==1),如果是,则更新页面状态和执行以下操作:
    • 设置 page_change 标记为 True,用于后续方法或逻辑中,以识别页面是否已改变。
    • 将页面设置为第0页(self.page=0),这意味着回到卡片矩阵的第一页。
    • 调用 card_button_matrix 方法,参数为当前页面和初始化标志(page=self.page, init=1),用于重新生成或更新卡片矩阵的布局。
    • 更新空描述区域(self.empty_describe = empty_describe(self,Y=82)),用于显示或更新页面空闲区域的内容。
    • 调用 pack 方法,重新布局并显示界面元素。

on_next_button_click 方法

  • 功能: 当用户点击“下一页”按钮时,此方法被调用。它检查当前页面是否为最后一页(self.page==0)且总植物数量大于48(超过一页),如果是,则更新页面状态和执行以下操作:
    • 设置 page_change 标记为 True
    • 将页面设置为第1页(self.page=1),这意味着显示卡片矩阵的第二页。
    • 同样,调用 card_button_matrix 方法,参数为当前页面和初始化标志(page=self.page, init=1)。
    • 更新空描述区域(self.empty_describe = empty_describe(self,Y=82))。
    • 调用 pack 方法,重新布局并显示界面元素。
        self.init_card_photo = [[None for _ in range(8)] for _ in range(6)] # 卡片矩阵背景
        self.old_hybrid_plant = [[0 for _ in range(8)] for _ in range(12)]  # 杂交前可展示植物id
        self.new_hybrid_plant = [[0 for _ in range(8)] for _ in range(12)]  # 杂交后可展示植物id

        # 卡片矩阵初始化
        self.plants_num = 0
        self.page = 0
        self.page_change = False
        self.card_frame = tk.Frame(self,bd=0)
        self.card_frame.place(x=28,y=89)
        self.init_card_matrix()
        self.card_button_matrix(page=0,init=1)

        # 记录植物亲本及杂交方法信息
        self.method = 0
        self.basal_plant_ids = [0,0,0,0]
        self.pack()
  1.  self.init_card_photo:这个属性用于初始化矩阵按钮背景,因为定义矩阵Frame时,有时按钮会有空缺,于是乎就使用对应位置的背景填充
  2. self.old_hybrid_plant和self.new_hybrid_plant都用于记录需要显示的植物ID。因为由于杂交实验会更新杂交植物数据,因此用来判断哪些位置更新了,只改变更新位置,减少页面刷新时的多于操作。
  3. self.plants_num记录解锁的杂交植物数量
  4. self.page用来记录页号,有0,1两页
  5. self.page_change判断页面是否切换,True和False两个值

接着是加载初始按钮矩阵背景和按钮矩阵的实现

    def init_card_matrix(self):
        """加载卡片矩阵空白背景"""
        for row in range(6):
            for col in range(8):
                self.init_card_photo[row][col]= image_load(57,78,init_card_path,col+1+row*8,".jpg")  

    def data_load(self,hybridizationplants):
        """加载展示杂交植物卡片"""
        self.plants_num=0; row = 0; col = 0
        for plant in hybridizationplants:
            if plant.get('new_hybrid')==False: 
                self.plants_num += 1
                self.new_hybrid_plant[row][col] = plant.get("id")         
                col += 1
                if col==8:
                    row += 1
                    col = 0
  1. init_card_matrix函数加载48张按钮背景图片
  2. data_load用于获取最新的杂交植物信息
    def card_button_matrix(self,page=0,init=0):
        """创建杂交植物卡片矩阵
        
        1. 保存上一次卡片数据
        2. 加载最新卡片数据
        3. 只改变更新部分的按钮图片
        4. 使用self.page加载不同页面的数据
        """
        if init==0: 
            for row in range(12):
                for col in range(8):
                    self.old_hybrid_plant[row][col] = self.new_hybrid_plant[row][col]
        self.data_load(self.master.hybridizationPlants)
        for row in range(6):
            for col in range(8):
                if self.new_hybrid_plant[row+page*6][col]!=self.old_hybrid_plant[row+page*6][col] or \
                    (self.page_change==True and self.new_hybrid_plant[row+page*6][col]!=0): 
                    card_photo = id_to_photo(self.new_hybrid_plant[row+page*6][col],self.master.hybrid_plant_card)
                    button = tk.Button(self.card_frame, image=card_photo)
                    button.config(borderwidth=0,highlightthickness=0)
                    button.grid(row=row, column=col,sticky="NSEW")
                    def on_click(row, col):
                        card_music.play()
                        describe_photo = id_to_photo(self.new_hybrid_plant[row+page*6][col],self.master.hybrid_plant_describe)
                        label = tk.Label(self, image=describe_photo, bd=0)
                        label.place(x=530, y=82)
                        id = self.new_hybrid_plant[row+page*6][col]
                        self.basal_plant_ids = self.master.hybridizationPlants[id-1].get("parent_base_plant_ids")
                        self.method = self.master.hybridizationPlants[id-1].get("hybridization_method")
                    button.bind('<Button-1>', lambda event, r=row, c=col: on_click(r, c))
                elif self.new_hybrid_plant[row+page*6][col]==0 :
                    label = tk.Label(self.card_frame,image=self.init_card_photo[row][col],bd=0)
                    label.grid(row=row, column=col,sticky="NSEW")

card_button_matrix用于创建卡片按钮矩阵,对其进行详解

  • 这个方法接受两个参数:page 和 initpage 用于指定加载哪个页面的数据,init 用于指定是否是初始化操作,初始化只有主界面初始化时用到一次。
  • 如果 init 参数为0,表示不是初始化操作,则将 self.new_hybrid_plant 的数据保存到 self.old_hybrid_plant 中,以便后续比较。
  • 调用 self.data_load 方法来加载最新的杂交植物数据。
  • 创建按钮和布局:
    • 遍历卡片矩阵的每一行和每一列。
    • 如果 self.new_hybrid_plant 中的数据与 self.old_hybrid_plant 不同,或者页面有变化且卡片不为空,则创建一个新的按钮。
    • 使用 id_to_photo 函数将植物ID转换为对应的图片,并设置按钮的图片。
    • 配置按钮无边框和边框厚度。
    • 使用 grid 方法将按钮放置在卡片框架中,并设置粘性(sticky)属性。
  • 绑定点击事件:
    • 定义了一个 on_click 函数,当按钮被点击时触发。
    • 播放音效card_music.play()
    • 获取描述图片并显示。
    • 获取植物ID,并更新亲本植物ID列表和杂交方法。
    • 将 on_click 函数绑定到按钮的鼠标左键点击事件。
  • 显示空白卡片:
    • 如果 self.new_hybrid_plant 中对应的单元格为0,表示没有植物数据,则显示一个初始卡片图片。

这个函数应该是本项目中最难的一个,重构了好几次,最终还挺满意。

        self.more_button = create_button(self,
                                         dark_image_path=morebutton1_path,
                                         light_image_path=morebutton2_path,
                                         width=138,
                                         height=40,
                                         locate_x=603,
                                         locate_y=542,
                                         command=self.on_more_button_click)     

 最后就是这个更多信息按钮,以及点击事件处理函数。


    def on_more_button_click(self):
        """查看更多信息按钮点击事件"""
        if self.method!=0 and self.basal_plant_ids[0]!=0:
            self.master.children['more_information_screen'].information_show(self.method,self.basal_plant_ids)
            self.master.switch_to_screen('more_information_screen') 
        self.method=0
        self.basal_plant_ids = [0,0,0,0]     
  • 这段代码首先检查 self.method 和 self.basal_plant_ids 是否有有效的值。self.method 应该是杂交方法的信息,而 self.basal_plant_ids 是一个包含亲本植物ID的列表。
  • 如果这两个值都不为0(即有效),则调用 self.master.children['more_information_screen'].information_show(self.method,self.basal_plant_ids) 方法来展示更多信息,并将界面切换到 more_information_screen
  • self.master 指的是创建这个 MoreInformation 实例的窗口的主窗口实例。self.master.children 是一个字典,其中包含了主窗口中所有子窗口的引用。
  • information_show 方法是 MoreInformation 类中的一个方法,用于展示杂交方法和亲本植物信息。
  • 重置变量:
    • 在检查和可能的屏幕切换之后,代码将 self.method 设置为0,并将 self.basal_plant_ids 重置为一个包含四个0的列表。
    • 这一步的目的是为了清除之前的信息,以便在用户再次点击“查看更多信息”按钮时,可以显示新的信息。

3.2 更多信息页面

这个页面很简单,组件如下:

baa6f855fb0644e4aaf86276828559cc.png

初始化和上述页面差不多,加载背景图片,创建返回按钮和空的描述信息图片,返回按钮的点击事件是返回杂交植物图鉴。

class MoreInformation(tk.Frame):
    """杂交植物更多信息界面,包括杂交方法和亲本植物说明"""
    def __init__(self, parent):
        super().__init__(parent)
        self.more_background = create_background(self,mor_background_path)
        self.back_button = create_button(self,
                                         dark_image_path=back1_1_path,
                                         light_image_path=back1_2_path,
                                         width=85,
                                         height=25,
                                         locate_x=24,
                                         locate_y=567,
                                         command=self.on_back_button_click)
        self.empty_information = self.empty_information_load()
        self.pack()

    def empty_information_load(self):
        """加载空的描述卡片"""
        image = Image.open(emptydescribe_path)
        image = image.resize((212, 308), Image.Resampling.LANCZOS)
        photo = ImageTk.PhotoImage(image)
        return photo  
    
    def on_back_button_click(self):
        # 返回杂交植物图鉴界面
        self.master.switch_to_screen('hybrid_catalog_screen')

唯一重点就是下面这个信息展示方法:

    def information_show(self,method,basal_plant_ids):
        """展示杂交方法"""
        self.method = image_load(560,120,more_method_path,method,".png")
        label = tk.Label(self,image=self.method,bd=0)
        label.place(x=160,y=82)

        """展示亲本植物信息"""
        self.basal_plant_describe = [None for _ in range(4)]
        self.card_frame = tk.Frame(self,bd=0)
        self.card_frame.place(x=15,y=202)
        for col in range(4):
            if col<len(basal_plant_ids) and basal_plant_ids[col]!=0:
                self.basal_plant_describe[col] = image_load(212,308,basal_describe_path,basal_plant_ids[col],'.png')
                label = tk.Label(self.card_frame,image=self.basal_plant_describe[col] ,bd=0)
                label.grid(row=0, column=col,sticky="NSEW")
            else:
                label = tk.Label(self.card_frame,image=self.empty_information,bd=0)
                label.grid(row=0, column=col,sticky="NSEW")  

第一部分:展示杂交方法

  1. 加载方法图片:使用image_load函数加载一个名为method的图片,图片的大小为560x120像素,图片路径为more_method_path,图片格式为.png。加载后的图片被存储在self.method变量中。
  2. 显示图片:创建一个tk.Label对象,将加载的图片显示在界面上。图片放置在坐标(160, 82)的位置。

第二部分:展示亲本植物信息

  1. 初始化亲本植物描述列表:创建一个长度为4的列表self.basal_plant_describe,用于存储每个亲本植物的描述图片。
  2. 创建卡片框架:在界面上创建一个tk.Frame,用于放置亲本植物的描述图片。这个框架位于坐标(15, 202)。
  3. 循环遍历亲本植物ID:通过一个循环遍历basal_plant_ids列表中的每个亲本植物ID。对于每个ID:
    1. 检查ID有效性:如果ID在列表中有效(即在列表的范围内且不为0),则加载对应的亲本植物描述图片。
    2. 加载图片:使用image_load函数加载一个名为basal_plant_ids[col]的图片,图片的大小为212x308像素,图片路径为basal_describe_path。加载后的图片被存储在self.basal_plant_describe[col]中。
    3. 显示图片:创建一个tk.Label对象,将加载的图片显示在卡片框架中。图片放置在网格布局的第0行和第col列上。
    4. 处理无效ID:如果ID无效,则加载一个名为self.empty_information的图片,表示没有可用的亲本植物信息。
  4. 网格布局管理:使用grid方法将图片放置在卡片框架中,sticky="NSEW"表示图片会填充其网格单元格的全部空间。

4. 总结

到这里,我们就实现了杂交实验室主界面、基础植物图鉴和杂交植物图鉴,以及更多信息页面。

简单的关闭和返回按钮我们可以直接使用tool.py中定义的方法,至于较难的卡片按钮矩阵,我们定义了Frame,然后双循环遍历杂交植物数据,创建按钮并绑定点击事件,并且对于杂交植物图鉴,还实现了上下页面跳转的功能,并且对页面更新也做了处理,消除了一开始的白屏卡顿。

下期预告:杂交实验、杂交历史记录页面的实现。

感谢大家支持!

 

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

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

相关文章

《黑神话:悟空》游戏中的福建元素

《黑神话&#xff1a;悟空》作为一款深受玩家喜爱的动作角色扮演游戏&#xff0c;不仅在游戏剧情和角色设计上独具匠心&#xff0c;还巧妙地融入了丰富的中国传统文化元素&#xff0c;其中福建元素尤为突出。以下是对游戏中福建元素的详细解析&#xff1a; 一、地域文化与背景…

《机器学习》—— 支持向量机(SVM)实现二分类问题

文章目录 一、什么是支持向量机&#xff08;SVM&#xff09;1、SVM两个基本概念2、SVM的原理 二、示例&#xff1a;支持向量机&#xff08;SVM&#xff09;实现二分类问题1、先选取两个特征&#xff0c;并进行可视化2、选取所有的特征传入模型&#xff0c;并对模型进行评估 一、…

回归预测|基于北方苍鹰优化核极限学习机的数据预测Matlab程序NGO-KELM 多特征输入单输出

回归预测|基于北方苍鹰优化核极限学习机的数据预测Matlab程序NGO-KELM 多特征输入单输出 文章目录 一、基本原理1. 基本原理核极限学习机&#xff08;KELM&#xff09; 2. NGO-KELM回归预测流程1. 数据预处理2. 核极限学习机&#xff08;KELM&#xff09;模型构建3. 北方苍鹰优…

【Tomcat+MySQL+Redis源码安装三件套】

TomcatMySQLRedis源码安装三件套 Tomcat部分概念Tomcat的作用Tomcat的原理Linux运维中的应用场景具体操作示例 基本使用流程实验Tomcat安装tomcat的反向代理及负载均衡源地址hash(不能负载)tomcat负载均衡实现&#xff08;使用cookie&#xff09; memcached 操作命令 理论补充结…

大数据系统测试——大数据系统解析(上)

各位好&#xff0c;我是 道普云 欢迎关注我的主页 希望这篇文章对想提高软件测试水平的你有所帮助。 在本文中我们一起来看一下大数据系统每一个层次需要解决的技术问题和对应的一些技术需求。以此来作为学习大数据系统测试的基础。 数据收集层主要是进行数据源的分布式、…

sqli-labs靶场通关攻略 31-35

主页有sqli-labs靶场通关攻略 1-30 第三一关 less-31 闭合方式为?id1&id1 ") -- 步骤一&#xff1a;查看数据库名 http://127.0.0.1/less-31/?id1&id-1%22)%20union%20select%201,database(),3%20-- 步骤二&#xff1a;查看表名 http://127.0.0.1/less-31/?…

Redis 实现哨兵模式

目录 1 哨兵模式介绍 1.1 什么是哨兵模式 1.2 sentinel中的三个定时任务 2 配置哨兵 2.1 实验环境 2.2 实现哨兵的三条参数&#xff1a; 2.3 修改配置文件 2.3.1 MASTER 2.3.2 SLAVE 2.4 将 sentinel 进行备份 2.5 开启哨兵模式 2.6 故障模拟 3 在整个架构中可能会出现的问题 …

【FastAPI】—— 01 创建FastAPI项目

1.FastAPI框架介绍 FastAPI是⼀个现代、快速&#xff08;⾼性能&#xff09;的Web框架&#xff0c;⽤于构建API。是建⽴在Starlette和Pydantic基础上的。它基于Python3.7的类型提示&#xff08;typehints&#xff09;和异步编程&#xff08;asyncio&#xff09;能⼒&#xff0c…

软件设计原则之开闭原则

开闭原则&#xff08;Open-Closed Principle, OCP&#xff09;是软件设计中的一个重要原则&#xff0c;由伯特兰梅耶&#xff08;Bertrand Meyer&#xff09;在1988年提出。该原则强调软件实体&#xff08;如类、模块、函数等&#xff09;应该对扩展开放&#xff0c;对修改关闭…

【机器学习】 7. 梯度下降法,随机梯度下降法SGD,Mini-batch SGD

梯度下降法,随机梯度下降法SGD,Mini-batch SGD 梯度下降法凸函数(convex)和非凸函数梯度更新方向选择步长的选择 随机梯度下降SGD(Stochastic Gradient Descent)梯度下降法&#xff1a;SGD: Mini-batch SGD 梯度下降法 从一个随机点开始决定下降方向&#xff08;重要&#xff…

关于kafka的分区和消费者之间的关系

消费者和消费者组 当生产者向 Topic 写入消息的速度超过了消费者&#xff08;consumer&#xff09;的处理速度&#xff0c;导致大量的消息在 Kafka 中淤积&#xff0c;此时需要对消费者进行横向伸缩&#xff0c;用多个消费者从同一个主题读取消息&#xff0c;对消息进行分流。 …

【JVM】OOM与调优(二)

OOM与调优 6.JVM工具如jps 该命令是纯Java编写的 -q:只显示Java进程的ID -m:输出Java进程的ID main函数所在类的名字 传递给main函数的参数 -l:输出Java进程的IDmain函数所在类的全限定名(包名类名) -v:输出Java进程的IDmain函数所在类的名称传递给JVM的参数 应用&am…

在野漏洞的应急响应流程

许多时候&#xff0c;对于负责安全工作又不太擅长安全漏洞技术的人员而言&#xff0c;如何应对突发漏洞是工作中主要的难点&#xff0c;这里的突发漏洞指的是两类&#xff1a;一类是通过新闻、咨询推送&#xff0c;被社会舆论所有关注的CVE漏洞&#xff0c;比如前段时间所谓的核…

【YOLOv10改进[Conv]】感受野注意力卷积RFAConv(2024.3)| 使用RFAConv 改进v10目标检测效果 + 含全部代码和详细修改方式

本文将进行在YOLOv10中使用RFAConv,助力YOLOv10目标检测效果,文中含全部代码、详细修改方式。助您轻松理解改进的方法。

手撕M.2 的B-KEY M-KEY、M+B KEY定义

SSD 尺寸与规格 我们在买ssd的时候&#xff0c;商家都会说什么ssd是2280还是2242规格的,这里的规格实际上就是代表的ssd的尺寸大小 M.2模组的尺寸目前有11种&#xff0c;用Type xxyy的方式表示&#xff0c;xx表示宽度&#xff0c;yy表示长度&#xff0c;单位为毫米。例如上面提…

(mcu) 嵌入式基础简单入门(程序架构分析)

文章目录 &#x1f4bd;前言&#x1f4bd;软件框架&#x1f4c0;工具环境&#x1f4c0;模板工程&#x1f4c0;编译后&#x1f4c0;Code&#x1f4c0;典例举例 &#x1f4bd;Keil 使用notes⭐END&#x1f31f;关注我 &#x1f4bd;前言 本文为一份简单入门笔记&#xff0c;以 st…

算法-单词规律(290)

leetcode题目链接 这道题用哈希表来解决 一个哈希表存放从单词到字符的映射&#xff0c;一个存放从字符到单词的映射&#xff0c;依照空格分隔字符&#xff0c;并将每个字符存放到vector字符数组&#xff0c; 遍历 pattern&#xff0c;对于每个字符 c 和对应的单词 w&#xf…

带你快速了解WEB应用服务器TOMCAT

目录 一、WEB技术 1.1 HTTP协议和B/S 结构 1.2 前端三大核心技术 1.2.1 HTML 1.2.2 CSS&#xff08;Cascading Style Sheets&#xff09;层叠样式表 1.2.3 JavaScript 二 WEB框架 2.1 web资源和访问 2.2 后台应用架构 2.2.1 单体架构 2.2.2 微服务 2.2.3 单体架构和…

机器学习 第6章 支持向量机

这里写目录标题 6.1 间隔与支持向量6.2 对偶问题6.3 核函数6.4 软间隔与正则化6.5 支持向量回归 6.1 间隔与支持向量 给定训练样本集 D { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m ) } , y i ∈ { − 1 , 1 } D\left \{ (x_{1},y_{1}),(x_{2},y_{2}) ,...,(x_{…

禹晶、肖创柏、廖庆敏《数字图像处理》Otsu方法描述勘误

最大化类间距离准则与最小错误率准则不等价。 虚线处为最大类间距离&#xff0c;前景与背景直方图的交界处为最小错分概率&#xff0c;当部分前景错分为背景或者部分背景错分为前景时&#xff0c;一般会导致类间距离变小。所以两者接近&#xff0c;但不相等。 禹晶、肖创柏、…