前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Python GUI项目实战(二)主窗体的界面设计与实现

Python GUI项目实战(二)主窗体的界面设计与实现

作者头像
小雨coding
发布于 2020-08-11 06:37:43
发布于 2020-08-11 06:37:43
4.3K00
代码可运行
举报
文章被收录于专栏:小雨编程小雨编程
运行总次数:0
代码可运行

前言

上一节我们介绍了登录窗体的GUI设计与功能实现,用户的账号和密码校验完成后应当跳转到主窗体内容,这一节我们将具体介绍主窗体界面的设计与功能实现!


一、基础界面设计

我们新建一个900x640的窗口,顶部加入图片,下面主体部分创建两个Panedwindow容器,左边添加按钮,右边作为TreeView显示界面;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from tkinter import *
from tkinter.ttk import *
import os

class MainWindow(Tk):

    def __init__(self):
        super().__init__()
        self.title("主窗体")
        self.geometry("900x640+180+80")
        self.resizable(0,0)
        self["bg"]="skyblue"

        # 加载gui
        self.setup_UI()
    def setup_UI(self):
        # 设定Style
        self.Style01 = Style()
        self.Style01.configure("left.TPanedwindow",background = "navy")
        self.Style01.configure("right.TPanedwindow", background="skyblue")
        self.Style01.configure("TButton",width = 10,font = ("华文黑体",15,"bold"))

        # Top_banner
        self.Login_image = PhotoImage(file = "."+os.sep+"img"+os.sep+"stu_main_top_banner.png")
        self.Lable_image = Label(self,image = self.Login_image)
        self.Lable_image.pack()

        # 左边:按钮区域,创建一个容器
        self.Pane_left = PanedWindow(width = 200,height = 540,style = "left.TPanedwindow")
        self.Pane_left.place(x = 4,y = 94)
        self.Pane_right = PanedWindow(width=685, height=540,style = "right.TPanedwindow")
        self.Pane_right.place(x = 210,y = 94)

        # 添加左边按钮
        self.Button_add = Button(self.Pane_left,text = "添加学生",style = "TButton")
        self.Button_add.place(x = 40,y = 20)
        self.Button_update = Button(self.Pane_left, text="修改学生", style="TButton")
        self.Button_update.place(x=40, y=45)
        self.Button_delete = Button(self.Pane_left, text="删除学生", style="TButton")
        self.Button_delete.place(x=40, y=70)
        self.Button_modify = Button(self.Pane_left, text="更改密码", style="TButton")
        self.Button_modify.place(x=40, y=120)

        # 右边:查询、TreeView

if __name__ == '__main__':
    this_main = MainWindow()
    this_main.mainloop()
显示效果:

注意:tkinter在Mac上Panedwindow不支持修改前景色背景色

二、添加查询区域

在右边的Pannedwindow容器中,添加一个LabelFrame容器作为查询区域,在LabelFrame容器中添加一系列的Label、Entry、Button控件,可以输入学号、姓名、电话、身份证、查询、和显示全部信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
self.Pane_right = PanedWindow(width=725, height=540, style="right.TPanedwindow")
self.Pane_right.place(x=170, y=94)
# LabelFrame
self.LabelFrame_query = LabelFrame(self.Pane_right,text = "学生信息查询",width = 700,height = 70)
self.LabelFrame_query.place(x = 10 , y = 10)
# 添加控件
self.Label_sno = Label(self.LabelFrame_query,text = "学号:")
self.Label_sno.place(x = 5,y = 13)
self.Entry_sno = Entry(self.LabelFrame_query,width = 8)
self.Entry_sno.place(x = 40,y = 10)

self.Label_name = Label(self.LabelFrame_query, text="姓名:")
self.Label_name.place(x=125, y=13)
self.Entry_name = Entry(self.LabelFrame_query, width=8)
self.Entry_name.place(x=160, y=10)

self.Label_mobile = Label(self.LabelFrame_query, text="电话:")
self.Label_mobile.place(x=245, y=13)
self.Entry_mobile = Entry(self.LabelFrame_query, width=8)
self.Entry_mobile.place(x=280, y=10)

self.Label_id = Label(self.LabelFrame_query, text="身份证:")
self.Label_id.place(x=365, y=13)
self.Entry_id = Entry(self.LabelFrame_query, width=10)
self.Entry_id.place(x=420, y=10)

self.Button_query = Button(self.LabelFrame_query, text="查询",width = 4)
self.Button_query.place(x=520, y=10)
self.Button_all = Button(self.LabelFrame_query, text="显示全部",width = 8)
self.Button_all.place(x=590, y=10)
显示效果:

三、加载Treeview控件

创建控件、设置对齐方式和每个列的标题

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 添加TreeView控件
self.Tree = Treeview(self.Pane_right,columns=("sno","names",
    "gender","birthday","mobile","email","address"),show="headings",height=20)

# 设置每一个列的宽度和对齐的方式
self.Tree.column("sno",width=100,anchor="center")
self.Tree.column("names",width=80,anchor="center")
self.Tree.column("gender",width=80,anchor="center")
self.Tree.column("birthday",width=100,anchor="center")
self.Tree.column("mobile",width=100,anchor="center")
self.Tree.column("email", width=100, anchor="center")
self.Tree.column("address",width=120,anchor="center")

# 设置每个列的标题
self.Tree.heading("sno",text="学号")
self.Tree.heading("names", text="姓名")
self.Tree.heading("gender", text="性别")
self.Tree.heading("birthday", text="生日")
self.Tree.heading("mobile", text="手机号码")
self.Tree.heading("email", text="邮箱地址")
self.Tree.heading("address", text="家庭住址")

self.Tree.place(x=10,y=80)
显示效果:

四、实现登录用户登录信息加载

登录成功后,在顶部显示用户姓名和登录时间,用户姓名是怎么来的?是我们在登录窗口输入的,所以这就涉及到了跨窗体数据的传递。这一点非常重要!登录窗体(登录信息)==>主窗体 传递的基本方式:构造函数 在主窗体的构造函数中添加一个接收参数current_user,在登录窗体加载新窗体时将参数传递进去; 但是我们登录窗体的登录函数login()中用户名的变量user是局部变量,函数调用完了之后就变量就没有了,那怎么调用呢?我们需要在登录窗体的构造函数中定义全局变量:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
self.user = ""   # 当前的用户

为了获取用户登录的时间,我们定义一个获取当前时间的方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def get_now_time(self):
    today = datetime.today()
    return ("%04d-%02d-%02d %02d:%02d:%02d"%(today.year,
            today.month,today.day,today.hour,today.minute,today.second))

然后在加载主窗体时将参数self.userself.get_now_time()作为参数传递进去

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
main_window = maingui.MainWindow(self.user,self.get_now_time())

另一边,我们在主窗体中,在构造函数中添加全局变量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
self.login_user = current_user
self.login_time = current_time

之后,我们在Top_banner中通过标签将user信息展示出来:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
self.Label_login_user = Label(self,text = "当前用户:"+str(self.login_user).title()
                              +"\n登录时间:"+self.login_time)
self.Label_login_user.place(x = 650,y = 40)

这样主窗口就会显示通过登录窗口登录的用户名(首字母自动转大写)和登录时间:效果演示:

五、加载学生信息到TreeView中

1. 我们在主窗体中定义全局变量来存储学生信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
self.all_student_list = []
self.file_path = "/Users/yushengtan/Desktop/Demo/Studentmgr/Student.txt"

2. 定义方法读取文件中的学生信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def load_file_student_info(self):
    if not os.path.exists(self.file_path):
        showinfo("系统消息","提供的文件名不存在!")
    else:
        try:
            with open(file = self.file_path,mode = "r") as fd:
                # 一次读一行
                current_line = fd.readline()
                while current_line:
                    temp_list = current_line.split(",") # 长字符串分割层三个
                    self.all_student_list.append(temp_list)
                    # 读取下一行,读完了循环就结束了
                    current_line = fd.readline()
        except:
            showinfo("系统消息","文件读取出现异常!")

然后我们在构造方法中把这个函数写入,以实现自动把学生信息写入到all_student_list中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
self.load_file_student_info()

3. 定义加载TreeView信息的方法

文件中读取到的学生信息存储到all_student_list列表,以此作为参数传入加载TreeView的方法中;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def load_treeview(self,current_list:list):
    # 判断是否有数据:
    if len(current_list) == 0:
        showinfo("系统消息","没有数据加载")
    else:
        for index in range(len(current_list)):
            self.Tree.insert("",index,values=(current_list[index][0],current_list[index][1],
                current_list[index][2],current_list[index][3],current_list[index][4],
                                              current_list[index][5],current_list[index][6]))

在构造方法中调用该方法,自动把所有学生信息加载到TreeView中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
self.load_treeview(self.all_student_list)   
运行效果:

最后

这一节我们实现了主窗体的搭建,从界面的布局到TreeView加载全部学生信息。学生数据如此之多,如果我们想精确查看具体某个学生的信息,那该怎么做呢?下一讲,我们将实现学生信息的查询功能,敬请期待吧~


·END·

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-08-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小雨编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Jupyter Notebook使用速查表
Jupyter Notebook是编写和迭代Python代码进行数据分析的强大方式。Jupyter Notebook基于IPython构建,内核运行计算并与Jupyter Notebook前端接口通信。这张Jupyter Notebook速查表将帮助你找到著名的笔记本应用程序,这是Jupyter项目的一个子项目。
AI算法与图像处理
2021/12/13
6900
Jupyter Notebook使用速查表
数据分析之jupyter notebook工具
  打开终端输入: jupyter notebook ,这是就会在浏览器上打开一个jupyter notebook工作页面。
Se7eN_HOU
2023/07/24
3590
数据分析之jupyter notebook工具
Jupyter Notebook的使用
版权声明:博客文章都是作者辛苦整理的,转载请注明出处,谢谢! https://blog.csdn.net/Quincuntial/article/details/79047067
Tyan
2019/05/25
6370
数据分析篇 | 如何配置数据分析利器Jupyter Notebook?
指定启动目录可以减少很多切换目录的麻烦操作,呆鸟以前写过一篇《1 分钟修改 Jupyter 启动文件夹》,已经介绍过,不在此赘述了。
龙哥
2019/12/12
2.3K0
数据分析篇 | 如何配置数据分析利器Jupyter Notebook?
上手jupyter notebook神器
Jupyter Notebook非常活跃于深度学习领域。在项目的实验测试阶段,它相比于用 py 文件来直接编程更方便一些。在项目结束之后如果要写项目报告,用 Jupyter 也比较合适。
叶庭云
2021/12/01
1.9K0
上手jupyter notebook神器
Jupyter-Notebook使用技巧
如果你用Python做开发,那么首选Pycharm;但是如果你想用Python做数据分析、数据挖掘,以及火热的机器学习和人工智能项目,Jupyter Notebook注定是首选,因为Jupyter Notebook一直都是做数据科学的最佳利器。
皮大大
2021/04/09
1.5K0
Jupyter-Notebook使用技巧
18 个 Jupyter Notebook 小技巧,帮助你快速腾飞
Jupyter Notebook 是干嘛的就不再过多介绍了,这篇文章收集了一些顶级的 Jupyter Notebook 技巧,可以让你迅速成为一个 Jupyter 超级使用者!
周萝卜
2021/03/16
1.2K0
Jupyter Notebook开荒笔记
命令行窗口运行jupyter notebook命令,浏览器访问'http://localhost:8888/tree'即可
Hsinyan
2022/06/19
6580
15个应该掌握的Jupyter Notebook 使用技巧
Jupyter Notebook是一个基于浏览器的交互式编程环境(REPL, read eval print loop),它主要构建在IPython等开源库上,允许我们在浏览器上运行交互式python代码。并且有许多有趣的插件和神奇的命令,大大增强了python的编程体验。
deephub
2020/09/23
1.9K0
15个应该掌握的Jupyter Notebook 使用技巧
AI编程常用工具 Jupyter Notebook
我们先来看 4 个常用的编程工具:Sublime Text、Vim、Jupyter。虽然我介绍的是 Jupyter,但并不是要求你必须使用它,你也可以根据自己的喜好自由选择。
程序猿Damon
2023/09/04
5810
AI编程常用工具 Jupyter Notebook
15个节省时间的Jupyter技巧
作为数据科学家,从加载数据到创建和部署模型,我们几乎每天都在使用Jupyter notebook。
deephub
2023/02/01
2.1K0
数据分析利器jupyter notebook入门手册
今天就公开啦:Jupyter Notebook,没有Pycharm,没有Vscode,没有Sublime text。只有Jupyter Notebook。从2019年至今,使用了两年半多的时间,今天就好好聊聊它~
皮大大
2021/10/07
1.5K0
数据分析利器jupyter notebook入门手册
Anaconda:认识Jupyter Notebook
Anconda中内嵌了很多工具,Jupyter Notebook作为Anaconda套件里受到广泛关注的应用,自然有它的道理,接下来我们就从认识Jupter开始一步步进入Python的世界吧。
做数据的二号姬
2019/07/18
1.8K0
Anaconda:认识Jupyter Notebook
五分钟带你轻松优化你的Jupyter Notebook
本文介绍了一些有关改善Jupyter Notebook体验的简单技巧,并介绍了有用的快捷方式,添加主题,自动生成的目录等。
计算机与AI
2020/11/19
2.2K0
五分钟带你轻松优化你的Jupyter Notebook
jupyter notebook的安装与使用
最近由于项目需要,开始学习python,然后发现一个非常有用的python交互式编辑器,非常容易上手而且非常有用和实在,本博文是对学习jupyter notebook的一个汇总和记录,与大家一起分享!下面的内容是针对ubuntu 系统的,当然,jupyter notebook在windows也是支持的。
全栈程序员站长
2022/06/27
8110
jupyter notebook的安装与使用
机器学习第8天:IPyhon与Jupyter notebook
ipython是一个python的交互式shell,比默认的python shell好用得多,支持变量自动补全,自动缩进,支持bash shell命令,内置了许多很有用的功能和函数。学习ipython将会让我们以一种更高的效率来使用python。同时它也是利用Python进行科学计算和交互可视化的一个最佳的平台之一。
K同学啊
2019/01/22
9240
Jupyter Notebook入门
Jupyter Notebook是一种交互式计算环境,能够让用户在浏览器中编写和执行代码,并与代码的运行结果、文本、图像、视频等进行交互。它的灵活性、易用性和可视化效果使它成为各种数据分析、机器学习和科学计算任务的首选工具。本文将介绍Jupyter Notebook的基本概念、使用方法以及一些常用技巧。
大盘鸡拌面
2023/10/26
5590
机器学习新手必看:Jupyter Notebook入门指南
翻译 | 张建军 出品 | 人工智能头条(公众号ID:AI_Thinker) 【人工智能头条导读】Jupyter Notebook 是一个 Web 应用程序,便于创建和共享文学化程序文档,支持实时代码、数学方程、可视化和 Markdown,其用途包括数据清理和转换、数值模拟、统计建模、机器学习等等。目前,数据挖掘领域中最热门的比赛 Kaggle 里的资料都是 Jupyter 格式。对于机器学习新手来说,学会使用 Jupyter Notebook 非常重要。 下面这篇 Jupyter Notebook 入门指
用户1737318
2018/06/05
2.8K0
Jupyter notebook快速入门教程
如果你想使用Python学习数据分析或数据挖掘,那么它应该是你第一个应该知道并会使用的工具,它很容易上手,用起来非常方便,是个对新手非常友好的工具。而事实也证明它的确很好用,在数据挖掘平台 Kaggle 上,使用 Python 的数据爱好者绝大多数使用 jupyter notebook 来实现分析和建模的过程,因此,如果你想学习机器学习,数据挖掘,那么这款软件你真的应该了解一下。
Python数据科学
2018/08/06
1.4K0
Jupyter notebook快速入门教程
Jupyter Notebook
 Jupyter Notebook(此前被称为 IPython notebook)是一个交互式笔记本,支持运行 40 多种编程语言。在本文中,我们将介绍 Jupyter notebook 的主要特性,以及为什么对于希望编写漂亮的交互式文档的人来说是一个强大工具。 在开始使用 notebook 之前,我们先在cmd中使用pip安装该库 pip install jupyter 安装好之后运行命令 jupyter notebook 你会看到: [I 08:34:12.265 NotebookApp] Writi
拾点阳光
2018/05/11
1.7K0
相关推荐
Jupyter Notebook使用速查表
更多 >
LV.0
数据分析师
目录
  • 前言
  • 一、基础界面设计
  • 二、添加查询区域
  • 三、加载Treeview控件
  • 四、实现登录用户登录信息加载
  • 五、加载学生信息到TreeView中
    • 1. 我们在主窗体中定义全局变量来存储学生信息:
    • 2. 定义方法读取文件中的学生信息
    • 3. 定义加载TreeView信息的方法
  • 最后
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文