初入Python:登陆界面以及登陆后显示新界面列子

Mr.Wu 207 0

自从成功上手 Python 后,就一发不可收拾,每天疯狂的练习,想做啥就去尝试,各种练习,其中遇到太多的坑,这些坑对于初学者而言需要花费巨额的时间去查阅和理解;

Python 学习感想

Python 作为我第一个掌握的 支持界面编程 的语言,我非常热爱它,它就像人们所说的那样,简单快捷方便

Python 的图形界面是真的非常糟糕的,虽然有很多大佬开发了一些 图形界面设计工具,但还是感觉糟糕,稳定性感觉不行,容易崩溃,还有就是控件太少;

比如 我昨天折腾的一个 小说追更工具,就差最后一步,显示文章内容了,结果突然发现,tkinter 居然没有内置的网页调用控件,虽然网上有些资料显示可以用其他第三方库实现,但是都是非常麻烦复杂的一个事情,另外也可以正则匹配 div 内容 然后慢慢调试好显示方式在输出到编辑器上面,但是这会是一个时间话,我最后选择了放弃,暂时不去折腾它

很多人都说 Python 的优点就是其 脚本方面 ,简单快捷,所以官方不会考虑也不需要考虑增加图形界面的发展潜力

对于我而言,我觉得能独立开发一款窗口程序是一件非常兴奋自豪的事情,所以即使如此,我也喜欢并且尝试用 Python 去编写窗口程序

目前依然能做到使用 Python 编写一些平时需要的功能脚本,奈何七秒记忆的我对于库的不熟悉,所以总是需要花费很多的时间...

最后,希望在未来的某天,完全掌握 Python 后,在去尝试接触 c++ 之类的 图形编程语言,那时 PHP + PYTHON 的功底或许能让我快速入门?

登陆界面代码

扯犊子了半天,进入正题,下面附上我写的 登陆界面以及登陆后显示新界面列子代码:

import tkinter as tk
import webbrowser
import configparser
import os
from tkinter import ttk
from tkinter import messagebox

class homes:
    def __init__(self, 启动窗口):
        self.启动窗口 = 启动窗口
        self.启动窗口.title('')
        self.启动窗口.resizable(width=False, height=False)
        screenwidth = self.启动窗口.winfo_screenwidth()
        screenheight = self.启动窗口.winfo_screenheight()
        size = '%dx%d+%d+%d' % (1185, 698, (screenwidth - 1185) / 2, (screenheight - 698) / 2)
        self.启动窗口.geometry(size)
        
        self.标签1_标题 = tk.StringVar()
        self.标签1_标题.set('这是登陆后的界面,可以在这里添加登陆后的样式和功能')
        self.标签1 = tk.Label(self.启动窗口,textvariable=self.标签1_标题,anchor=tk.W)
        self.标签1.place(x=390,y=179,width=396,height=174)

class PyWinDesign:
    #全局变量
    global cf
    cf = configparser.ConfigParser()

    def __init__(self, 启动窗口):
        self.启动窗口 = 启动窗口
        self.启动窗口.title('登陆')
        self.启动窗口.resizable(width=False, height=False)
        screenwidth = self.启动窗口.winfo_screenwidth()
        screenheight = self.启动窗口.winfo_screenheight()
        size = '%dx%d+%d+%d' % (348, 355, (screenwidth - 348) / 2, (screenheight - 355) / 2)
        self.启动窗口.geometry(size)
        
        self.photo = tk.PhotoImage(file=r'D:\Desktop\Python\logo.png')
        self.图片1 = ttk.Label(self.启动窗口,imag=self.photo,anchor=tk.CENTER)
        self.图片1.place(x=50,y=34,width=247,height=50)
        
        self.账号标签_标题 = tk.StringVar()
        self.账号标签_标题.set('账号:')
        self.账号标签 = ttk.Label(self.启动窗口,textvariable=self.账号标签_标题,anchor=tk.W)
        self.账号标签.place(x=56,y=147,width=37,height=24)
        
        self.账号编辑框_内容 = tk.StringVar()
        self.账号编辑框_内容.set('')
        self.账号编辑框 = ttk.Entry(self.启动窗口,textvariable=self.账号编辑框_内容,justify=tk.LEFT)
        self.账号编辑框.place(x=98,y=147,width=179,height=24)
        
        self.密码标签_标题 = tk.StringVar()
        self.密码标签_标题.set('密码:')
        self.密码标签 = ttk.Label(self.启动窗口,textvariable=self.密码标签_标题,anchor=tk.W)
        self.密码标签.place(x=56,y=198,width=37,height=24)
        
        self.密码编辑框_内容 = tk.StringVar()
        self.密码编辑框_内容.set('')
        self.密码编辑框 = ttk.Entry(self.启动窗口,textvariable=self.密码编辑框_内容,show='*',justify=tk.LEFT)
        self.密码编辑框.place(x=98,y=198,width=179,height=24)
        
        self.账号读取 = self.账号读取()
        self.登陆_标题 = tk.StringVar()
        self.登陆_标题.set('登陆')
        self.登陆 = ttk.Button(self.启动窗口,textvariable=self.登陆_标题)
        self.登陆.bind('<Button-1>',self.登陆_被鼠标左键按下)
        self.登陆.place(x=199,y=292,width=80,height=32)
        
        self.注册_标题 = tk.StringVar()
        self.注册_标题.set('注册')
        self.注册 = ttk.Button(self.启动窗口,textvariable=self.注册_标题)
        self.注册.bind('<Button-1>',self.注册_被鼠标左键按下)
        self.注册.place(x=90,y=292,width=80,height=32)
        
        self.记住账密_选中 = tk.IntVar()
        self.记住账密_选中.set(1)
        self.记住账密_标题 = tk.StringVar()
        self.记住账密_标题.set('记住账密')
        self.记住账密 = ttk.Checkbutton(self.启动窗口,textvariable=self.记住账密_标题,variable=self.记住账密_选中,onvalue=1,offvalue=0)
        self.记住账密.place(x=97,y=241,width=88,height=24)
        
    def 账号存储(self):
        账号 = self.账号编辑框_内容.get()
        密码 = self.密码编辑框_内容.get()

        config = os.path.exists('config.ini')
        if config != 1:
            cf.add_section("User")
        cf.set("User", "username",账号)
        cf.set("User", "password",密码)

        with open("config.ini","w+") as f:
            cf.write(f)

    def 账号读取(self):
        config = os.path.exists('config.ini')
        if config == 1:
            cf.read("config.ini")
            读账号 = cf.get("User", "username")
            读密码 = cf.get("User", "password")
            self.账号编辑框_内容.set(读账号)
            self.密码编辑框_内容.set(读密码)

    def 销毁(self):
        for x in root.winfo_children():
            x.destroy()
        root.update()

    def 登陆_被鼠标左键按下(self,event):
        记住账密 = self.记住账密_选中.get()
        账号 = self.账号编辑框_内容.get()
        密码 = self.密码编辑框_内容.get()

        if 记住账密 == 1:
            账号存储 = self.账号存储()
            if 账号 == 'admin' and 密码 == 'pass':
                messagebox.showinfo("提示","登陆成功")
                # 销毁登录框控件,一开始想直接销毁所有控件,然后更改界面大小,在添加新的控件,但是暂时遇到难题,不知道如何添加,destroy删除了所有 tk控件
                #self.销毁()
                root.withdraw() # 隐藏登陆框
                home.deiconify() # 显示登陆后的界面

            else:
                messagebox.showinfo("提示","登陆失败")



    def 注册_被鼠标左键按下(self,event):
        webbrowser.open(url = 'https://www.mrwu.red/wp-login.php?action=register', new = 0)
    
if __name__ == '__main__':
    home = tk.Tk()
    root = tk.Toplevel()

    home.withdraw() #启动后先隐藏大界面
    app = PyWinDesign(root)
    apps = homes(home)
    home.mainloop()

演示效果

最后唠叨几句

可能会有大佬吐槽我代码写的太烂,代码中的中文看着太尬
我想说我英语幼儿园毕业,既然 Python 支持中文,我为什么不用中文,非要去写个英文装逼,以后自己看自己代码都看不懂了,而且我图形界面用了辅助设计工具,那个工具生成的代码就是中文命名滴~

抖音上看到某视频说可以先吧原控件全部销毁,在更改窗口大小,实现登陆后显示大窗口的效果
最开始我也确实是这样的写法,后面发现问题有点严重,我的所有 tk 控件全部销毁掉了,也就是说无法在给登陆后的界面添加新的控件,不知道是不是我操作不对,我看视频中他的也是登陆后一片空白,没有一个控件,不知道他是没法添加还是故意留个坑的,以后有机会多在摸索这个,这次先用隐藏的方式来实现

界面上的博客logo解密
或许眼见的都发现了那个显眼的logo,其实一开始我是准备做全套的,把我博客面板做成工具的,但是遇到了些问题:
1.面板工具页面需要登录,但是我博客登录为了安全起见,加了两个验证码,并且其中一个图形验证码还附带 随机key ,这就导致我不知道如何去实现模拟登陆效果了,如果去掉验证码,我博客安全会降低许多,并且会面临一堆垃圾账号注册,因此后面选择放弃,虽然真要折腾是可以弄出来的,但是那将花费很多时间,所以我选择把时间留给其他的练习

2.网站是我的,我当然能自己开发独立 api 接口,自己定义登陆需要的参数,比如去掉验证码,只需要账号密码,并且返回方式是 json 更方便我的工具判断;最开始我想弄的,后面想想还是选择放弃,没有验证码真的不安全,我不希望某天我的账号或者其他付费会员账号被人爆破出来

所以,总而言之,这次练习最终只能以一个列子为名结束,害

打赏
发表评论 取消回复
表情 图片 链接 代码

分享
微信
微博
QQ