五笔打字通主页
我前面几篇文章介绍了,在一个模块下如何做到窗口的切换,在一个模块下做窗体切换,一般都是因为程序比较简单,代码少,如果程序繁杂,把代码都做在一个模块里,就算是查找相关的代码也不容易,对吧。
为了管理方便,稍复杂一点,都是把不同的窗体分别做一个模块,每个模块都取有意义的名义,这样来管理代码应该是方便的。
一般来说,一个模块对应一个窗体,或者对应一相同的几个窗体,也有的模块对应的,并不是窗体的代码,可能是一个操作代码,例如,操作数据库的相关代码写在一个模块里。
下面,我来用代码介绍一个如何用多模块写几个窗体的切换:
我设计有2个窗体:
登录窗体,主窗体
在这个主窗体下,通过菜单,可以再切换:人员管理,考勤管理,工资管理(这3个窗口,每次只能显示一个窗口)
通过菜单,还可以弹出‘关于’窗口
我的编程设计:
在同一个目录下,生成4个模块: 丶丌皛
main.py 这是起始窗体模块,是真正的一个窗体root
login.py 在类的形式编写登录的界面,再加载到起始窗体
home.py 以类的形式编写主窗体,菜单,及切换的代码
job.py 以类的形式写:人员管理,考勤管理,工资管理 界面,再加载到主窗体
起始窗体模块很简单,以下是 main.py 的代码
from tkinter import * from login import * # 导入登录模块 root=Tk() login(root) # 登录界面类的实例化 root.mainloop()
运行上面的起始代码,马上就会加载 登录界面,以下是登录界面的模块 login.py 的代码:
from tkinter import * from home import * from tkinter import messagebox class login(object): def __init__(self, master=None): self.root = master # 定义内部变量root self.root.geometry('300x150+888+444') self.root.title('登录窗口') self.creatlogin() def creatlogin(self): self.fr1=Frame(self.root) self.fr1.pack() self.en1=Entry(self.fr1) self.en1.pack(pady=10,fill=X) self.but1=Button(self.fr1,text="输入密码:wb98.com 进入主窗口吧",command=self.ok) self.but1.pack(pady=(0,10)) self.en1.focus_set() # 获得焦点 def ok(self): a=self.en1.get() if a=='wb98.com': self.fr1.destroy() # 登录界面卸载 home(self.root) # 密码对,就把主窗体模块的界面加载 else: messagebox.showwarning("警告:","密码错,正确的密码是:wb98.com")
看上面的代码,大家应该明白了,其实起始窗体,登录窗体,以及后面的主界面都是同一个窗体,区别只是标题不同,窗体的上的界面不同,界面的不同是由界面代码来实现,如上面代码的creatlogin函数就是写界面的代码。
不同的窗体切换,并不是窗体切换,只是窗体上的界面切换,这些界面,我主要是写Frame组件,其实的组件我就写在这个Frame组件里,窗体切换时,就把一个Frame组件卸载或隐藏,然后再把另外一个Frame组件加载或把隐藏的Frame组件再显示出来。
上面的登录代码,只要密码 wb98.com 成功,就会切换到主窗体,以下是主窗体 home.py 的代码:
from tkinter import * from job import ren,kao,gong,about # 导入job里的3个类和一个函数 class home(): def __init__(self,master=None): self.root=master self.root.geometry('400x250+888+444') self.createPage() def createPage(self): # 创建哪个3框架,先只显示人事管理框架 self.renpage=ren(self.root) self.kaopage=kao(self.root) self.gongpage=gong(self.root) self.renpage.pack() # 先只显示人事管理 self.root.title('人事管理') menubar=Menu(self.root) # 以下是操作的菜单代码 A=Menu(menubar,tearoff=0) menubar.add_cascade(label='操作',menu=A) A.add_command(label='人事管理',command=self.gotoren) A.add_command(label='考勤管理',command=self.gotokao) A.add_command(label='工资管理',command=self.gotogong) # A.add_command(label='关于',command=self.about) A.add_command(label='关于',command=about) A.add_command(label='退出',command=self.root.destroy) self.root.config(menu=menubar) def gotoren(self): self.renpage.pack() # 显示人事管理界面 self.kaopage.pack_forget() # 隐藏考勤管理界面 self.gongpage.pack_forget() # 隐藏工资管理界面 self.root.title('人事管理') def gotokao(self): self.kaopage.pack() # 显示考勤管理界面 self.renpage.pack_forget() self.gongpage.pack_forget() self.root.title('考勤管理') def gotogong(self): self.gongpage.pack() # 显示工资管理界面 self.renpage.pack_forget() self.kaopage.pack_forget() self.root.title('工资管理') def about(self): about() # 调用job.py里的about函数,弹出‘关于’窗体
根据上面的代码可以看出,主窗体的3个框架:人员管理,考勤管理,工资管理的代码都写在job.py模块里,在主窗口代码里,已经导入job.py模块,并创建了3个框架frame,但只是先显示人员管理界面。
在主窗口的菜单中的command的绑定的函数里,隐藏2个框架,显示一个框架。但是,“关于”窗体是弹出窗体,用Toplevel组件来实现。
上面的home.py模块是隐藏2个框架,显示一个框架来实现窗口切换,这样,有一个好处,在一个界面上输入的数据,在切换后,再切换回来,数据还在;但如果你想用完全卸载框架,再加载另外的新框架的方法来实现,以下就是我改进home.py的代码。
from tkinter import * from job import ren,kao,gong,about class home(): def __init__(self,master=None): self.root=master self.root.geometry('400x250+888+444') self.jobtxt='' # 用这个变量记下窗体的标题 self.createPage() def createPage(self): menubar=Menu(self.root) A=Menu(menubar,tearoff=0) menubar.add_cascade(label='操作',menu=A) A.add_command(label='人事管理',command=self.gotoren) A.add_command(label='考勤管理',command=self.gotokao) A.add_command(label='工资管理',command=self.gotogong) # A.add_command(label='关于',command=self.about) A.add_command(label='关于',command=about) A.add_command(label='退出',command=self.root.destroy) self.root.config(menu=menubar) self.gotoren() def gotoren(self): # 执行人员管理菜单 if self.jobtxt != '人事管理': # 根据窗体标题来决定否则执行这个菜单功能 if self.jobtxt == '考勤管理': # 如果要切换,就先根据窗体标签把现在的框架卸载掉 self.kaopage.destroy() if self.jobtxt == '工资管理': # 如果要切换,就先根据窗体标签把现在的框架卸载掉 self.gongpage.destroy() self.renpage=ren(self.root) # 调用job.py的ren类,显示人事管理界面 self.renpage.pack() self.root.title('人事管理') self.jobtxt='人事管理' # 记下窗体标题 def gotokao(self): # 执行考勤管理菜单 if self.jobtxt != '考勤管理': if self.jobtxt == '人事管理': self.renpage.destroy() if self.jobtxt == '工资管理': self.gongpage.destroy() self.kaopage=kao(self.root) self.kaopage.pack() self.root.title('考勤管理') self.jobtxt='考勤管理' def gotogong(self): # 执行工资管理菜单 if self.jobtxt != '工资管理': if self.jobtxt == '考勤管理': self.kaopage.destroy() if self.jobtxt == '人事管理': self.renpage.destroy() self.gongpage=gong(self.root) self.gongpage.pack() self.root.title('工资管理') self.jobtxt='工资管理' def about(self): # 调用job.py里的about函数,弹出窗体 about()
下面是job.py模块的代码
from tkinter import * class ren(Frame): # 继承Frame类 def __init__(self,master=None): Frame.__init__(self,master) self.root=master self.creatren() def creatren(self): la1=Label(self,text='这里是人事管理界面') la1.pack() en1=Entry(self) en1.pack() class kao(Frame): def __init__(self,master=None): Frame.__init__(self,master) self.root=master self.creatkao() def creatkao(self): la1=Label(self,text='这里是考勤管理界面') la1.pack() class gong(Frame): def __init__(self,master=None): Frame.__init__(self,master) self.root=master self.creatgong() def creatgong(self): la1=Label(self,text='这里是工资管理界面') la1.pack() def about(): top1=Toplevel() top1.geometry('280x150+950+515') top1.title('关于') la1=Label(top1,text='本软件官网: www.wb98.com') la1.pack(pady=10) but1=Button(top1,text=" 确 定 ",command=top1.destroy) but1.pack(side=BOTTOM, pady=10) top1.attributes("-toolwindow", 1) # 无最大化,最小化 top1.transient() # 窗口只置顶root之上 top1.resizable(False,False) # 不可调节窗体大小 top1.grab_set() # 转化模式 top1.focus_force() # 得到焦点
job.py模块代码,只要熟悉python类的知识,应该不难懂,如果不熟悉,就只能再回头再看看python类的相关知识吧。
以下是执行main.py后显示的相关结果:
来源:济亨网
本文链接:https://wb98.com/post/357.html