美文网首页
Python GUI与面向对象

Python GUI与面向对象

作者: 凌勇 | 来源:发表于2017-08-01 21:59 被阅读0次

    Python GUI与面向对象

    Python面向对象

    • 对象是数据与其能实施的操作的封装结构
    • 类是对于实例对象的抽象

    类的定义

    class clickButton(object):
      'define a clickButton'
      
      # 类名就是一个命名空间namespace
      def Dog(self):
      # 类方法第一个参数为self
        print 'Hi'
    

    实例的创建

    # 创建实例直接使用构造方法
    button = clickButton()
    # 使用实例方法只需要用实例名.
    button.Dog()
    

    类的init()方法

    # __init__()方法即构造方法,该方法会被创建对象时自动调用
    def __init__(self,name):
      self.name = name
    

    类的静态属性

    # 类属性要用类名.变量名 使用
    class Dog(pbject):
      counter = 0 # 静态属性
      def __init__(self,name):
        self.name = name
        Dog.counter+=1
      def greet(self):
        print 'Hi'
    

    继承的思想

    # Python属于多继承
    class subClass(parentClass1[,parentClass2···]):
      pass
      # 子类可以重写父类的方法
    

    GUI开发

    wxPython库

    第一个实例

    # -*- coding: utf-8 -*-
    """
    Spyder Editor
    
    This is a temporary script file.
    """
    
    import wx
    
    
    class MyApp(wx.App):
        def OnInit(self):
            frame = wx.Frame(None, title='HelloWorld')
            frame.Show() #Show()函数首字母大写
            return True
    
    
    if __name__ == '__main__':
        app = MyApp()
        app.MainLoop()
    

    wxPython库中的组件,与java中的组件基本上相同

    组件.jpg
    # -*- coding: utf-8 -*-
    """
    Spyder Editor
    
    This is a temporary script file.
    """
    
    import wx
    
    
    class MyFrame(wx.Frame):
        def __init__(self,superior):
            wx.Frame.__init__(self,parent=superior,title='Example',pos=(100,200),size=(200,100))
            panel = wx.Panel(self)
            text = wx.TextCtrl(panel,value='HelloWorld',size=(200,100))
    
    if __name__=='__main__':
        app = wx.App()
        frame = MyFrame(None)
        frame.Show(True)
        app.MainLoop()
    
    

    运行结果:

    运行结果.jpg

    事件响应

    示例代码

    # -*- coding: utf-8 -*-
    """
    Spyder Editor
    
    This is a temporary script file.
    """
    
    import wx
    
    
    class MyFrame(wx.Frame):
        def __init__(self,superior):
            wx.Frame.__init__(self,parent=superior,title='Example',pos=(100,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='HI',pos=(posm.x,posm.y))
    
    if __name__=='__main__':
        app = wx.App()
        frame = MyFrame(None)
        frame.Show(True)
        app.MainLoop()
    
    

    响应事件运行结果:

    响应事件运行结果.jpg

    常用的组件

    • wx.Button 普通按钮
    • wx.BitmapButton 位图按钮
    • wx.ToggleButton 开关按钮,按下去会长关或者常开
    • wx.MenuBar、wx.Menu、wx.MenuItem(绑定的按钮事件为self.Bind(wx.EvT_MENU,self.OnClickQuit,quitItem)
    • wx.StaticText 标签,静态文本框
    • wx.TextCtrl 文本框
    • wx.RadioBox
    • wx.CheckBox

    sizer布局管理

    sizer本身不是一个容器或者窗口,它是一个屏幕布局的算法
    wxPython 使用的sizer:

    • wx.BoxSizer 平行或垂直布局
    • wx.FlexGridSizer 行高和列宽由本行、列最大的组件决定
    • wx.GridSizer 所有组件大小一致,固定在一个方向

    sizer示意图

    sizer示意.jpg

    sizer的例程

    # -*- coding: utf-8 -*-
    """
    Spyder Editor
    
    This is a temporary script file.
    """
    
    import wx
    
    
    class MyFrame(wx.Frame):
        def __init__(self,superior):
            wx.Frame.__init__(self,parent=superior,title='Example')
            self.panel = wx.Panel(self)
            self.sizer = wx.BoxSizer(wx.VERTICAL)
            self.text1 = wx.TextCtrl(self.panel,value='HelloWorld',size=(200,180),style=wx.TE_MULTILINE)
    
            self.sizer.Add(self.text1,0,wx.ALIGN_TOP|wx.EXPAND)
            self.button = wx.Button(self.panel,label = 'Click Me')
    
            self.sizer.Add(self.button)
            self.panel.SetSizerAndFit(sizer=self.sizer)
    
            self.panel.Layout()
    
    
            self.panel.Bind(wx.EVT_BUTTON,self.OnClick)
    
        def OnClick(self,event):
            self.text1.AppendText('\nHelloWorld')
    
    if __name__=='__main__':
        app = wx.App()
        frame = MyFrame(None)
        frame.Show(True)
        app.MainLoop()
    

    运行结果

    sizer结果.jpg

    其它的GUI库

    PyQt 跨平台,文档丰富,与Qt、C++开发经验互通,但是运行时较为庞大,要注意内存
    TKinter 内置于Python中,性能较差,运行慢
    PyGTK 免费,windows表现不好

    相关文章

      网友评论

          本文标题:Python GUI与面向对象

          本文链接:https://www.haomeiwen.com/subject/ejdslxtx.html