当前位置:首页 » tkinter » 正文

tkinter,在多模块下编程:多窗口切换,跳转

  我前面几篇文章介绍了,在一个模块下如何做到窗口的切换,在一个模块下做窗体切换,一般都是因为程序比较简单,代码少,如果程序繁杂,把代码都做在一个模块里,就算是查找相关的代码也不容易,对吧。

  为了管理方便,稍复杂一点,都是把不同的窗体分别做一个模块,每个模块都取有意义的名义,这样来管理代码应该是方便的。

  一般来说,一个模块对应一个窗体,或者对应一相同的几个窗体,也有的模块对应的,并不是窗体的代码,可能是一个操作代码,例如,操作数据库的相关代码写在一个模块里。

  下面,我来用代码介绍一个如何用多模块写几个窗体的切换:

  我设计有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后显示的相关结果:

未命名.GIF

未命名.GIF

未命名.GIF

打赏 支付宝打赏 微信打赏

来源:济亨网

本文链接:https://www.wb98.com/post/357.html

    << 上一篇 下一篇 >>

    湘公网安备 43011102000514号 - 湘ICP备08100508号