前面我們學(xué)習(xí)了兩種GUI模塊,下面我們串接起前面的內(nèi)容來(lái)創(chuàng)建一個(gè)登陸+注冊(cè)+寫日記的圖形用戶界面。本節(jié)的設(shè)計(jì)思路為:首先通過(guò)一個(gè)主頁(yè)面來(lái)控制登錄界面(這是一種常用的設(shè)計(jì)理念,使主頁(yè)面更為簡(jiǎn)潔),在登錄頁(yè)面控制兩個(gè)頁(yè)面,如果登錄信息正確,那么跳轉(zhuǎn)到下一個(gè)頁(yè)面,若要注冊(cè)也則點(diǎn)擊進(jìn)入注冊(cè)頁(yè)面,本節(jié)會(huì)通過(guò)四個(gè)代碼,三個(gè)頁(yè)面來(lái)簡(jiǎn)單實(shí)現(xiàn)。
1. 主頁(yè)面程序(main.py)
from tkinter import * from LoginPage import * root = Tk() root.title('小程序') Login(root) root.mainloop()
2. 登陸頁(yè)面程序(LoginPage.py)
from tkinter import * from tkinter.messagebox import * from MainPage import * from Register import * class Login(object): def __init__(self, master=None): self.root = master # 定義內(nèi)部變量root self.root.minsize(300, 200) self.username = StringVar() self.password = StringVar() self.create() def create(self): self.page = Frame(self.root) # 創(chuàng)建Frame self.page.pack() Label(self.page).grid(row=0, stick=W) Label(self.page, text='賬戶: ').grid(row=1, stick=W, pady=10) Entry(self.page, textvariable=self.username).grid(row=1, column=1, stick=E) Label(self.page, text='密碼: ').grid(row=2, stick=W, pady=10) Entry(self.page, textvariable=self.password, show='*').grid(row=2, column=1, stick=E) Button(self.page, text='登陸', command=self.loginCheck).grid(row=3, stick=W, pady=10) Button(self.page, text='注冊(cè)', command=self.regis).grid(row=3, column=1, stick=E) def loginCheck(self): if self.username.get() == 'qy' and self.password.get() == '123456': self.page.destroy() MainPage(self.root) else: showinfo(title='錯(cuò)誤', message='賬號(hào)或密碼錯(cuò)誤!') def regis(self): self.page.destroy() app = wx.App() frame = MyFrame() frame.Show() app.MainLoop()
3. 注冊(cè)頁(yè)面程序(Register.py)
import wx class MyFrame(wx.Frame): def __init__(self): wx.Frame.__init__(self, None, -1, "登錄界面", size=(300, 300)) panel = wx.Panel(self)#創(chuàng)建一個(gè)畫布,然后創(chuàng)建功能區(qū)并放到畫布上 self.title = wx.StaticText(panel,label = '注冊(cè)界面') self.username = wx.StaticText(panel,label = '用戶名字:') self.user_name = wx.TextCtrl(panel,style = wx.TE_LEFT) self.userpassword = wx.StaticText(panel,label = '輸入密碼:') self.user_password = wx.TextCtrl(panel,style = wx.TE_PASSWORD) self.userpassword1 = wx.StaticText(panel,label = '確認(rèn)密碼:') self.user_password1 = wx.TextCtrl(panel,style = wx.TE_PASSWORD) self.button_register = wx.Button(panel,label = '注冊(cè)') container_one = wx.BoxSizer(wx.HORIZONTAL) # 創(chuàng)建一個(gè)box容器并控制水平排列 container_one.Add(self.username,proportion = 0,flag = wx.ALL,border = 7) container_one.Add(self.user_name,proportion = 1,flag = wx.ALL,border = 7) container_two = wx.BoxSizer(wx.HORIZONTAL) # 創(chuàng)建一個(gè)box容器并控制水平排列 container_two.Add(self.userpassword,proportion = 0,flag = wx.ALL,border = 7) container_two.Add(self.user_password,proportion = 1,flag = wx.ALL,border = 7) container_four = wx.BoxSizer(wx.HORIZONTAL) # 創(chuàng)建一個(gè)box容器并控制水平排列 container_four.Add(self.userpassword1,proportion = 0,flag = wx.ALL,border = 7) container_four.Add(self.user_password1,proportion = 1,flag = wx.ALL,border = 7) container_three = wx.BoxSizer(wx.HORIZONTAL) # 創(chuàng)建一個(gè)box容器并控制水平排列 container_three.Add(self.button_register,proportion =0,flag = wx.ALIGN_CENTER, border = 4) sizers = wx.BoxSizer(wx.VERTICAL) sizers.Add(self.title,proportion=0, flag=wx.BOTTOM|wx.TOP|wx.ALIGN_CENTER,border=10) sizers.Add(container_one,proportion = 0,flag =wx.EXPAND|wx.LEFT|wx.RIGHT,border=40) sizers.Add(container_two, proportion=0, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=40) sizers.Add(container_four, proportion=0, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=40) sizers.Add(container_three, proportion=0, flag=wx.ALIGN_CENTER|wx.TOP, border=10) panel.SetSizer(sizers) if __name__ == "__main__": app = wx.App() frame = MyFrame() frame.Show() app.MainLoop()
4. 寫日記頁(yè)面程序(MainPage.py)
from tkinter import * class MainPage(object): def __init__(self, master=None): self.root = master # 定義內(nèi)部變量root self.root.geometry('%dx%d' % (600, 400)) # 設(shè)置窗口大小 self.createPage() def createPage(self): self.inputPage = InputFrame(self.root) # 創(chuàng)建不同F(xiàn)rame self.queryPage = QueryFrame(self.root) self.countPage = CountFrame(self.root) self.aboutPage = AboutFrame(self.root) self.inputPage.pack() # 默認(rèn)顯示數(shù)據(jù)錄入界面 menubar = Menu(self.root) menubar.add_command(label='寫日記', command=self.inputData) menubar.add_command(label='看日記', command=self.queryData) self.root['menu'] = menubar # 設(shè)置菜單欄 def inputData(self): self.inputPage.pack() self.queryPage.pack_forget() self.countPage.pack_forget() self.aboutPage.pack_forget() def queryData(self): self.inputPage.pack_forget() self.queryPage.pack() self.countPage.pack_forget() self.aboutPage.pack_forget()
5. 綜合使用
輸入‘qy’、密碼‘123456’,點(diǎn)擊登陸,進(jìn)入下一頁(yè)面。
點(diǎn)擊注冊(cè)進(jìn)入下一頁(yè)面:
6. 總結(jié)
這個(gè)簡(jiǎn)單的案例結(jié)合了Tkinter和wxPython兩種用法,大家頁(yè)面的跳轉(zhuǎn)就類似于模塊調(diào)用,等同于直接調(diào)用其他模塊中的方法,也就是建立了頁(yè)面與頁(yè)面之間的連接,本節(jié)內(nèi)容只是Gui模塊的簡(jiǎn)單使用,有興趣的同學(xué)可以去開(kāi)發(fā)一個(gè)屬于自己的小程序。
C語(yǔ)言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競(jìng)賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點(diǎn)擊了解:
一點(diǎn)編程也不會(huì)寫的:零基礎(chǔ)C語(yǔ)言學(xué)練課程
解決困擾你多年的C語(yǔ)言疑難雜癥特性的C語(yǔ)言進(jìn)階課程
從零到寫出一個(gè)爬蟲的Python編程課程
只會(huì)語(yǔ)法寫不出代碼?手把手帶你寫100個(gè)編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競(jìng)賽課入門課程
手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程