Python3 初学实践案例(7)tkinter 入门 GUI 的密码生成程序

Python3 初学实践案例(7)tkinter 入门 GUI 的密码生成程序

前面我已经非常好的完成了 cli 的密码生成程序的编写 http://blog.csdn.net/fungleo/article/details/78842597

虽然这个脚本已经非常理想了,但是对于大多数人来说,还是用不上的。毕竟,我不能要求所有人都去使用命令行。所以我决定写一个 gui 的图形界面的程序。

说起来简单,但做起来就太难了。我没有任何编写图形界面程序的经验,通过几天的研究,终于实现了部分功能:

tkinter 实现完成代码

这真是个垃圾玩意儿,我决定放弃这个东西了。接下来没想好到底学习哪个库,估计在 wxpython 或者 pyqt 里面选择一个。但目前没有确定。

先来说说 tkinter 这个东西吧。这个是 python 自带的 gui 的库。它的说明文档非常糟糕,我勉强写下了下面的程序:

from tkinter import *
import sys
import clipboard
import random

def cutLength(leng, level):
    res = []
    for i in range(level, 1, -1):
        res.append(random.randint(1, leng - sum(res) - i + 1))
    res.append(leng - sum(res))
    random.shuffle(res)
    return res

def makePassword(dists, arr):
    res = []
    for i in range(len(arr)):
        for j in range(arr[i]):
            res += random.choice(dists[i])
    random.shuffle(res)
    return ''.join(res)

def getPassword(leng, level):
    arr = cutLength(leng,level)
    str1 = '01'
    str2 = '23456789'
    str3 = 'abcdefghijkmnpqrstuvwxyz'
    str4 = 'ABCDEFGHJKMNPQRSTUVWXYZ'
    str5 = '_@!,.:;-=+/?'

    dists = {
        1: [str1 + str2],
        3: [str2, str3, str4],
        4: [str2, str3, str4, str5]
    }
    return makePassword(dists[level], arr)

def test(res):
    if res.isdigit():
        return int(res) > 4
    else:
        return False

def calcPlus():
    leng.set(int(leng.get()) + 1)

def calcSubt():
    lengVal = int(leng.get())
    if lengVal > 4:
        leng.set(lengVal - 1)

def getPw():
    res = getPassword(int(leng.get()),level.get())
    clipboard.copy(res)
    pw.set(res)

if __name__ == "__main__":
    root = Tk()
    root.title('密码生成器')
    leng = StringVar()
    leng.set(8)

    f1 = Frame(root)
    f1.pack(padx=10,pady=5)

    testCMD = root.register(test)

    Label(f1, text="密码长度:").grid(row=0,column=0)

    f1r = Frame(f1)
    f1r.grid(row=0, column=1)

    e1 = Entry(f1r, textvariable=leng, width=5, validate="key",validatecommand=(testCMD, '%P')).grid(row=0,column=1)


    Button(f1r, text="+", command=calcPlus).grid(row=0, column=2)
    Button(f1r, text="-", command=calcSubt).grid(row=0, column=3)

    level = IntVar()
    level.set(3)

    Label(f1, text="密码强度:").grid(row=1,column=0)

    f1rb = Frame(f1)
    f1rb.grid(row=1, column=1)

    Radiobutton(f1rb, text="简单", variable=level, value=1).grid(row=1, column=1)
    Radiobutton(f1rb, text="一般", variable=level, value=3).grid(row=1, column=2)
    Radiobutton(f1rb, text="复杂", variable=level, value=4).grid(row=1, column=3)

    pw = StringVar()
    Entry(root,textvariable=pw,state="readonly").pack()

    submit = Button(root,text="生成密码并复制到剪切板", command=getPw)
    submit.pack()

    mainloop()

补充说明

首先我们创建了一个最简单的图形界面的程序

# 引入库
from tkinter import *
# 创建一个实例
root = Tk()
# 主循环进程
mainloop()

然后我们在命令行中输入命令 pyhton3 xxx.py 就可以跑起来一个图形界面的程序了。

默认是没有任何东西的。我们可以往里面去添加东西。就是不断的往 root 下面添加东西。

首先呢,我们可以设置一下程序的标题:

root.title('密码生成器')

然后,在里面可以添加框架,框架里面添加文本框,文字,按钮这些东西。

基础使用请看下我上面的代码吧。都是非常基础的知识。主要是文档太烂了,我不准备再继续研究了,太累了。

仅以此文纪念我的第一个GUI程序~

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏HTML5学堂

jQuery1.x与2.x版本区别及1.9版本的变化

HTML5学堂:还记得2012年做开发时,使用的是jQuery1.4版本的框架,一个项目做完时,jQuery版本已经提升到了1.6。不得不说jQuery更新速度...

49040
来自专栏Web 开发

Deploy WordPress On SAE

也没怎么刻意去选择,从各种cPanel主机,到VPS,再到AppFog等Pass,基本上都玩了一遍了。

10200
来自专栏冰霜之地

大话大前端时代(一) —— Vue 与 iOS 的组件化

今年大前端的概念一而再再而三的被提及,那么大前端时代究竟是什么呢?大前端这个词最早是因为在阿里内部有很多前端开发人员既写前端又写 Java 的 Velocity...

20130
来自专栏jianhuicode

那些React-Native踩过的的坑

    这几天开始边学边做新模式,也踩了不少坑,所以会记录下来--俗话说好记心不如烂笔头,何况还没有一颗好记心(-_-)。    从学React-Native开...

24390
来自专栏Coding01

推荐简约漂亮的小程序日历插件

好比 PHP 的 composer、前端的 npm,Java 的 jar包,小程序插件的出现,极大的方便了我们共享组件,减小开发量。

1K20
来自专栏企鹅号快讯

5 款最酷的 Linux 终端模拟器

Xiki 首先我要推荐的第一个终端是 Xiki。 Xiki 是 Craig Muth 的智慧结晶,他是一个天才程序员,也是一个有趣的人(有趣在此处的意思是幽默,...

545100
来自专栏老马寒门IT

11-移动端开发教程-zepto.js入门教程

Zepto.js是一个轻量级的针对现代浏览器的JavaScript库, 它与jquery有着类似的api。 如果你会用jquery,那么你也会用zepto。 1...

40750
来自专栏前端之路

–[New]Vue项目使用vw实现移动端适配教程

24230
来自专栏Google Dart

AngularDart4.0 英雄之旅-教程-07路由 顶

如果该应用程序尚未运行,请启动该应用程序。 在进行更改时,请通过重新加载浏览器窗口来保持运行。

19430
来自专栏腾讯NEXT学位

服务端渲染 vs 客户端渲染

46260

扫码关注云+社区

领取腾讯云代金券