#python day12
1 首先通过pip安装wxPython
快捷键Ctrl+R,输入cmd,然后编写以下命令行:
pip install -U wxPython
2 创建一个wx.app的子类
import wx
#导入wxpython
class App(wx.App): #继承父类wx.App
def OnInit(self):
frame =wx.Frame(parent = None,title = 'HelloWorld') #创建窗口
frame.Show() #显示窗口
return True #返回值
if __name__ == '__main__':
app = App() #实例化子类
app.MainLoop() #调用主循环方法
3 使用wx.Frame框架
import wx #导入wxpython模块
class MyFrame(wx.Frame): #创建一个子类继承父类
def __init__(self,parent,id):
wx.Frame.__init__(self,parent,id,title = '创建frame',pos = (100,100),size = (300,300)) #调用父类构造方法
if __name__ == '__main__':
app = wx.App() #初始化应用
frame = MyFrame(parent = None,id = -1) #实现Myframe类,并传递参数
frame.Show() #显示窗口
app.MainLoop() #调用主循环方法
在以上代码中,在主程序中调用MyFrame类,并且传递两个参数。在MyFrame类中,自动执行__init__()初始化方法,接收参数。然后调用父类wx.Frame的__init__()初始化方法,设置顶级窗口的相关属性。运行截图如下:
4 StaticText文本类控件
实例01 使用wx.StaticText输出python之禅
import wx #导入wxpython模块
class MyFrame(wx.Frame):
def __init__(self,parent,id):
wx.Frame.__init__(self,parent,id, title = '创建statictext类',pos = (100,100),size = (600,400))
panel = wx.Panel(self) #创建画板
title = wx.StaticText(panel,label = 'The Zen of Python, by Tim Peters',pos = (100,20))
wx.StaticText(panel, label = 'Beautiful is better than ugly.',pos = (50,50))
wx.StaticText(panel, label='Explicit is better than implicit.', pos=(50, 70))
wx.StaticText(panel, label='Simple is better than complex.', pos=(50, 90))
wx.StaticText(panel, label='Complex is better than complicated.', pos=(50, 110))
wx.StaticText(panel, label='Flat is better than nested.', pos=(50, 130))
wx.StaticText(panel, label='Sparse is better than dense.', pos=(50, 150))
wx.StaticText(panel, label='Readability counts.', pos=(50, 170))
wx.StaticText(panel, label='Special cases arent special enough to break the rules.', pos=(50, 190))
wx.StaticText(panel, label='Although practicality beats purity.', pos=(50, 210))
wx.StaticText(panel, label='Errors should never pass silently.', pos=(50, 230))
wx.StaticText(panel, label='Unless explicitly silenced.', pos=(50, 250))
wx.StaticText(panel, label='In the face of ambiguity, refuse the temptation to guess.', pos=(50, 270))
wx.StaticText(panel, label='There should be one-- and preferably only one --obvious way to do it.', pos=(50, 290))
wx.StaticText(panel, label='Although that way may not be obvious at first unless you are Dutch.', pos=(50, 310))
wx.StaticText(panel, label='Now is better than never.', pos=(50, 330))
if __name__ == '__main__':
app = wx.App()
frame = MyFrame(parent=None, id=-1)
frame.Show()
app.MainLoop()
5 TextCtrl输入文本类控件
实例02 使用wx.TextCtrl实现登陆界面
import wx #导入wxpython模块
class MyFrame(wx.Frame): #创建一个子类继承父类
def __init__(self,parent,id):
wx.Frame.__init__(self,parent,id,title = '创建textctrl类',size = (400,300)) #调用父类构造方法
panel = wx.Panel(self)
self.title = wx.StaticText(panel,label = '请输入用户名和密码',pos = (140,20))
self.label_user = wx.StaticText(panel,label = '用户名:',pos = (50,50))
self.text_user = wx.TextCtrl(panel, pos = (100,50), size = (235,25),style =wx.TE_LEFT)
self.label_pwd = wx.StaticText(panel, label='密码:', pos=(50, 90))
self.text_password = wx.TextCtrl(panel, pos=(100, 90), size=(235, 25), style=wx.TE_PASSWORD)
if __name__ == '__main__':
app = wx.App() #初始化应用
frame = MyFrame(parent = None,id = -1) #实现Myframe类,并传递参数
frame.Show() #显示窗口
app.MainLoop() #调用主循环方法
6 Button按钮类控件
实例03 为登陆界面添加‘确认’和‘取消’
import wx #导入wxpython模块
class MyFrame(wx.Frame): #创建一个子类继承父类
def __init__(self,parent,id):
wx.Frame.__init__(self,parent,id,title = '创建textctrl类',size = (400,300)) #调用父类构造方法
panel = wx.Panel(self)
self.title = wx.StaticText(panel,label = '请输入用户名和密码',pos = (140,20))
self.label_user = wx.StaticText(panel,label = '用户名:',pos = (50,50))
self.text_user = wx.TextCtrl(panel, pos = (100,50), size = (235,25),style =wx.TE_LEFT)
self.label_pwd = wx.StaticText(panel, label='密码:', pos=(50, 90))
self.text_password = wx.TextCtrl(panel, pos=(100, 90), size=(235, 25), style=wx.TE_PASSWORD)
self.bt_confirm = wx.Button(panel,label = '确定',pos = (105,130))
self.bt_cancel = wx.Button(panel, label='取消', pos=(195, 130))
if __name__ == '__main__':
app = wx.App() #初始化应用
frame = MyFrame(parent = None,id = -1) #实现Myframe类,并传递参数
frame.Show() #显示窗口
app.MainLoop() #调用主循环方法
7 使用BoxSizer布局
BoxSizer是在一条水平或垂直线上的窗口部件的布局。具体在这里就不赘述了,有兴趣的读者可以自行查一下。
import wx #导入wxpython模块
class MyFrame(wx.Frame): #创建一个子类继承父类
def __init__(self,parent,id):
wx.Frame.__init__(self,parent,id,title = '创建boxsizer',size = (400,300)) #调用父类构造方法
panel = wx.Panel(self)
self.title = wx.StaticText(panel,label = '请输入用户名和密码') #创建文本框
self.label_user = wx.StaticText(panel,label = '用户名:') #创建用户名文本框
self.text_user = wx.TextCtrl(panel, style =wx.TE_LEFT) #创建用户名输入框
self.label_pwd = wx.StaticText(panel, label='密 码:') #创建密码文本框
self.text_password = wx.TextCtrl(panel, style=wx.TE_PASSWORD) #创建密码输入框
self.bt_confirm = wx.Button(panel,label = '确定') #创建确定按钮
self.bt_cancel = wx.Button(panel, label='取消',) #创建取消按钮
#添加容器,将容器中控件横向排列
hsizer_user = wx.BoxSizer(wx.HORIZONTAL) #HORIZONTAL是横向排列,每创建一个容器,容器中控件为一组
hsizer_user.Add(self.label_user,proportion = 0,flag = wx.ALL,border =5)
hsizer_user.Add(self.text_user, proportion=1, flag=wx.ALL, border=5)
hsizer_pwd = wx.BoxSizer(wx.HORIZONTAL)
hsizer_pwd.Add(self.label_pwd, proportion=0, flag=wx.ALL, border=5)
hsizer_pwd.Add(self.text_password, proportion=1, flag=wx.ALL, border=5)
hsizer_button = wx.BoxSizer(wx.HORIZONTAL)
hsizer_button.Add(self.bt_confirm, proportion=0, flag=wx.ALIGN_CENTER, border=5)
hsizer_button.Add(self.bt_cancel, proportion=1, flag=wx.ALIGN_CENTER, border=5)
##添加容器,将所有控件纵向排列
vsizer_all = wx.BoxSizer(wx.VERTICAL)
vsizer_all.Add(self.title, proportion=0, flag=wx.BOTTOM| wx.TOP| wx.ALIGN_CENTER, border=15)
vsizer_all.Add(hsizer_user, proportion=0, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=45)
vsizer_all.Add(hsizer_pwd, proportion=0, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=45)
vsizer_all.Add(hsizer_button, proportion=0, flag=wx.ALIGN_CENTER | wx.TOP , border=15)
panel.SetSizer(vsizer_all)
if __name__ == '__main__':
app = wx.App() #初始化应用
frame = MyFrame(parent = None,id = -1) #实现Myframe类,并传递参数
frame.Show() #显示窗口
app.MainLoop() #调用主循环方法
这次登录界面随着窗口放大缩小而改变,笔者认为在平时的使用中,使用BoxSizer布局会更加美观,当然也可以选择其他布局。
8 使用事件判断用户登录
什么是事件?用户执行的动作就叫事件,如果说单击按钮就是一个简单事件。
bt_confirm.Bind(wx.EVT_BUTTON,OnclickSubmit)
#wx.EVT_BUTTON:事件类型为按钮类型。wx.EVT_开头的都是事件类型。
#OnclickSubmit:方法名。事件发生时执行该方法。
import wx #导入wxpython模块
class MyFrame(wx.Frame): #创建一个子类继承父类
def __init__(self,parent,id):
wx.Frame.__init__(self,parent,id,title = '创建boxsizer',size = (400,300)) #调用父类构造方法
panel = wx.Panel(self)
self.title = wx.StaticText(panel,label = '请输入用户名和密码') #创建文本框
self.label_user = wx.StaticText(panel,label = '用户名:') #创建用户名文本框
self.text_user = wx.TextCtrl(panel, style =wx.TE_LEFT) #创建用户名输入框
self.label_pwd = wx.StaticText(panel, label='密 码:') #创建密码文本框
self.text_password = wx.TextCtrl(panel, style=wx.TE_PASSWORD) #创建密码输入框
self.bt_confirm = wx.Button(panel,label = '确定') #创建确定按钮
self.bt_confirm.Bind(wx.EVT_BUTTON,self.OnclickSubmit) #绑定事件
self.bt_cancel = wx.Button(panel, label='取消',) #创建取消按钮
self.bt_cancel.Bind(wx.EVT_BUTTON, self.OnclickCancel) #绑定事件
#添加容器,将容器中控件横向排列
hsizer_user = wx.BoxSizer(wx.HORIZONTAL) #HORIZONTAL是横向排列,每创建一个容器,容器中控件为一组
hsizer_user.Add(self.label_user,proportion = 0,flag = wx.ALL,border =5)
hsizer_user.Add(self.text_user, proportion=1, flag=wx.ALL, border=5)
hsizer_pwd = wx.BoxSizer(wx.HORIZONTAL)
hsizer_pwd.Add(self.label_pwd, proportion=0, flag=wx.ALL, border=5)
hsizer_pwd.Add(self.text_password, proportion=1, flag=wx.ALL, border=5)
hsizer_button = wx.BoxSizer(wx.HORIZONTAL)
hsizer_button.Add(self.bt_confirm, proportion=0, flag=wx.ALIGN_CENTER, border=5)
hsizer_button.Add(self.bt_cancel, proportion=1, flag=wx.ALIGN_CENTER, border=5)
##添加容器,将所有控件纵向排列
vsizer_all = wx.BoxSizer(wx.VERTICAL)
vsizer_all.Add(self.title, proportion=0, flag=wx.BOTTOM| wx.TOP| wx.ALIGN_CENTER, border=15)
vsizer_all.Add(hsizer_user, proportion=0, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=45)
vsizer_all.Add(hsizer_pwd, proportion=0, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=45)
vsizer_all.Add(hsizer_button, proportion=0, flag=wx.ALIGN_CENTER | wx.TOP , border=15)
panel.SetSizer(vsizer_all)
#事件发生要执行的方法
def OnclickSubmit(self,event):
message = ''
username = self.text_user.GetValue()
password = self.text_password.GetValue()
if username == '' or password == '' :
message = '用户名或密码不能为空'
elif username == 'muxing' and password == '123456' :
message = '登陆成功'
else:
message = '用户名和密码不匹配'
wx.MessageBox(message)
#单击取消按钮执行方法
def OnclickCancel(self,event):
self.text_user.SetValue('')
self.text_password.SetValue('')
if __name__ == '__main__':
app = wx.App() #初始化应用
frame = MyFrame(parent = None,id = -1) #实现Myframe类,并传递参数
frame.Show() #显示窗口
app.MainLoop() #调用主循环方法