PythonStudio:国人开发的python窗体IDE,学生管理系统

国人开发的python窗体设计IDE,详情请看:PythonStudio:一款国人写的python及窗口开发编辑IDE,可以替代pyqt designer等设计器了-CSDN博客

这个软件作者还录制了入门的教程,跟着视频做,是个不错的python视频教程呢。从软件的使用,窗体的设计,到python的学习, 对小白来说很友好啊。

最最最主要的,这个软件自带很多皮肤,漂亮的皮肤。

我跟着教程做这个学生信息管理系统,感觉使用它来做python窗口软件程序,真的很方便快捷。

Project1.py

from delphivcl import *
from Unit1 import *

def main():
    Application.Initialize()
    Application.Title = '学生管理系统'
    MainForm = Form1(Application)
    MainForm.Show()
    FreeConsole()
    Application.Run()

if __name__ == '__main__':
    main()

Unit1.py

import os
from delphivcl import *
from Unit2 import *
from Unit3 import *
from Unit4 import *
from Unit5 import *

class Form1(Form):

    def __init__(self, owner):
        self.Button7 = Button(self)
        self.Button6 = Button(self)
        self.Button5 = Button(self)
        self.Button4 = Button(self)
        self.Button3 = Button(self)
        self.Button2 = Button(self)
        self.Button1 = Button(self)
        self.LoadProps(os.path.join(os.path.dirname(os.path.abspath(__file__)), "Unit1.pydfm"))
        self.Button5.OnClick = self.Button5Click
        self.Button4.OnClick = self.Button4Click
        self.Button6.OnClick = self.Button6Click
        self.Button1.OnClick = self.Button1Click
        self.sm = StyleManager()
        self.sm.LoadFromFile("Windows10Malibu.vsf")
        self.sm.SetStyle('Windows10 Malibu')


    def Button1Click(self, Sender):
        frmAdd = Form2(self)
        frmAdd.ShowModal()

    def Button6Click(self, Sender):
        frmSearch = Form3(self)
        frmSearch.ShowModal()

    def Button4Click(self, Sender):
        frmDelete = Form4(self)
        frmDelete.ShowModal()

    def Button5Click(self, Sender):
        frmModify = Form5(self)
        frmModify.ShowModal()

Unit2.py

import os
from delphivcl import *

filename = 'Students.txt'  # 定义学生信息文件

class Form2(Form):

    def __init__(self, owner):
        self.BitBtn3 = BitBtn(self)
        self.BitBtn2 = BitBtn(self)
        self.BitBtn1 = BitBtn(self)
        self.LabeledEdit5 = LabeledEdit(self)
        self.LabeledEdit4 = LabeledEdit(self)
        self.LabeledEdit3 = LabeledEdit(self)
        self.LabeledEdit2 = LabeledEdit(self)
        self.LabeledEdit1 = LabeledEdit(self)
        self.LoadProps(os.path.join(os.path.dirname(os.path.abspath(__file__)), "Unit2.pydfm"))
        self.BitBtn2.OnClick = self.BitBtn2Click
        self.BitBtn1.OnClick = self.BitBtn1Click

    def insert(self):
        '''录入学生信息'''
        studentList = [] # 保存学生信息的列表
        stu_id = self.LabeledEdit1.Text
        if not stu_id: # stu_id 为空
            ShowMessage('ID不能为空!')
            return
        stu_name = self.LabeledEdit2.Text
        if not stu_name:  # stu_name 为空
            ShowMessage('姓名不能为空!')
            return
        try:
            english = int(self.LabeledEdit3.Text)
            jsj = int(self.LabeledEdit4.Text)
            stu_math = int(self.LabeledEdit5.Text)
        except:
            ShowMessage('成绩应该是数值!')
            return
        student = {
            'id':stu_id,
            'name':stu_name,
            'english':english,
            'jsj':jsj,
            'math':stu_math,
        }
        studentList.append(student)
        # 保存到文件里
        self.fileSave(studentList)
        ShowMessage('学生信息录入完成')

    def fileSave(self,student):
        '''将学生信息保存到文件'''
        try:
            stu_file = open(filename,'a')
        except Exception as e:
            stu_file = open(filename,'w') # 文件不存在就创建
        for info in student:
            stu_file.write(str(info)+'\n') # 按行存储
        stu_file.close()


    def BitBtn1Click(self, Sender):
        self.insert()



    def BitBtn2Click(self, Sender):
        self.LabeledEdit1.Clear()
        self.LabeledEdit2.Clear()
        self.LabeledEdit3.Clear()
        self.LabeledEdit4.Clear()
        self.LabeledEdit5.Clear()

Unit3.py

import os
from delphivcl import *
filename = 'Students.txt'  # 定义学生信息文件

class Form3(Form):

    def __init__(self, owner):
        self.Button2 = Button(self)
        self.Button1 = Button(self)
        self.Edit1 = Edit(self)
        self.Memo1 = Memo(self)
        self.RadioGroup1 = RadioGroup(self)
        self.LoadProps(os.path.join(os.path.dirname(os.path.abspath(__file__)), "Unit3.pydfm"))
        self.Button2.OnClick = self.Button2Click
        self.Button1.OnClick = self.Button1Click

    def search(self):
        '''查找学生信息'''
        student_query = []
        stu_id = ""
        stu_name=""
        if os.path.exists(filename):
            mode = self.RadioGroup1.ItemIndex
            if mode == 0:
                stu_id = self.Edit1.Text
            elif mode == 1:
                stu_name = self.Edit1.Text
            else:
                ShowMessage('输入不能为空!')
                return
            with open(filename,'r') as file: # 打开文件
                student = file.readlines() # 读取所有行
                for list in student:
                    dic = dict(eval(list))  # 字符串转换成字典
                    if stu_id is not "":  # id 不为空
                        if dic['id']==stu_id:
                            student_query.append(dic)  # 将找到的学生信息保存到列表

                    elif stu_name is not "": # name 不为空
                        if dic['name']==stu_name:
                            student_query.append(dic)
            # 使用函数显示查询结果
            self.show_student(student_query)
            student_query.clear() # 清空列表
        else:
            # 文件不存在
            ShowMessage('数据信息未保存!!')

    def show_student(self,studentList):
        '''将保存在列表的学生信息显示出来'''
        if not studentList:
            self.Memo1.Lines.Add('无数据显示')
            return
        # 使用空格,显示的更整齐
        format_title = "{:^4}\t{:^4}\t{:^4}\t{:^6}\t{:^10}\t{:^10}"
        count = self.Memo1.Lines.Count
        if count < 2 :
            self.Memo1.Lines.Add(format_title.format("ID","姓名","英语","计算机","数学","总成绩"))
        for info in studentList:
            self.Memo1.Lines.Add(format_title.format(
            info.get('id'),info.get('name'),
            str(info.get('english')).center(5),str(info.get('jsj')).center(10),str(info.get('math')).center(12),
            str(info.get('english')+info.get('jsj')+info.get('math')).center(12),
            ))


    def Button1Click(self, Sender):
        self.search()

    def Button2Click(self, Sender):
        self.RadioGroup1.ItemIndex=-1
        self.Edit1.Clear()
        self.Memo1.Clear()

Unit4.py

import os
from delphivcl import *
filename = 'Students.txt'  # 定义学生信息文件

class Form4(Form):

    def __init__(self, owner):
        self.Button2 = Button(self)
        self.Button1 = Button(self)
        self.LabeledEdit1 = LabeledEdit(self)
        self.LoadProps(os.path.join(os.path.dirname(os.path.abspath(__file__)), "Unit4.pydfm"))
        self.Button2.OnClick = self.Button2Click
        self.Memo1 = Memo(self)
        self.RadioGroup1 = RadioGroup(self)

    def delete(self):
        '''删除学生信息'''
        stu_id = self.LabeledEdit1.Text
        if stu_id is not "": # 输入不为空
            if os.path.exists(filename):
                with open(filename,'r') as file:
                    student_old = file.readlines()
            else:
                student_old = []
            flag = False
            if student_old:  # 如果存在
                with open(filename,'w') as wfile:
                    doc = {}
                    for list in student_old:
                        doc = dict(eval(list))  # 字符串转换成字典
                        if doc['id'] != stu_id:
                            wfile.write(str(doc)+'\n')
                        else:
                            flag = True
                    if flag:
                        self.Memo1.Lines.Add(f'ID为{stu_id}的学生信息已删除')
                    else:
                        self.Memo1.Lines.Add(f'未找到ID为{stu_id}的学生信息')
            else:
                self.Memo1.Lines.Add('无该学生信息')
                return
            # 显示全部学生信息

    def show_student(self,studentList):
        '''将保存在列表的学生信息显示出来'''
        if not studentList:
            self.Memo1.Lines.Add('无数据显示')
            return
        # 使用空格,显示的更整齐
        format_title = "{:^4}\t{:^4}\t{:^4}\t{:^6}\t{:^10}\t{:^10}"
        count = self.Memo1.Lines.Count
        if count < 2 :
            self.Memo1.Lines.Add(format_title.format("ID","姓名","英语","计算机","数学","总成绩"))
        for info in studentList:
            self.Memo1.Lines.Add(format_title.format(
            info.get('id'),info.get('name'),
            str(info.get('english')).center(5),str(info.get('jsj')).center(10),str(info.get('math')).center(12),
            str(info.get('english')+info.get('jsj')+info.get('math')).center(12),
            ))

    def show_all(self):
        '''显示所有学生信息'''
        stu_new = []
        if os.path.exists(filename):
            with open(filename,'r') as rfile:
                stu_old = rfile.readlines()
            for list in stu_old:
                stu_new.append(eval(list))
            if stu_new:
                self.show_student(stu_new)

        else:
            self.Memo1.Lines.Add('暂未保存数据信息。。。')

    def Button2Click(self, Sender):
        self.delete()

Unit5.py

import os
from delphivcl import *

filename = 'Students.txt'  # 定义学生信息文件


class Form5(Form):

    def __init__(self, owner):
        self.BitBtn4 = BitBtn(self)
        self.BitBtn3 = BitBtn(self)
        self.BitBtn2 = BitBtn(self)
        self.BitBtn1 = BitBtn(self)
        self.LabeledEdit5 = LabeledEdit(self)
        self.LabeledEdit4 = LabeledEdit(self)
        self.LabeledEdit3 = LabeledEdit(self)
        self.LabeledEdit2 = LabeledEdit(self)
        self.LabeledEdit1 = LabeledEdit(self)
        self.LoadProps(os.path.join(os.path.dirname(os.path.abspath(__file__)), "Unit5.pydfm"))
        self.BitBtn4.OnClick = self.BitBtn4Click
        self.BitBtn1.OnClick = self.BitBtn1Click


    def BitBtn1Click(self, Sender):
        '''修改学生信息'''
        stu_id = self.LabeledEdit1.Text
        name = self.LabeledEdit2.Text
        english = self.LabeledEdit3.Text
        jsj = self.LabeledEdit4.Text
        math = self.LabeledEdit5.Text
        if stu_id is not "":
            if name is not "":
                if english is not "":
                    if jsj is not "":
                        if math is not "":
                            stu = dict()
                            stu['id'] = stu_id
                            stu['name'] = name
                            stu['english'] = int(english)
                            stu['jsj'] = int(jsj)
                            stu['math'] = int(math)
                            flag = False
                            with open(filename,'r') as rfile:
                                student_old = rfile.readlines()
                            with open(filename,'w') as wfile:
                                for student in student_old:
                                    stud = dict(eval(student))
                                    if stud['id'] == stu_id:
                                        flag = True
                                        student = str(stu)  # 将字典转换为字符串
                                    wfile.write(student)
                            if flag:
                                ShowMessage('修改成功。。')
                            else:
                                ShowMessage('id不存在或数据未变化。。')
                        else:
                            ShowMessage('数学不能为空')
                            return
                    else:
                        ShowMessage('计算机不能为空')
                        return
                else:
                    ShowMessage('英语不能为空')
                    return
            else:
                ShowMessage('姓名不能为空')
                return
        else:
            ShowMessage('id不能为空')
            return


    def BitBtn4Click(self, Sender):
        '''查询学生信息'''
        stu_id = self.LabeledEdit1.Text
        if stu_id is not "": # 输入不为空
            if os.path.exists(filename):
                with open(filename,'r') as file:
                    student_old = file.readlines()
            else:
                student_old = []
                ShowMessage('未保存数据')
            flag = False
            if student_old:  # 如果存在
                for list in student_old:
                    doc = dict(eval(list))  # 字符串转换成字典
                    if doc['id'] == stu_id:
                        flag = True
                        self.LabeledEdit2.Text=doc['name']
                        self.LabeledEdit3.Text=doc['english']
                        self.LabeledEdit4.Text=doc['jsj']
                        self.LabeledEdit5.Text=doc['math']
                if flag == False:
                    ShowMessage('id不存在')
                    self.LabeledEdit2.Text=''
                    self.LabeledEdit3.Text=''
                    self.LabeledEdit4.Text=''
                    self.LabeledEdit5.Text=''
            else:
                ShowMessage('数据为空')
        else:
            ShowMessage('id不能为空')
            return
        # 显示全部学生信息

本来还有排序和显示2个窗体的,我没有做。我使用的是皮肤 Windows10 Malibu。

        self.sm = StyleManager()
        self.sm.LoadFromFile("Windows10Malibu.vsf")
        self.sm.SetStyle('Windows10 Malibu')

 3行代码,加个123kb的文件,就给几个窗口都换了皮肤了,真的方便啊。

PythonStudio用来做python窗体软件设计工具,真的很不错,大家赶快来试试吧。软件下载链接在顶部。