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
原文地址:https://www.cnblogs.com/wnzhong/p/6350283.html