• Python面向对象和图形用户界面(二)---- GUI的基本框架 & 常用组件 & 布局管理


    2. GUI的基本框架

      2.1 安装wxPython:Anaconda Prompt下执行 conda install wxPython

      2.2 创建一个简单的wxPython程序:

    import wx  # 引入wx包
    app = wx.App()  # 创建一个应用程序对象,用来执行像消息循环这样的一些动作
    frame = wx.Frame(None, title='Hello, World!') # 创建一个frame对象,frame是其他UI组件的容器
    frame.Show(True) # 用来显示窗体
    app.MainLoop()  # 进入事件循环
    View Code
    import wx
    
    class MyApp(wx.App):
        
        def OnInit(self):
            frame = wx.Frame(None, title="Hello, World!")
            frame.Show()
            return True
            
    
    if __name__ == '__main__':
        app = MyApp()
        app.MainLoop()
       
    面向对象方法

      2.3 组件:

        2.3.1 组件容器(Containers)-- 用于容纳其他组件

          例:wx.Panel等

        2.3.2 动态组件(Dynamic Widgets)-- 可以被用户编辑

          例:wx.Button、wx.TextCtrl、wx.ListBox等

        2.3.3 静态组件(Static Widgets)-- 显示信息用,不能被用户编辑

          例:wx.StaticBitmap、wx.StaticText、wxStaticLine等

        2.3.4 其他组件

          例:wx.ToolBar、wx.MenuBar、wx.StatusBar

        2.3.5 Frame(Panel(Text Control))

    import wx
    
    class Frame1(wx.Frame):
        
        def __init__(self, superior):
            wx.Frame.__init__(self,parent=superior,title="Example",pos=(100,200),size=(200,100))
            panel = wx.Panel(self)
            text1 = wx.TextCtrl(panel,value="Hello,World!",size=(200,100))
            
        
    if __name__ == '__main__':
        app = wx.App()
        frame = Frame1(None)
        frame.Show(True)
        app.MainLoop()
    Hello,World!

        2.3.6 事件处理机制(Event Handling):

          1) GUI程序工作的基本机制之一 -- 事件处理

          2) 事件

            - 移动鼠标,按下鼠标左键、单击按钮等

            - 可以由用户操作触发产生,也可以在程序中创建对象产生

          3) wxPython程序将特定类型的事件关联到特定的一块代码(方法),当该类型的事件产生时,相关代码将响应事件被自动执行

            - 例:当产生鼠标移动事件时,OnMove() 方法将被自动调用

        2.3.7 事件举例:

    import wx
    
    class Frame1(wx.Frame):
        
        def __init__(self,superior):
            wx.Frame.__init__(self, parent=superior, title='Example', pos=(200,200), size=(200,100))
            self.panel = wx.Panel(self)
            self.panel.Bind(wx.EVT_LEFT_UP, self.OnClick)
            
        def OnClick(self,event):
            posm = event.GetPosition()
            wx.StaticText(parent=self.panel, label='Hello', pos=(posm.x, posm.y))
       
            
    if __name__ == '__main__':
        app = wx.App()
        frame = Frame1(None)
        frame.Show(True)
        app.MainLoop()
    self.panel.Bind(wx.EVT_LEFT_UP, self.OnClick)

    3. GUI常用组件

      3.1 按钮(Button及其家族)

        3.1.1 功能:接收用户的点击事件,触发相应的操作。

        3.1.2 常用按钮

          - wx.Button:文本按钮

          - wx.BitmapButton:位图按钮

          - wx.ToggleButton:开关按钮

        3.1.3 绑定处理按钮点击的事件

      3.2 菜单(Menu及其组件)

        3.2.1 菜单:菜单栏,菜单,菜单项命令

        3.2.2 wxPython用于创建菜单的类:  - wx.MenuBar     - wx.Menu     - wx.MenuItem 

        3.2.3 菜单事件:  - wx.EVT_MENU

          # 绑定事件处理器

          self.Bind(wx.EVT_MENU, self.OnClickBigger, biggerItem)

          self.Bind(wx.EVT_MENU, self.OnClickQuit, id=wx.ID_EXIT)

          # 事件处理器

          def OnClickBigger(self, e):

            pass

          def OnClickQuit(self, e):

            self.Close()

      3.3 静态文本(StaticText)和文本框(TextCtrl)

        3.3.1 文本框用于接收用户在框内输入的信息,或显示由程序提供的信息

        3.3.2 静态文本框(标签): - wx.StaticText

        3.3.3 文本框: - 类:wx.TextCtrl  - 常用形式:单行,多行,富文本框

      3.4 列表(ListCtrl)

        3.4.1 列表用于显示多个条目并且可供用户选择

        3.4.2 列表能够以下面四种不同模式建造:

          图标:- wx.LC_ICON

          小图标:- wx.LC_SMALL_ICON

          列表:- wx.LC_LIST

          报告:- wx.LC_REPORT

      3.5 单选(RadioBox)与复选框(CheckBox)

        3.5.1 复选框用于从一组可选项中,同时选中多个选项

        3.5.2 单选框用于从一组互斥的选项中,选取其一

    6. 布局管理 -- 灵活布局的解决方案 sizer,屏幕布局的算法

      6.1 wxPython常用的sizer

        - wx.BoxSizer    - wx.FlexGridSizer    - wx.GridSizer    - wx.GridBagSizer    - wx.StaticBoxSizer

      6.2 使用sizer的步骤

        a. 创建自动调用尺寸的容器,例如panel

        b. 创建sizer

        c. 创建子窗口(窗体组件)

        d. 使用sizer的Add()方法将每个子窗口添加给sizer

        e. 调用容器的SetSizer(sizer)方法

      6.3 示例程序

    import wx
    
    class Frame1(wx.Frame):
        
        def __init__(self, superior):
            wx.Frame.__init__(self, parent=superior, title="Hello World in wxPython")
            panel = wx.Panel(self)
            sizer = wx.BoxSizer(wx.VERTICAL)
            self.text1 = wx.TextCtrl(panel, value="Hello,World!", size=(200,180), style=wx.TE_MULTILINE)
            sizer.Add(self.text1, 0, wx.ALIGN_TOP | wx.EXPAND)
            button = wx.Button(panel, label='Click')
            sizer.Add(button)
            panel.SetSizerAndFit(sizer)
            panel.Layout()
            self.Bind(wx.EVT_BUTTON, self.OnClick, button)
            
        def OnClick(self, text):
            self.text1.AppendText('
    Hello, World!')
            
    
    if __name__ == '__main__':
        app = wx.App()
        frame = Frame1(None)
        frame.Show(True)
        app.MainLoop()
    View Code
  • 相关阅读:
    POJ 2018 二分
    873. Length of Longest Fibonacci Subsequence
    847. Shortest Path Visiting All Nodes
    838. Push Dominoes
    813. Largest Sum of Averages
    801. Minimum Swaps To Make Sequences Increasing
    790. Domino and Tromino Tiling
    764. Largest Plus Sign
    Weekly Contest 128
    746. Min Cost Climbing Stairs
  • 原文地址:https://www.cnblogs.com/wnzhong/p/6350283.html
Copyright © 2020-2023  润新知