自从成功上手 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 更方便我的工具判断;最开始我想弄的,后面想想还是选择放弃,没有验证码真的不安全,我不希望某天我的账号或者其他付费会员账号被人爆破出来
所以,总而言之,这次练习最终只能以一个列子为名结束,害
本文作者为Mr.Wu,转载请注明,尊守博主劳动成果!
由于经常折腾代码,可能会导致个别文章内容显示错位或者别的 BUG 影响阅读; 如发现请在该文章下留言告知于我,thank you !
pywebview和electron都可以整合web界面,然后作为python的可视化界面