首页 > 其他分享 >tkinter搭建GUI软件框架并创建不同的Frame界面实现不同的功能

tkinter搭建GUI软件框架并创建不同的Frame界面实现不同的功能

时间:2024-09-07 21:22:18浏览次数:15  
标签:20 tkinter GUI self init 楷体 input Frame

引言

       在本篇博客中,小编要带大家解决的问题是如何创建一个软件窗口对象,并在窗口顶部菜单中通过按钮实现不同Frame界面的切换,在不同的Frame页面中实现访问路径等不同的功能,其中每行代码代表的意思,小编也在相应代码后面进行了注释,此外,代码在排版上也非常规范,各位小可爱能够非常容易理解各行代码的含义,对于刚入门的小可爱们非常友好。

        本篇博客的目的是带各位小可爱一起搭建一个软件的框架,各位小可爱可以基于自己的需求,在框架中填充相应的功能,实现自己编写软件的目标。具体的代码,各位小可爱可以在文末看到,当然啦,本篇博客只是一个模板,小编仅创建了3个Frame页面,各位小可爱可以根据自己的需求搭建自己的软件框架,在搭建其他Frame页面的过程中,只需要Copy文末中各个页面的代码就可以实现了,相信本篇博客能够帮助大家少走弯路,让我们一起来学习吧!

       搭建本软件框架用到的第三方库包括tkinter和PIL,在搭建软件框架前,各位小可爱别忘了先安装第三方库哟,具体安装方法见:检查python是否安装成功及第三方库安装-CSDN博客

 软件界面

     该软件的首页及各界面如下图所示。

      软件打开后,默认是在首页,如图1所示,可以点击不同的菜单按钮,实现其他两个页面的切换。

图1 首页

    点击MODEL菜单,切换至MODEL页面下,如图2所示,在改页面,小编为大家编写的代码可以实现访问文件夹的路径并在中间的Entry框中返回该路径,点击A'就可以实现该功能,点击完后如图3所示。

图2 MODEL页面

图3 实现路径访问

点击IDENTIFICATION菜单,切换至IDENTIFICATION页面下,如图所示

在讲解过程中,小编也会将小编在软件开发工程中遇到的问题与大家分享,帮助大家在软件开发过程中避坑。话不多数,接下来,一起学习吧。

代码

import tkinter as tk
from tkinter import *
import tkinter.ttk
from PIL import Image,ImageTk
from tkinter.filedialog import askdirectory

class App(object):
    def __init__(self):
        self.root=Tk()
        self.root.title("GUI窗口")
        self.root.state("zoomed")#设置窗口全屏显示
        self.width = self.root.winfo_screenwidth()#获取电脑屏幕的横向分辨率
        self.height = self.root.winfo_screenheight()#获取电脑屏幕的纵向分辨率

        #定义GUI窗口中不同菜单下的Frame界面
        self.input_win0=self.Home_page_init()
        self.input_win1 = self.Model_init()
        self.input_win2=self.Identification_init()

        self.input_win0.place(x=0,y=116)#设置打开软件默认显示的Frame

        self.mode_switch_init()#设置菜单栏默认显示

    """创建首页界面"""
    def Home_page_init(self):
        Frame_input = Frame(self.root, bg='rosybrown', highlightbackground='antiquewhite', highlightthickness=3)#self.root后为该Frame页面的属性设置
        label = Label(Frame_input, text="软件首页", font=("楷体", 20), fg="green", padx=8, pady=4, relief=RIDGE,borderwidth=8)
        label.grid(row=0, column=0, padx=885, pady=410)#padx, pady用于设置label与上下、左右的填充像素,如果想把自己的首页填充完成,像本例中的首页一样,可以先查看一下自己电脑的分辨率再进行设置
        return Frame_input

    """ 创建A页面并实现相应的功能"""
    def Model_init(self):
        Frame_input_Model_init = tk.Frame(self.root, bg='tan', highlightbackground='antiquewhite', highlightthickness=3)
        # 此处用于设置entry框的变量类型
        self.path_model_image=tk.StringVar()
        self.path_model_label=tk.StringVar()
        self.path_model_model=tk.StringVar()
        self.learn_rate = tk.DoubleVar()

        label=Label(Frame_input_Model_init,text="A",font=("楷体", 20), fg="green", padx=8, pady=4, relief=RIDGE,borderwidth=8)
        label.grid(row=0,column=0,padx=100,pady=20)
        entry = Entry(Frame_input_Model_init, textvariable=self.path_model_image, cursor="arrow", bd=10, font=("楷体", 20),fg="green")#textvariable用于在Entry中显示选择的路径
        entry.grid(row=0, column=1, padx=100, ipadx=384)
        button1 = Button(Frame_input_Model_init, command=self.ModelImagePath,text="A'", cursor="arrow", bd=10, font=("楷体", 20),fg="green")#command命令用于访问电脑中的文件夹
        button1.grid(row=0, column=2)

        label = Label(Frame_input_Model_init, text="B", font=("楷体", 20), fg="green", padx=8, pady=4, relief=RIDGE,borderwidth=8)
        label.grid(row=1, column=0, padx=100, pady=20)
        entry = Entry(Frame_input_Model_init, textvariable=self.path_model_label, cursor="arrow", bd=10, font=("楷体", 20),fg="green")
        entry.grid(row=1, column=1, padx=100, ipadx=384)
        button2 = Button(Frame_input_Model_init, text="B", cursor="arrow", bd=10, font=("楷体", 20),fg="green")
        button2.grid(row=1, column=2)

        label = Label(Frame_input_Model_init, text="C:",  font=("楷体", 20), fg="green", padx=8, pady=4, relief=RIDGE,borderwidth=8)
        label.grid(row=2, column=0, padx=130, pady=20)
        entry = Entry(Frame_input_Model_init, textvariable=self.path_model_model,  cursor="arrow", bd=10, font=("楷体", 20),fg="green")
        entry.grid(row=2, column=1, padx=130, ipadx=384)
        button3 = Button(Frame_input_Model_init, text="C", cursor="arrow", bd=10,font=("楷体", 20), fg="green")
        button3.grid(row=2, column=2, padx=100)

        label = Label(Frame_input_Model_init, text="D:", font=("楷体", 20), fg="green", padx=8, pady=4, relief=RIDGE,borderwidth=8)
        label.grid(row=3, column=0, pady=20)
        entry = Entry(Frame_input_Model_init, textvariable=self.learn_rate, cursor="arrow", bd=10, font=("楷体", 20), fg="green")
        entry.grid(row=3, column=1, ipadx=384)

        button4=Button(Frame_input_Model_init, text="运行",  font=("楷体", 20), fg="green", padx=8, pady=4, relief=RIDGE,borderwidth=8)
        button4.grid(row=4, column=1, pady=229)
        return Frame_input_Model_init

    def ModelImagePath(self):
        path_ = askdirectory()  # 使用askdirectory()方法返回文件夹的路径
        if path_ == "":
            self.path_model_image.get()  # 当打开文件路径选择框后点击“quxiao"输入框会清空路径,所以使用get()方法再获取一次路径
        else:
            path_ = path_.replace("/", "\\")  # 实际在代码中执行的路径为"\",所以替换一下
            self.path_model_image.set(path_)
            # print(path_)
        return path_

    """创建对象识别页面并实现相应的功能"""
    def Identification_init(self):
        Frame_input_Identification_init=tk.Frame(self.root,bg='tan',highlightbackground='antiquewhite',highlightthickness=3)

        self.path_identification_image = tk.StringVar()
        self.path_identification_result = tk.StringVar()
        self.path_identification_model = tk.StringVar()

        label=Label(Frame_input_Identification_init, text="输入************", font=("楷体",20), fg="green",padx=8,pady=4,relief=RIDGE,borderwidth=8)
        label.grid(row=0, column=0, padx=50,pady=20)
        entry=Entry(Frame_input_Identification_init,textvariable=self.path_identification_image,cursor="arrow", bd=10, font=("楷体",20), fg="green")
        entry.grid(row=0,column=1,padx=50,ipadx=384)
        button=Button(Frame_input_Identification_init, text="选择***********路径",  cursor="arrow", bd=10,font=("楷体",20),fg="green")
        button.grid(row=0, column=2)

        label=Label(Frame_input_Identification_init, text="输出**************", font=("楷体",20), fg="green",padx=8,pady=4,relief=RIDGE,borderwidth=8)
        label.grid(row=1, column=0,padx=50, pady=20)
        entry=Entry(Frame_input_Identification_init, textvariable=self.path_identification_result,cursor="arrow", bd=10, font=("楷体",20), fg="green")
        entry.grid(row=1,column=1,padx=50,ipadx=384)
        button=Button(Frame_input_Identification_init, text="选择******路径", cursor="arrow", bd=10, font=("楷体",20),fg="green")
        button.grid(row=1, column=2)

        label=Label(Frame_input_Identification_init, text="输出********", font=("楷体",20), fg="green",padx=8,pady=4,relief=RIDGE,borderwidth=8)
        label.grid(row=2, column=0,padx=50, pady=20)
        entry=Entry(Frame_input_Identification_init, textvariable=self.path_identification_model,cursor="arrow", bd=10, font=("楷体",20), fg="green")
        entry.grid(row=2,column=1,padx=50,ipadx=384)
        button=Button(Frame_input_Identification_init, text="************路径",  cursor="arrow", bd=10,font=("楷体",20),fg="green")
        button.grid(row=2, column=2,padx=50)

        button=Button(Frame_input_Identification_init, text="运行",  cursor="arrow", bd=10, font=("楷体",20),fg="green")#可通过在Button中添加命令实现相应的功能
        button.grid(row=3, column=1, pady=276)
        return Frame_input_Identification_init

    #实现不同功能页面的切换,button中的command命令控制实际的切换过程
    def mode_switch_init(self):
        Frame_mode_switch=tk.Frame(self.root,width=self.width,height=self.height)
        tk.Button(Frame_mode_switch, text="HOME_PAGE", width=70, height=5, command=self.switch_to_home_page,bg="midnightblue", fg="#FFFFFF", font=("Arial", 13), relief=RIDGE, borderwidth=4).grid(row=0,column=0)#width,height用于设置菜单的宽度和高度
        tk.Button(Frame_mode_switch, text="MODEL", width=70,height=5, command=self.switch_to_model, bg="midnightblue",fg="#FFFFFF", font=("Arial", 13),relief=RIDGE,borderwidth=4).grid(row=0, column=2)
        tk.Button(Frame_mode_switch,text="IDENTIFICATION",width=69,height=5,command=self.switch_to_identification,bg="midnightblue",fg="#FFFFFF",font=("Arial",13),relief=RIDGE,borderwidth=4).grid(row=0,column=4)
        Frame_mode_switch.place(x=0,y=3)

    #切换到首页界面
    def switch_to_home_page(self):
        self.input_win0.destroy()
        self.input_win1.destroy()
        self.input_win2.destroy()

        self.input_win = self.Home_page_init()  # 输入界面初始化
        self.input_win.place(x=0, y=116)

    #切换到切割要识别遥感影像的界面
    def switch_to_model(self):
        self.input_win0.destroy()
        self.input_win1.destroy()
        self.input_win2.destroy()

        self.input_win = self.Model_init()  # 输入界面初始化
        self.input_win.place(x=0, y=116)

    # 控制切换到对象识别页面
    def switch_to_identification(self):
        self.input_win0.destroy()
        self.input_win1.destroy()
        self.input_win2.destroy()

        self.input_win = self.Identification_init()  # 输入界面初始化
        self.input_win.place(x=0,y=116)

#运行类
if __name__=="__main__":
    Program=App()
    Program.root.mainloop()

标签:20,tkinter,GUI,self,init,楷体,input,Frame
From: https://blog.csdn.net/qq_43464006/article/details/141889444

相关文章

  • 【Unity必备插件】NGUI:UI设计传奇工具
    ......
  • Jquery中获取iframe的代码(window.top.parent)
    父窗口中操作iframe:window.frames["iframeChild"].document//假如iframe的id为iframeChild在子窗口中操作父窗口:window.parent.document那么,用如果想用jquery的方法,我们怎么用jquery来获取iframe呢?下面是一下收集来的方法。获取页面的对象其实就是dom方法外面加上jq......
  • 什么是iframe?他的优缺点以及应用场景有哪些
    iframe简介iframe,全称为“InlineFrame”,是HTML中的一个元素,用于在当前页面中嵌入另一个页面或文档的视图。简单来说,它像是一个窗口或框架,可以在一个网页中嵌入另一个网页。iframe的优点1.内容重用:通过iframe,你可以在多个页面中重用相同的内容,提高网页的复用性。2.页面分......
  • 【每日一练】tkinter输入文本框实例
    """代码思路1.先创建一个文本框2.定义一个函数执行文本的获取和另一个文本框的赋值3.创建按钮,并调用函数4.创建另一个文本框"""importtkinterastkroot=tk.Tk()root.title("复制输入框")root.geometry("400x300+800+200")#创建一个输入文本框,显示为*的属性设......
  • <Rust>egui学习之小部件(九):如何在窗口中添加下拉列表combobox部件?
    前言本专栏是关于Rust的GUI库egui的部件讲解及应用实例分析,主要讲解egui的源代码、部件属性、如何应用。环境配置系统:windows平台:visualstudiocode语言:rust库:egui、eframe概述本文是本专栏的第九篇博文,主要讲述下拉列表部件combobox的使用。事实上,类似于iced,egui......
  • 《Represent, Compare, and Learn: A Similarity-Aware Framework for Class-Agnostic
    摘要论文提出了一个用于类别无关计数(Class-AgnosticCounting,CAC)的相似性感知框架。类别无关计数的目标是在给定少量示例的情况下,对查询图像中的所有实例进行计数。该框架通过联合学习表示和相似性度量来改进计数性能。作者首先提出了一个基础的双线性匹配网络(BilinearMatc......
  • [python][selenium] Web UI自动化页面切换iframe框架
    关联文章:WebUI自动化8种页面元素定位方式1、切换iframe的方法:switch_to.frame  方法的入参有4种:  1.1、id  1.2、name  1.3、index索引  1.4、iframe元素对象2、返回主文档(最外层的页面)的方法:switch_to.default_content()3、返回到上一级iframe的方法:switch_to.p......
  • 【论文阅读】AugSteal: Advancing Model Steal With Data Augmentation in Active Lea
    摘要Withtheproliferationof(随着)machinelearningmodels(机器学习模型)indiverseapplications,theissueofmodelsecurity(模型的安全问题)hasincreasinglybecomeafocalpoint(日益成为人们关注的焦点).Modelstealattacks(模型窃取攻击)cancausesignificant......
  • Procrastination: A Scientific Guide on How to Stop Procrastinating
    Procrastinationisachallengewehaveallfacedatonepointoranother.Foraslongashumanshavebeenaround,wehavebeenstrugglingwithdelaying,avoiding,andprocrastinatingonissuesthatmattertous.Duringourmoreproductivemoments,whenwe......
  • C#的ugui与XLua整合的案例
    网上的案例大部分是官方的案例,个人的案例还是比较少的。我这个案例比较通俗易懂unity需要的控件有两个:一个是button和input  C#代码如下:usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;usingXLua;usingUnityEngine.UI;usingSystem;publ......