當前位置:首頁 ? 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

來源:濟亨網

本文鏈接:http://www.chinaengraver.com/post/357.html

    << 上一篇 到底啦 >>

    湘公網安備 43011102000514號 - 湘ICP備08100508號

    2019年秋霞鲁丝片瓜皮_导航亚洲AV日韩AV永久无码_有没有哪些可以看片的免费的_国产色妞妞在线视频免费播放