python实验报告(第12章)
实验12:GUI界面编程
一、实验目的和要求
1、学会应用常用控件;
2、学会使用BoxSizer布局;
3、学会事件处理。
二、实验环境
软件版本:Python 3.10 64_bit
三、实验过程
1、实例1:使用wx.StaticText输出Python之禅
(1)使用StaticText类输出中文版的Python之禅。具体代码如下:

1 #_*-coding:utf-8 _*_
2 import wx
3 class MyFrame(wx.Frame):
4 def __init__(self,parent,id):
5 wx.Frame.__init__(self, parent, id,title="创建StaticText类",
6 pos=(100,100),size=(600,400))
7 # 创建画板
8 panel = wx.Panel(self)
9 # 创建标题,并设置字体
10 title =wx.StaticText(panel,label = "Python之禅-Tim Peters",pos=(100,20))
11 font =wx.Font(16,wx.DEFAULT,wx.FONTSTYLE_NORMAL,wx.NORMAL)
12 title.SetFont(font)
13 # 创建文本
14 wx.StaticText(panel,label="优美胜于丑陋",pos=(50,50))
15 wx.StaticText(panel,label="明了胜于晦涩",pos=(50,70))
16 wx.StaticText(panel,label="简洁胜于复杂",pos=(50,90))
17 wx.StaticText(panel,label="复杂胜于凌乱",pos=(50,110))
18 wx.StaticText(panel,label="扁平胜于嵌套",pos=(50,130))
19 wx.StaticText(panel,label="间隔胜于紧凑",pos=(50,150))
20 wx.StaticText(panel,label="可读性很重要",pos=(50,170))
21 wx.StaticText(panel,label="即便假借特例的实用性之名,也不可违背这些规则",pos=(50,190))
22 wx.StaticText(panel,label="不要包容所有错误,除非你确定需要这样做",pos=(50,210))
23 wx.StaticText(panel,label="当存在多种可能,不要尝试去猜测",pos=(50,230))
24 wx.StaticText(panel,label="而是尽量找一种,最好是唯一一种明显的解决方案",pos=(50,250))
25 wx.StaticText(panel,label="虽然这并不容易,因为你不是 Python 之父",pos=(50,270))
26 wx.StaticText(panel,label="做也许好过不做,但不假思索就动手还不如不做",pos=(50,290))
27 wx.StaticText(panel,label="如果你无法向人描述你的方案,那肯定不是一个好方案: 反之亦然",pos=(50,310))
28 wx.StaticText(panel,label="命名空间是一种绝妙的理念,我们应当多加利用",pos=(50,330))
29
30 if __name__ == "__main__":
31 app = wx.App() # 初始化应用
32 frame = MyFrame(parent=None,id=-1) # 实例MyFrame类,并传递参数
33 frame.Show() # 显示窗口
34 app.MainLoop() # 调用主循环方法

(2)运行结果如图所示:

2、实例2:使用wx.TextCtrl实现登录界面
(1)使用wx.TextCtrl类和wx.StaticText类实现一个包含用户名和密码的登录界面。具体代码如下:

1 #_*-coding:utf-8 _*_
2 import wx
3 class MyFrame(wx.Frame):
4 def __init__(self,parent,id):
5 wx.Frame.__init__(self,parent,id,title="创建TextCtrl",size=(400,300))
6 # 创建面板
7 panel=wx.Panel(self)
8 # 创建文本和密码输入框
9 self.title = wx.StaticText(panel,label="输入用户名和密码",pos=(140,20))
10 self.label_user = wx.StaticText(panel,label="用户名:",pos=(50,50))
11 self.text_user = wx.TextCtrl(panel,pos=(100,50),size=(235,25),style=wx.TE_LEFT)
12 self.label_user = wx.StaticText(panel,pos=(50, 90),label="密 码:")
13 self.text_password = wx.TextCtrl(panel,pos=(100, 90),size=(235, 25),style=wx.TE_PASSWORD)
14
15 if __name__ == "__main__":
16 app = wx.App() # 初始化应用
17 frame = MyFrame(parent=None,id=-1) # 实例MyFrame类,并传递参数
18 frame.Show() # 显示窗口
19 app.MainLoop() # 调用主循环方法

(2)运行结果如图所示:

3、实例3:为登录界面添加“确定”和“取消”按钮
(1)使用wx.Button,在实例2的基础上添加“确定”和“取消”按钮。具体代码如下:

1 #_*-coding:utf-8 _*_
2 import wx
3 class MyFrame(wx.Frame):
4 def __init__(self,parent,id):
5 wx.Frame.__init__(self,parent,id,title="创建TextCtrl类",size=(400,300))
6 # 创建面板
7 panel = wx.Panel(self)
8 # 创建文本和密码输入框
9 self.title = wx.StaticText(panel,label="输入用户名和密码",pos=(140,20))
10 self.label_user = wx.StaticText(panel,label="用户名:",pos=(50,50))
11 self.text_user = wx.TextCtrl(panel,pos=(100,50),size=(235,25),style=wx.TE_LEFT)
12 self.label_user = wx.StaticText(panel,pos=(50, 90),label="密 码:")
13 self.text_password = wx.TextCtrl(panel,pos=(100, 90),size=(235, 25),style=wx.TE_PASSWORD)
14 # 创建“确定”和“取消”按钮
15 self.bt_confirm = wx.Button(panel,label="确定",pos=(105,130))
16 self.bt_cancel = wx.Button(panel,label="取消",pos=(195,130))
17
18 if __name__ == "__main__":
19 app = wx.App() # 初始化
20 frame = MyFrame(parent=None,id=-1) # 实例MyFrame类,并传递参数
21 frame.Show() # 显示窗口
22 app.MainLoop() # 调用主循环方法

(2)运行结果如图所示:

4、实例4:使用BoxSizer设置登录界面布局
(1)使用BoxSizer布局方式,实现实例3的界面布局效果。具体代码如下:

1 # _*-coding;utf-8 _*.
2 import wx
3 class MyFrame(wx.Frame):
4 def __init__(self,parent,id):
5 wx.Frame.__init__(self,parent,id,"用户登录",size=(400,300))
6 # 创建面板
7 panel = wx.Panel(self)
8 # 创建“确定”和“取消”按钮,并绑定事件
9 self.bt_confirm = wx.Button(panel,label="确定")
10 self.bt_cancel = wx.Button(panel,label="取消")
11 # 创建文本,左对齐
12 self.title = wx.StaticText(panel,label="请输入用户名和密码")
13 self.label_user = wx.StaticText(panel,label="用户名:")
14 self.text_user = wx.TextCtrl(panel,style=wx.TE_LEFT)
15 self.label_pwd = wx.StaticText(panel,label="密 码:")
16 self.text_password = wx.TextCtrl(panel,style=wx.TE_PASSWORD)
17 # 添加容器,容器中控件横向排列
18 hsizer_user = wx.BoxSizer(wx.HORIZONTAL)
19 hsizer_user.Add(self.label_user,proportion=0,flag=wx.ALL,border=5)
20 hsizer_user.Add(self.text_user,proportion=1,flag=wx.ALL,border=5)
21 hsizer_pwd = wx.BoxSizer(wx.HORIZONTAL)
22 hsizer_pwd.Add(self.label_pwd,proportion=0,flag=wx.ALL,border=5)
23 hsizer_pwd.Add(self.text_password,proportion=1,flag=wx.ALL,border=5)
24 hsizer_button = wx.BoxSizer(wx.HORIZONTAL)
25 hsizer_button.Add(self.bt_confirm,proportion=0,flag=wx.ALIGN_CENTER,border=5)
26 hsizer_button.Add(self.bt_cancel,proportion=0,flag=wx.ALIGN_CENTER,border=5)
27 #添加容器,容器中的控件纵向排列
28 vsizer_all = wx.BoxSizer(wx.VERTICAL)
29 vsizer_all.Add(self.title,proportion=0,flag=wx.BOTTOM | wx.TOP | wx.ALIGN_CENTER,
30 border=15)
31 vsizer_all.Add(hsizer_user,proportion=0,flag=wx.EXPAND | wx.LEFT | wx.RIGHT,border=45)
32 vsizer_all.Add(hsizer_pwd,proportion=0,flag=wx.EXPAND| wx.LEFT | wx.RIGHT,border=45)
33 vsizer_all.Add(hsizer_button,proportion=0,flag=wx.ALIGN_CENTER | wx.TOP,border=15)
34 panel.SetSizer(vsizer_all)
35
36 if __name__ == "__main__":
37 app = wx.App() # 初始化
38 frame =MyFrame(parent=None,id=-1) # 实例化MyFrame类,并传递参数
39 frame.Show() # 显示窗口
40 app.MainLoop() # 调用主循环方法

(2)运行结果如图所示:

5、实例5:使用事件判断用户登录
(1)在实例 04 的基础上,分别为“确定”和“取消”按钮添加单击事件。当用户输入用户名和密码后,单击“确定”按钮,如果输入的用户名为“mr”,并且密码为“mrsoft”,则弹出对话框提示“登录成功”否则提示“用户名和密码不匹配”。当用户单击“取消”按钮时,清空用户输入的用户名和密码。具体代码如下:

1 # _*_coding:utf-8 _*_
2 import wx
3 class MyFrame(wx.Frame):
4 def __init__ (self,parent,id):
5 wx.Frame.__init__(self,parent,id,"用户登录",size=(400,300))
6 # 创建面板
7 panel = wx.Panel(self)
8
9 # 创建“确定”和“取消”按钮,并绑定事件
10 self.bt_confirm = wx.Button(panel,label="确定")
11 self.bt_confirm.Bind(wx.EVT_BUTTON,self.OnclickSubmit)
12 self.bt_cancel = wx.Button(panel,label="取消")
13 self.bt_cancel.Bind(wx.EVT_BUTTON,self.OnclickCancel)
14 # 创建文本,左对齐
15 self.title = wx.StaticText(panel,label="请输入用户名和密码")
16 self.label_user = wx.StaticText(panel,label="用户名:")
17 self.text_user = wx.TextCtrl(panel,style=wx.TE_LEFT)
18 self.label_pwd = wx.StaticText(panel,label="密 码:")
19 self.text_password = wx.TextCtrl(panel,style=wx.TE_PASSWORD)
20 # 添加容器,容器中控件横向排列
21 hsizer_user = wx.BoxSizer(wx.HORIZONTAL)
22 hsizer_user.Add(self.label_user,proportion=0,flag=wx.ALL,border=5)
23 hsizer_user.Add(self.text_user,proportion=1,flag=wx.ALL,border=5)
24 hsizer_pwd = wx.BoxSizer(wx.HORIZONTAL)
25 hsizer_pwd.Add(self.label_pwd,proportion=0,flag=wx.ALL,border=5)
26 hsizer_pwd.Add(self.text_password,proportion=1,flag=wx.ALL,border=5)
27 hsizer_button = wx.BoxSizer(wx.HORIZONTAL)
28 hsizer_button.Add(self.bt_confirm,proportion=0,flag=wx.ALIGN_CENTER,border=5)
29 hsizer_button.Add(self.bt_cancel,proportion=0,flag=wx.ALIGN_CENTER,border=5)
30 #添加容器,容器中的控件纵向排列
31 vsizer_all = wx.BoxSizer(wx.VERTICAL)
32 vsizer_all.Add(self.title,proportion=0,flag=wx.BOTTOM | wx.TOP | wx.ALIGN_CENTER,
33 border=15)
34 vsizer_all.Add(hsizer_user,proportion=0,flag=wx.EXPAND | wx.LEFT | wx.RIGHT,border=45)
35 vsizer_all.Add(hsizer_pwd,proportion=0,flag=wx.EXPAND| wx.LEFT | wx.RIGHT,border=45)
36 vsizer_all.Add(hsizer_button,proportion=0,flag=wx.ALIGN_CENTER | wx.TOP,border=15)
37 panel.SetSizer(vsizer_all)
38
39 def OnclickSubmit(self,event):
40 """单击确定按钮,执行方法"""
41 message =""
42 username = self.text_user.GetValue() # 获取输入的用户名
43 password = self.text_password.GetValue() # 获取输入的密码
44 if username =="" or password =="" : # 判断用户名或密码是否为空
45 message ="用户名或密码不能为空"
46 elif username =="mr" and password =="mrsoft": # 用户名和密码正确
47 message ="登录成功"
48 else:
49 message ="用户名和密码不匹配" # 用户名或密码错误
50 wx.MessageBox(message) # 弹出提示框
51
52 def OnclickCancel(self,event):
53 """单击取消按钮,执行方法"""
54 self.text_user.SetValue("") # 清空输入的用户名
55 self.text_password.SetValue("") # 清空输入的密码
56
57 if __name__ == "__main__":
58 app = wx.App() # 初始化应用
59 frame = MyFrame(parent=None,id=-1) # 实例MyFrame类,并传递参数
60 frame.Show() # 显示窗口
61 app.MainLoop() # 调用主循环方法

(2)运行结果如图所示:



python实验报告(第12章)的更多相关文章
- Python实验报告——第4章 序列的应用
实验报告 [实验目的] 1.掌握python中序列及序列的常用操作. 2.根据实际需要选择使用合适的序列类型. [实验条件] 1.PC机或者远程编程环境. [实验内容] 1.完成第四章 序列的应用 实 ...
- Python实验报告——第3章 流程控制语句
实验报告 [实验目的] 1.掌握python中流程控制语句的使用,并能够应用到实际开发中. [实验条件] 1.PC机或者远程编程环境 [实验内容] 1.完成第三章流程控制语句实例01-09,实战一到实 ...
- Python实验报告——第2章 Python语言基础
实验报告 [实验目的] 1.熟悉在线编程平台. 2.掌握基本的 python 程序编写.编译与运行程序的方法. [实验条件] 1.PC机或者远程编程环境 [实验内容] 1.完成第二章实例01-07,实 ...
- Python for Infomatics 第12章 网络编程一(译)
注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 本书中的许多例子关注的是读取文件 ...
- python实验报告(第五周)
一.实验目的和要求 学会使用字符串的常用操作方法和正确应用正则表达式. 二.实验环境 软件版本:Python 3.10 64_bit 三.实验过程 1.实例1:使用字符串拼接输出一个关于程序员的笑话 ...
- Python实验报告(第四周
一.实验目的和要求 学会应用列表.元组.字典等序列: 二.实验环境 软件版本:Python 3.10 64_bit 三.实验过程 1.实例1:输出每日一贴 (1)在IDLE中创建一个名称为tips.p ...
- Python for Infomatics 第12章 网络编程六(译)
注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 12.9 词汇表 Beautif ...
- Python for Infomatics 第12章 网络编程五(译)
注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 12.8 用urllib读取二进 ...
- Python for Infomatics 第12章 网络编程四(译)
注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 12.7 用BeautifulS ...
- Python for Infomatics 第12章 网络编程三(译)
注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 12.5 HTML分析和网页抓取 ...
随机推荐
- NAS数据存储之NFS搭建和使用
NFS是主流异构平台的共享文件系统之一,能够支持在不同类型的系统之间通过网络进行文件共享,允许一个系统在网络上与他人共享目录和文件.NFS传输协议用于服务器和客户机之间的文件访问和共享通信,从而使客户 ...
- 看了同事这10个IDEA神级插件,我也悄悄安装了
昨天,有读者私信发我一篇文章,说里面提到的 Intellij IDEA 插件真心不错,基本上可以一站式开发了,希望能分享给更多的小伙伴,我在本地装了体验了一下,觉得确实值得推荐,希望小伙伴们有时间也可 ...
- 如何使用webgl(three.js)实现3D储能,3D储能站,3D智慧储能、储能柜的三维可视化解决方案——第十七课
前言 上节课我们讲了<3D光伏发电>,与之配套的就是能量存储 这节课我们主要讲讲储能,储能站,在分布式能源系统中起到调节用对电的尖峰平谷进行削峰填谷的作用.特别是小型储能站,更加灵活,因地 ...
- perl中sprintf函数的用法
对于某些字符串,需要输入为特定的格式,通过sprintf可以很方便的完成,不需要专门进行其他处理. 转载 perl中sprintf函数的使用方法.
- Prometheus 监测 RocketMQ 最佳实践
本文作者:郭雨杰,阿里云智能技术专家. Prometheus 集成的 50 多款云产品中,RocketMQ 在可观测方面实现了非常完善的功能,是一个特别具有代表性的云产品. 01 RocketMQ如何 ...
- 2022-11-05 Acwing每日一题
本系列所有题目均为Acwing课的内容,发表博客既是为了学习总结,加深自己的印象,同时也是为了以后回过头来看时,不会感叹虚度光阴罢了,因此如果出现错误,欢迎大家能够指出错误,我会认真改正的.同时也希望 ...
- 我的第一个项目(二):使用Vue做一个登录注册界面
好家伙, 顶不住了,太多的bug, 本来是想把背景用canvas做成动态的,但是,出现了各种问题 为了不耽误进度,我们先把一个简单的登录注册界面做出来 来看看效果: (看上去还不错) 本界面使用 ...
- 在业务逻辑中,经常会有父组件调用子组件方法的情况,vue2.0 和 vue3.0 的使用中有些不一样,在这里总结下。
在业务逻辑中,经常会有父组件调用子组件方法的情况,vue2.0 和 vue3.0 的使用中有些不一样,在这里总结下. vue2.0 中的使用方法 父组件: <template> <d ...
- C++快速幂
C++快速幂 快速幂的作用: 当我们做一些高次幂的计算时,就不能直接进行暴力的计算.例如:需要计算2^n 并且n≤10^18.这时候如果我们直接进行暴力的计算,时间复杂度为O ( n ),那么肯定会超 ...
- springboot接收前端传参的几种方式
1.通过HttpServletRequest接收,常用于获取请求头参数以及Cookie,适用于GET 和 POST请求方式,以下两种方式: @GetMapping("/demo1" ...