RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 844784
Accepted
Alexshev92
Alexshev92
Asked:2020-06-21 17:11:17 +0000 UTC2020-06-21 17:11:17 +0000 UTC 2020-06-21 17:11:17 +0000 UTC

Tkinter 中的响应式 OptionMenu 长度变化

  • 772

使用 tkinter GUI 在 Python 中编写了一个简单的密码生成器程序。在复选框的帮助下,用户可以选择生成密码的来源:字母、数字、符号。在这种情况下,密码由非重复值组成,生成方式如下:

def generate():
    select = ''
    if var_letters.get() == True:
        select += string.ascii_lowercase
    if var_digits.get() == True:
        select += string.digits
    if var_symbols.get() == True:
        select += string.punctuation

    number_of_letters = menu_var.get()
    password = ''.join(random.sample(select, number_of_letters))

密码长度是通过在 OptionMenu 中选择一项来设置的,并且限制为 6 到 20 之间的值:

menu_var = IntVar()
length_of_password = [i for i in range(1,21)]
menu_var.set(6)
menu = OptionMenu(root, menu_var, *length_of_password)
menu.place(x=300,y=20)

问题就出在这里:如果我只选择数字并且密码长度超过10,那么自然会出现错误

ValueError: sample larger than population

因为 我们只有 10 位数字。尝试做这样的事情

if(var_digits.get() == True and var_letters.get() == False and var_symbols.get() == False):
    length_of_password = [i for i in range(6,11)]
else
    length_of_password = [i for i in range(6,21)]

但是,此选项不起作用。

对此,问题来了,是否可以根据用户的选择自适应地改变OptionMenu中的项数?

python
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Twiss
    2020-06-21T19:17:01Z2020-06-21T19:17:01Z

    当然,看起来可以更简单一些,但是在这种情况下,如果用户取消选中该项目,您可以简单地使用正则表达式

    import tkinter as tk
    import string
    import secrets
    import re
    
    
    class Main(tk.Tk):
    
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            self.text_generate = ""
            self.edit = tk.Text(self, state=tk.DISABLED)
            self.edit.pack()
            self.text_A = tk.Checkbutton(self, text='Заглавные буквы', var=1, command=lambda: self.gen(1)).pack()
            self.text_a = tk.Checkbutton(self, text='Обычные буквы буквы', command=lambda: self.gen(2)).pack()
            self.text_n = tk.Checkbutton(self, text='Цифры', command=lambda: self.gen(3)).pack()
    
            self.var = tk.IntVar()
            self.var.set(0)
            self.menu = tk.OptionMenu(self, self.var, 1)
            self.menu.pack()
            button = tk.Button(self, text='Генерация', command=self.generate).pack()
    
        def gen(self, num):
            if num == 1:
                if string.ascii_uppercase in self.text_generate:
                    self.text_generate = re.sub(r"[^a-z0-9]", "",  self.text_generate)
                else:
                    self.text_generate += string.ascii_uppercase
            elif num == 2:
                if string.ascii_lowercase in self.text_generate:
                    self.text_generate = re.sub(r"[^A-Z0-9]", "",  self.text_generate)
                else:
                    self.text_generate += string.ascii_lowercase
            elif num == 3:
                if string.digits in self.text_generate:
                    self.text_generate = re.sub(r"[^a-z A-Z]", "",  self.text_generate)
                else:
                    self.text_generate += string.digits
            menu = self.menu["menu"]
            menu.delete(0, "end")
            for v in range(1, (len(self.text_generate) + 1)):
                menu.add_command(label=v, command=lambda value=v: self.var.set(value))
            self.var.set(1)
    
        def generate(self):
            text = list(set(''.join(secrets.choice(self.text_generate) for _ in range(self.var.get()))))
            while len(text) != int(self.var.get()):
                text.append(secrets.choice(self.text_generate))
                text = list(set(text))
            secrets.SystemRandom().shuffle(text)
            self.edit.config(state=tk.NORMAL)
            self.edit.insert(tk.END, "".join(i for i in text) + "\n")
            self.edit.config(state=tk.DISABLED)
    
    
    if __name__ == "__main__":
        Main().mainloop()
    

    在此处输入图像描述

    • 3

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5