类属性
- 类的数据属性(静态成员):仅仅是定义的类变量
- 在类创建后被使用
- 可以由类的方法来更新,也可以在主程序中更新
- 类属性和实例无关,修改类属性需要使用类名
class Dog(object): counter=0 def __init__(self,name): self.name=name Dog.counter+=1 def greet(self): print("Hi,I am %s,my number is %d"%(self.name,Dog.counter)) if __name__=="__main__": dog=Dog("Zero") dog.greet()
类的实现需要指定继承类或基类,可以多继承,默认为object基类。上述代码中counter为类的数据属性,需要使用类名访问。
-
以self来给出成员变量,self.name指明了类具有成员变量name
私用方法和属性
- 默认情况下,python类的成员属性与方法都是public
- 提供访问控制符来限定成员函数的访问
- 双下划线(__):__var属性会被__classname_var替换,防止父类和子类中的同名冲突
- 单下划线(_):在属性名前使用一个单下划线字符,防止模块的属性用“from mymodule import*”来加载
GUI的基本框架
1.wxPython
- 基本框架
-
import wx app=wx.App() fram=wx.Frame(None,title="Hello Python") fram.Show(True) app.MainLoop()
-
- 组件
- 组件容器(Containers)----用于容纳其他组件,wx.panel
- 动态组件(Dynamic Widgets)----可以被用户编辑,wx.Button,wx.TextCtrl,wx.ListBox
- 静态组件(Static Widgets)----显示信息用,不被用户编辑,wx.StaticBitmap,wx.StaticText,wx.StaticLine
- 其他组件----wx.ToolBar,wx.MenuBar,wx.StatusBar
- 事件处理机制
- 相应鼠标消息
- 按钮及其家族
- wx.Button:文本按钮
- wx.BitmapButton:位图按钮
- wx.ToggleButton:开关按钮
- 绑定处理按钮点击事件
- 菜单及其组件
- 菜单栏
- 菜单
- 菜单项命令
- wxPython用于创建菜单的类:
- wx.Menubar
- wx.Menu
- wx.MenuItem
- 菜单事件: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()
-
- 静态文本(StaticText)和文本框(TextCtrl)
- 静态文本框(标签):
- 类:wx.StaticText
- 文本框,用于接收输入信息
- 类:wx.TextCtrl
- 常用形式:单行,多行,富文本
- 静态文本框(标签):
- 列表
- wx.LC_ICON(图标)
- wx.LC_SMALL_ICON(小图标)
- wx.LC_LIST(列表)
- wx.LC_REPORT(报告)
- 实例:
-
import wx class AppFrame(wx.Frame): def __init__(self,superior): wx.Frame.__init__(self,parent=superior,title="Exapp",pos= (100,100),size=(800,700)) self.panel=wx.Panel(self) # self.text=wx.TextCtrl(panel,value="Hello Client Text!",size=(800,700)) self.panel.Bind(wx.EVT_LEFT_UP,self.OnClick)#鼠标左键弹起的事件绑定到派生出的子类的onClick方法上 def OnClick(self,event): posm=event.GetPosition()#获取鼠标单击位置 wx.StaticText(parent=self.panel,label="Hello Click!",pos=(posm.x,posm.y))#放置一个静态文本控件 if __name__=="__main__": app=wx.App() frame=AppFrame(None) frame.Show(True) app.MainLoop()
-
- 布局管理:
- 灵活布局的解决方案:sizer
- 每个sizer有自己的定位策略,开发者只需要选择适合策略的sizer将窗口组件放入,指定需求即可
- sizer它只是一个屏幕布局的算法,不是一个窗口或组件
- sizer允许嵌套
- wxPython常用的sizer:
- wx.BoxSizer
- wx.FlexGridSizer
- wx.GridSizer
- wx.GridBagSizer
- wx.StaticBoxSizer
- 使用sizer的步骤:
- 创建自动调节尺寸的容器,如panel
- 创建sizer
- 创建子窗口(窗口部件)
- 使用sizer的Add()将每个部件添加加进去
- 调用容器的SetSizer(sizer)方法
-
import wx class AppFrame(wx.Frame): def __init__(self,superior): wx.Frame.__init__(self,parent=superior,title="Exapp",pos= (100,100),size=(800,700)) #self.panel=wx.Panel(self) panel=wx.Panel(self) sizer=wx.BoxSizer(wx.VERTICAL) self.text=wx.TextCtrl(panel,value="Hello Client Text!",size=(200,550),style=wx.TE_MULTILINE) sizer.Add(self.text,0,wx.ALIGN_TOP|wx.EXPAND) button=wx.Button(panel,label="Click Me!") sizer.Add(button) panel.SetSizerAndFit(sizer) panel.Layout() self.Bind(wx.EVT_BUTTON,self.OnClick,button) #self.panel.Bind(wx.EVT_LEFT_UP,self.OnClick)#鼠标左键弹起的事件绑定到派生出的子类的onClick方法上 def OnClick(self,text): #posm=event.GetPosition()#获取鼠标单击位置 #wx.StaticText(parent=self.panel,label="Hello Click!",pos=(posm.x,posm.y))#放置一个静态文本控件 self.text.AppendText("\nHello Click button") if __name__=="__main__": app=wx.App() frame=AppFrame(None) frame.Show(True) app.MainLoop()
- 灵活布局的解决方案:sizer
2.PyQt
-
import sys from PyQt5 import QtWidgets class AppWidget(QtWidgets.QWidget): def __init__(self): super().__init__() self.setWindowTitle("Hello Qt Window") self.outputArea=QtWidgets.QTextBrowser() self.AppButton=QtWidgets.QPushButton("click me") self.layout=QtWidgets.QVBoxLayout() self.layout.addWidget(self.outputArea) self.layout.addWidget(self.AppButton) self.setLayout(self.layout) self.AppButton.clicked.connect(self.showText) def showText(self): self.outputArea.append("hello click!") if __name__=="__main__": app=QtWidgets.QApplication(sys.argv) appWidget=AppWidget() appWidget.show() sys.exit(app.exec_())
3.Tkinter
-
import tkinter as tk class AppTk(object): def __init__(self): self.root=tk.Tk() self.text=tk.Text(self.root,width=30,height=10) self.text.pack() self.button=tk.Button(self.root,text="Click me",command=self.showText) self.button.pack() def showText(self): self.text.insert(tk.INSERT,"Hello click!\n") if __name__=="__main__": app=AppTk() app.root.mainloop()