教育主題功能GUI實現(xiàn)(Part1 登錄界面及主界面GUI功能實現(xiàn))

1、首先采用xMind軟件畫出腦圖

從下面的腦圖可以看出馋贤,需要設計兩個界面赞别,一個使登錄及注冊界面、一個是登錄后顯示的主界面配乓,還有一個注冊成功的彈出對話框仿滔。

image.png

2、注冊及登錄界面設計

image.png

wxFormBuilder自動生成的python代碼重構后保存為RegisterFrame.py文件如下:

# -*- coding: utf-8 -*- 

###########################################################################
## Python code generated with wxFormBuilder (version Jun 17 2015)
## http://www.wxformbuilder.org/
##
## PLEASE DO "NOT" EDIT THIS FILE!
###########################################################################

import wx
import wx.xrc

DEFAULT_REGISTER_LIST = [u"用戶名",u"密碼",u"確認密碼"]
DEFAULT_BUTTON_LIST   = [u"登錄",u"注冊"]

###########################################################################
## Class RegisterFrame
###########################################################################

class RegisterFrame ( wx.Frame ):

    def __init__( self, parent, id = -1, UpdateUI=None ):
        wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = wx.EmptyString, pos = wx.DefaultPosition, size = wx.Size( 500,359 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )

        #self.UpdateUI = UpdateUI
        self.InitUI()

    def InitUI(self):
        self.SetSizeHints( wx.DefaultSize, wx.DefaultSize )
        self.BoxSizer2Init()
        self.BoxSizer1Init()
        self.SetSizer( self.bSizer1 )
        self.Layout()
        self.Centre( wx.BOTH )

    def staticTextInit(self,name):
        m_staticText = wx.StaticText(self, wx.ID_ANY, name, wx.DefaultPosition, wx.DefaultSize, 0 )
        m_staticText.Wrap( -1 )
        return m_staticText

    def textCtrlInit(self):
        m_textCtrl =  wx.TextCtrl(self,wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 )
        return m_textCtrl

    def buttonInit(self,name):
        m_button = wx.Button( self, wx.ID_ANY, name, wx.DefaultPosition, wx.DefaultSize, 0 )
        m_button.SetBackgroundColour( wx.SystemSettings.GetColour( wx.SYS_COLOUR_HIGHLIGHT ) )
        return m_button

    def BoxSizer1Init(self):
        self.m_staticText1 = self.staticTextInit(DEFAULT_REGISTER_LIST[0])
        self.m_staticText2 = self.staticTextInit(DEFAULT_REGISTER_LIST[1])
        self.m_staticText3 = self.staticTextInit(DEFAULT_REGISTER_LIST[2])
        self.m_textCtrl1   = self.textCtrlInit()
        self.m_textCtrl2   = self.textCtrlInit()
        self.m_textCtrl3   = self.textCtrlInit()

        self.bSizer1 = wx.BoxSizer( wx.VERTICAL )
        self.bSizer1.Add( self.m_staticText1, 0, wx.ALL, 5 )
        self.bSizer1.Add( self.m_textCtrl1, 0, wx.ALL, 5 )
        self.bSizer1.Add( self.m_staticText2, 0, wx.ALL, 5 )
        self.bSizer1.Add( self.m_textCtrl2, 0, wx.ALL, 5 )
        self.bSizer1.Add( self.m_staticText3, 0, wx.ALL, 5 )
        self.bSizer1.Add( self.m_textCtrl3, 0, wx.ALL, 5 )
        self.bSizer1.Add(self.bSizer2, 1, wx.EXPAND, 5 )

    def BoxSizer2Init(self):
        self.bSizer2 = wx.BoxSizer( wx.HORIZONTAL )
        self.m_button1 = self.buttonInit(DEFAULT_BUTTON_LIST[0])
        self.m_button2 = self.buttonInit(DEFAULT_BUTTON_LIST[1])
        self.bSizer2.Add( self.m_button1, 0, wx.ALL, 5 )
        self.bSizer2.Add( self.m_button2, 0, wx.ALL, 5 )

    def __del__( self ):
        pass

3犹芹、登錄后主界面設計

image.png

wxFormBuilder自動生成的python代碼重構后保存為MainFrame.py文件如下:

# -*- coding: utf-8 -*- 

###########################################################################
## Python code generated with wxFormBuilder (version Jun 17 2015)
## http://www.wxformbuilder.org/
##
## PLEASE DO "NOT" EDIT THIS FILE!
###########################################################################

import wx
import wx.xrc

MENU_LIST = [u"菜單",u"幫助"]
FIRST_SUBMENU_LIST = [u"試題更新",u"軟件更新"]
SECOND_SUBMENU_LIST = [u"關于"]

RADIO_BUTTON_LIST = [u"隨機做試題",u"隨機做試卷",u"隨機做奧數(shù)"]
###########################################################################
## Class MainFrame
###########################################################################

###########################################################################
## Class MainFrame
###########################################################################

class MainFrame ( wx.Frame ):

    def __init__( self, parent, id = -1, UpdateUI=None ):
        wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = u"初一數(shù)學練習", pos = wx.DefaultPosition, size = wx.Size( 848,600 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )

        self.UpdateUI = UpdateUI
        self.InitUI()

    def InitUI(self):
        self.SetSizeHints( wx.DefaultSize, wx.DefaultSize )

        self.MenuInit()
        self.statusBarInit()
        self.BoxSizer3Init()
        self.SetSizer( self.bSizer3 )
        self.Layout()

        self.Centre( wx.BOTH )
        self.EventBinding()

    def EventBinding(self):
        # Connect Events
        self.Bind( wx.EVT_CLOSE, self.OnClose )
        self.m_radioBtn1.Bind( wx.EVT_RADIOBUTTON, self.OnRadioButtonClick )
        self.m_radioBtn2.Bind( wx.EVT_RADIOBUTTON, self.OnRadioButtonClick )
        self.m_radioBtn3.Bind( wx.EVT_RADIOBUTTON, self.OnRadioButtonClick )
        self.m_panel1.Bind( wx.EVT_LEFT_DCLICK, self.OnLeftDClick )
        self.m_panel1.Bind( wx.EVT_RIGHT_DCLICK, self.OnRightDClick )
        self.m_panel2.Bind( wx.EVT_LEFT_DCLICK, self.OnLeftDClick )

    def menuItemInit(self,parent,name):
        m_menuItem = wx.MenuItem(parent, wx.ID_ANY, name, wx.EmptyString, wx.ITEM_NORMAL )
        return m_menuItem

    def MenuInit(self):
        self.m_menubar1 = wx.MenuBar( 0 )
        self.m_menu1 = wx.Menu()

        self.m_menuItem1 = self.menuItemInit(self.m_menu1,FIRST_SUBMENU_LIST[0])
        self.m_menu1.Append( self.m_menuItem1 )
        self.m_menu1.AppendSeparator()
        self.m_menuItem2 = self.menuItemInit(self.m_menu1,FIRST_SUBMENU_LIST[1])
        self.m_menu1.Append( self.m_menuItem2 )
        self.m_menubar1.Append( self.m_menu1, MENU_LIST[0] )

        self.m_menu2 = wx.Menu()
        self.m_menuItem3 = self.menuItemInit(self.m_menu2,SECOND_SUBMENU_LIST[0])
        self.m_menu2.Append( self.m_menuItem3 )

        self.m_menubar1.Append( self.m_menu2, MENU_LIST[0] )

        self.SetMenuBar( self.m_menubar1 )

    def statusBarInit(self):
        self.m_statusBar1 = self.CreateStatusBar( 1, 0, wx.ID_ANY )

    def RadioButtonInit(self,name):
        radioBtn = wx.RadioButton( self, wx.ID_ANY, name, wx.DefaultPosition, wx.DefaultSize, 0 )
        radioBtn.SetValue( True )
        radioBtn.SetFont( wx.Font( 8, 70, 90, 90, False, "宋體" ) )
        return radioBtn

    def _BoxSizer4Init(self):
        self.bSizer4 = wx.BoxSizer( wx.VERTICAL )
        self.bSizer4.SetMinSize( wx.Size( 50,50 ) )

        self.m_radioBtn1 = self.RadioButtonInit(RADIO_BUTTON_LIST[0])
        self.bSizer4.Add( self.m_radioBtn1, 0, wx.ALIGN_LEFT|wx.ALL|wx.FIXED_MINSIZE, 5 )
        self.m_radioBtn2 = self.RadioButtonInit(RADIO_BUTTON_LIST[1])
        self.bSizer4.Add( self.m_radioBtn2, 0, wx.ALIGN_LEFT|wx.ALL|wx.FIXED_MINSIZE, 5 )
        self.m_radioBtn3 = self.RadioButtonInit(RADIO_BUTTON_LIST[2])
        self.bSizer4.Add( self.m_radioBtn3, 0, wx.ALL, 5 )

    def BoxSizer3Init(self):
        self._BoxSizer4Init()
        self.bSizer3 = wx.BoxSizer( wx.HORIZONTAL )
        self.bSizer3.SetMinSize( wx.Size( 800,600 ) )
        self.bSizer3.Add( self.bSizer4, 1, wx.ALIGN_TOP|wx.ALL|wx.FIXED_MINSIZE, 5 )
        self._BoxSize5Init()
        self.bSizer3.Add( self.bSizer5, 1, wx.EXPAND, 5 )

    def _BoxSize5Init(self):
        self.bSizer5 = wx.BoxSizer( wx.HORIZONTAL )

        self.bSizer5.SetMinSize( wx.Size( 750,-1 ) ) 
        self.m_splitter1 = wx.SplitterWindow( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.SP_3D|wx.SP_3DBORDER|wx.SP_3DSASH )
        self.m_splitter1.Bind( wx.EVT_IDLE, self.m_splitter1OnIdle )
        self.m_splitter1.SetMinimumPaneSize( 1 )

        self.m_splitter1.SetForegroundColour( wx.SystemSettings.GetColour( wx.SYS_COLOUR_HIGHLIGHT ) )
        self.m_splitter1.SetBackgroundColour( wx.SystemSettings.GetColour( wx.SYS_COLOUR_HIGHLIGHTTEXT ) )

        self.m_panel1 = wx.Panel( self.m_splitter1, wx.ID_ANY, wx.DefaultPosition, wx.Size( 600,600 ), wx.TAB_TRAVERSAL )
        self.m_panel2 = wx.Panel( self.m_splitter1, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL )
        self.m_splitter1.SplitVertically( self.m_panel1, self.m_panel2, 0 )
        self.bSizer5.Add( self.m_splitter1, 1, wx.EXPAND, 5 )

    def __del__( self ):
        pass

    # Virtual event handlers, overide them in your derived class
    def OnClose( self, event ):
        event.Skip()

    def OnRadioButtonClick( self, event ):
        event.Skip()

    def OnLeftDClick( self, event ):
        event.Skip()

    def OnRightDClick( self, event ):
        event.Skip()


    def m_splitter1OnIdle( self, event ):
        self.m_splitter1.SetSashPosition( 0 )
        self.m_splitter1.Unbind( wx.EVT_IDLE )

實現(xiàn)效果

image.png

兩個界面調(diào)試文件mainWin.py如下:

import wx
# 導入RegisterFrame.py中內(nèi)容
import RegisterFrame
import MainFrame

# 創(chuàng)建mainWin類并傳入RegisterFrame.RegisterFrame
# 或者MainFrame.MainFrame崎页,用于單獨調(diào)試兩個界面的代碼。
#class mainWin(RegisterFrame.RegisterFrame):
class mainWin(MainFrame.MainFrame):

   # 實現(xiàn)Button控件的響應函數(shù)showMessage
   def showMessage(self, event):
       self.m_textCtrl1.Clear()
       self.m_textCtrl1.SetValue('hello world')

if __name__ == '__main__':
    # 下面是使用wxPython的固定用法
    app = wx.App()

    main_win = mainWin(None)
    main_win.Show()

    app.MainLoop()
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末腰埂,一起剝皮案震驚了整個濱河市飒焦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌盐固,老刑警劉巖荒给,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丈挟,死亡現(xiàn)場離奇詭異,居然都是意外死亡志电,警方通過查閱死者的電腦和手機曙咽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挑辆,“玉大人例朱,你說我怎么就攤上這事∮悴酰” “怎么了洒嗤?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長魁亦。 經(jīng)常有香客問我渔隶,道長,這世上最難降的妖魔是什么洁奈? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任间唉,我火速辦了婚禮,結果婚禮上利术,老公的妹妹穿的比我還像新娘呈野。我一直安慰自己,他們只是感情好印叁,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布被冒。 她就那樣靜靜地躺著,像睡著了一般轮蜕。 火紅的嫁衣襯著肌膚如雪昨悼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天肠虽,我揣著相機與錄音幔戏,去河邊找鬼。 笑死税课,一個胖子當著我的面吹牛闲延,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播韩玩,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼垒玲,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了找颓?” 一聲冷哼從身側響起合愈,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后佛析,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體益老,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年寸莫,在試婚紗的時候發(fā)現(xiàn)自己被綠了捺萌。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡膘茎,死狀恐怖桃纯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情披坏,我是刑警寧澤态坦,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站棒拂,受9級特大地震影響伞梯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜着茸,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一壮锻、第九天 我趴在偏房一處隱蔽的房頂上張望琐旁。 院中可真熱鬧涮阔,春花似錦、人聲如沸灰殴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽牺陶。三九已至伟阔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間掰伸,已是汗流浹背皱炉。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留狮鸭,地道東北人合搅。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像歧蕉,于是被迫代替她去往敵國和親灾部。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348