五笔打字通主页
我前面几篇文章介绍了,在一个模块下如何做到窗口的切换,在一个模块下做窗体切换,一般都是因为程序比较简单,代码少,如果程序繁杂,把代码都做在一个模块里,就算是查找相关的代码也不容易,对吧。
为了管理方便,稍复杂一点,都是把不同的窗体分别做一个模块,每个模块都取有意义的名义,这样来管理代码应该是方便的。
一般来说,一个模块对应一个窗体,或者对应一相同的几个窗体,也有的模块对应的,并不是窗体的代码,可能是一个操作代码,例如,操作数据库的相关代码写在一个模块里。
下面,我来用代码介绍一个如何用多模块写几个窗体的切换:
我设计有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后显示的相关结果:
来源:济亨网
本文链接:http://wb86.com/post/357.html