zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    图像滤波
    直方图histeq
    直方图
    基于灰度变换的图像增强
    图像增强
    图像旋转和缩放
    图像点运算
    像素的连接与联通
    程序员进阶之算法练习(一)
    RxSwift 系列(二)
  • 原文地址:https://www.cnblogs.com/wnzhong/p/6350283.html
Copyright © 2011-2022 走看看