自从成功上手 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()</pre>
`
演示效果
最后唠叨几句
可能会有大佬吐槽我代码写的太烂,代码中的中文看着太尬
我想说我英语幼儿园毕业,既然 Python 支持中文,我为什么不用中文,非要去写个英文装逼,以后自己看自己代码都看不懂了,而且我图形界面用了辅助设计工具,那个工具生成的代码就是中文命名滴~
抖音上看到某视频说可以先吧原控件全部销毁,在更改窗口大小,实现登陆后显示大窗口的效果
最开始我也确实是这样的写法,后面发现问题有点严重,我的所有 tk 控件全部销毁掉了,也就是说无法在给登陆后的界面添加新的控件,不知道是不是我操作不对,我看视频中他的也是登陆后一片空白,没有一个控件,不知道他是没法添加还是故意留个坑的,以后有机会多在摸索这个,这次先用隐藏的方式来实现
界面上的博客logo解密
或许眼见的都发现了那个显眼的logo,其实一开始我是准备做全套的,把我博客面板做成工具的,但是遇到了些问题:
1.面板工具页面需要登录,但是我博客登录为了安全起见,加了两个验证码,并且其中一个图形验证码还附带 随机key ,这就导致我不知道如何去实现模拟登陆效果了,如果去掉验证码,我博客安全会降低许多,并且会面临一堆垃圾账号注册,因此后面选择放弃,虽然真要折腾是可以弄出来的,但是那将花费很多时间,所以我选择把时间留给其他的练习
2.网站是我的,我当然能自己开发独立 api 接口,自己定义登陆需要的参数,比如去掉验证码,只需要账号密码,并且返回方式是 json 更方便我的工具判断;最开始我想弄的,后面想想还是选择放弃,没有验证码真的不安全,我不希望某天我的账号或者其他付费会员账号被人爆破出来
所以,总而言之,这次练习最终只能以一个列子为名结束,害