实例1: 对输入的所有数字求和, 最后以. 结束输入
def fun(): list1=[] print('input a number:') while True: num=input() if num=='.': break list1.append(eval(num)) sum1=sum(list1) return sum1
程序简单, 但是输入输出不友好, 怎么做一个友好界面? GUI
GUI的设计需要用到面向对象设计
以按钮(button)为例, quit按钮有很多属性, 包括label(按钮文字), size, pos,font....
方法也很多, 包括setlabel(设置按钮的文字), setdefualt, enable(把按钮设置为可以操作的状态)..
实例: 创建一个简单的wxpython程序
import wxapp=wx.App() #创建一个应用程序对象frame=wx.Frame(None,title='hello world!') # 创建一个frame对象# frame是GUI组件的容器, 没有就无法显式GUI了frame.Show(True) # 显示窗体app.MainLoop() # 必须写, 否则没有响应
得到一个窗体, 名字为hello,world!
上述程序也可以改写为:
import wxclass myapp(wx.App): def Oninit(self): # 在事件一开始Mainloop就会被调用 frame=wx.Frame(None,title='hello,world!') frame.Show() return Trueif __name__=='__main__': app=myapp() 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
实例
del appimport wxclass frame1(wx.Frame): def __init__(self,superior): wx.Frame.__init__(self,parent=superior,title='Example', pos=(100,200),size=(350,200)) panel=wx.Panel(self) # 新增文本输入框的位置, 文字内容 text1=wx.TextCtrl(panel,value='hello,world!',size=(350,200))if __name__=='__main__': app=wx.App() frame=frame1(None) frame.Show(True) app.MainLoop()
TextControl 的父窗口是Panel, panel 的父窗口是frame
提示:在Anaconda中运行程序如果出现“PyNoAppError: The wx.App object must be created first!”这样的错误,请在Python Shell中执行del app即可!
事件处理: event handling
事件: 移动鼠标Onmove() , 按下左键, 单击按钮等...
del appimport wxclass frame1(wx.Frame): def __init__(self,superior): wx.Frame.__init__(self,parent=superior,title='Example', pos=(100,200),size=(350,200)) self.panel=wx.Panel(self) # 新增文本输入框的位置, 文字内容 self.panel.Bind(wx.EVT_LEFT_UP,self.OnClick) # 将鼠标左键抬起事件绑定到 OnClick子类, 当左键抬起, OnClick方法就会被调用 def OnClick(self,event): posm=event.GetPosition() # 获得鼠标单击的位置 wx.StaticText(parent=self.panel,label='hello, world!',pos=(posm.x,posm.y)) # 在鼠标单击的位置放置静态文本控件hello worldif __name__=='__main__': app=wx.App() frame=frame1(None) frame.Show(True) app.MainLoop()