初学者,仅供学习交流
Python学习两周时间了,这是我目前编写的比较满意的一个程序,有以下几个方面的经验总结:
1.布局管理是可视化编程的基础思维,尽量避免定点式布局,不规则分布的各种控件可以局部先用wx.StaticBoxSizer(静态框)水平或垂直组合,再横向或纵向上与其他控件组合并,利用布局管理的内置参数设置,灵活控制想要的显示效果。需要说明的是,在wxpython里布局管理器不是容器,而是通过它对加入其中的控件进行自适应管理。
2.控件的动态管理问题。这里说的动态不是动画效果,而是不同操作对控件组Show(False)(不可见)和Show(True)(可见)的整体控制。例如学生信息管理系统里有4个按钮,分别控制:查询学生信息、添加学生信息、删除学生信息和退出系统的操作,虽然功能看上去很简单,但每个按钮所调用的控件数也不少,而且在面板布局上是有重叠的。刚开始我的思路是,在父面板上把所有需要的控件都做出来,初始化都设置成Show(False),当调用某个按钮操作时,再Show(True)对应的控件组,如此反复。这样的代码显得特别臃肿繁琐,而且Python程序是由上至下一条条指令运行的,控件显示和消失是有先后顺序的,屏幕分辨率高的话肉眼都能看到控件波浪式消失再现的效果,这个问题目前我查阅的资料里没有找到有效的解决办法。我最终的解决办法是:用类函数嵌套调用跳转同时关闭自己(self.Close()),实现所属控件组随父面板一并关闭,再整体开启新面板及其控件,有点像接龙。说得可能有点抽象,大家可以看下面的具体代码,这种方法也许我还是首创(幻想中…)。用这种方法居然还能自己调用自己再把自己关闭,实现自我刷新,在代码中定义删除学生信息类里有所体现。当时仅仅是按照设计思路抱着尝试一下的心态,居然可行,真是意外的收获。
3.类的继承是一个效率很高的方法,还是拿学生信息管理系统为例,系统操作界面上有多个控件是固定不变的,利用第二点经验里说的方法,免不了会重复构建一些常态控件。用类继承的方法可以大大的压缩代码量,提高开发效率。需要强调的是,做类的继承父类操作时,必须加上super(B,self).init(*args, **kw),确保B的父类被调用(工作原理:首先找到B的父类(比如是类A),然后把类B的对象self转换为类A的对象,然后“被转换”的类A对象调用自己的__init__函数),不然你会发现在想调用父类的对象和方法时,系统会报对象或方法未定义的错误。(*args, **kw)是python中的可变参数。(*args)表示任何多个无名参数,它是一个tuple;(**kw)表示关键字参数,它是一个dict。并且同时使用(*args)和(**kw)时,必须(*args)参数列要在(**kw)前。
第二、三条是学生信息管理系统开发的核心编程思维。
好了,以上是我的一些粗浅认识,感觉很多都是废话,但作为初学者来说,每一次实践的总结都是自我提升的过程。下面进入主题:
一、建数据库
过程就不说了,直接附上我导出的数据:
-- MySQL dump 10.16 Distrib 10.1.35-MariaDB, for Win32 (AMD64)
--
-- Host: localhost Database: login_users
-- ------------------------------------------------------
-- Server version 10.1.35-MariaDB
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Current Database: `login_users`
--
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `login_users` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `login_users`;
--
-- Table structure for table `stu_info`
--
DROP TABLE IF EXISTS `stu_info`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `stu_info` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '学生id',
`stu_name` varchar(32) NOT NULL COMMENT '姓名',
`stu_gender` enum('男','女') NOT NULL COMMENT '性别',
`stu_age` tinyint(3) unsigned NOT NULL COMMENT '年龄',
`stu_cid` varchar(32) NOT NULL COMMENT 'CSDN账号',
`stu_classid` varchar(32) NOT NULL COMMENT '学习课程',
`stu_phone` varchar(32) NOT NULL COMMENT '联系方式',
PRIMARY KEY (`id`),
UNIQUE KEY `stu_name` (`stu_name`),
UNIQUE KEY `stu_cid` (`stu_cid`),
UNIQUE KEY `stu_phone` (`stu_phone`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `stu_info`
--
LOCK TABLES `stu_info` WRITE;
/*!40000 ALTER TABLE `stu_info` DISABLE KEYS */;
INSERT INTO `stu_info` VALUES (1,'测试姓名1','男',20,'000001','Python01','测试联系方式1'),(2,'测试姓名2','男',23,'000002','Python02','测试联系方式2'),(3,'测试姓名3','女',21,'000003','Python03','测试联系方式3'),(4,'测试姓名4','男',28,'000004','php01','测试联系方式4'),(5,'测试姓名5','男',30,'000005','php02','测试联系方式5'),(6,'测试姓名6','女',25,'000006','php03','测试联系方式6'),(7,'测试姓名7','男',35,'000007','JavaScript01','测试联系方式7'),(8,'测试姓名8','男',31,'000008','JavaScript02','测试联系方式8'),(9,'测试姓名9','女',26,'000009','JavaScript03','测试联系方式9'),(10,'测试姓名10','男',24,'000010','SQL01','测试联系方式10');
/*!40000 ALTER TABLE `stu_info` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `users`
--
DROP TABLE IF EXISTS `users`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `users` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户id',
`user_name` varchar(32) NOT NULL COMMENT '用户名',
`user_password` varchar(23) NOT NULL COMMENT '登录密码',
PRIMARY KEY (`id`),
UNIQUE KEY `user_name` (`user_name`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `users`
--
LOCK TABLES `users` WRITE;
/*!40000 ALTER TABLE `users` DISABLE KEYS */;
INSERT INTO `users` VALUES (1,'admin','Python09'),(2,'momobaba','123456');
/*!40000 ALTER TABLE `users` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIM