引言
在本篇博客中,小编要带大家解决的问题是如何创建一个软件窗口对象,并在窗口顶部菜单中通过按钮实现不同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