五筆打字通主頁
我前面幾篇文章介紹了,在一個模塊下如何做到窗口的切換,在一個模塊下做窗體切換,一般都是因為程序比較簡單,代碼少,如果程序繁雜,把代碼都做在一個模塊里,就算是查找相關的代碼也不容易,對吧。
為了管理方便,稍復雜一點,都是把不同的窗體分別做一個模塊,每個模塊都取有意義的名義,這樣來管理代碼應該是方便的。
一般來說,一個模塊對應一個窗體,或者對應一相同的幾個窗體,也有的模塊對應的,并不是窗體的代碼,可能是一個操作代碼,例如,操作數據庫的相關代碼寫在一個模塊里。
下面,我來用代碼介紹一個如何用多模塊寫幾個窗體的切換:
我設計有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://www.chinaengraver.com/post/357.html