按“E”时如何重命名按钮

时间:2017-02-27 03:49:08

标签: python user-interface tkinter shuffle keypad

从我之前的帖子中偷来了,这就是这篇文章的目的。

具有用于引脚输入的触觉数字键盘的银行金库系统容易被小偷误用。窃贼可以使用相机,自己或其他人来查看输入时4位数针脚所产生的图案;因此,他们不需要知道您的引脚的实际值,只需按下按钮的顺序就可以进入系统。为了克服这个致命的缺陷,可以使用带有数字键盘GUI的触摸屏显示器,每次输入引脚时,键都会被洗牌,无论它是否正确。

我每次收到'E'时都试图改变键盘矩阵(这是有效的),但GUI拒绝更新。我试图在用户输入引脚的任何时候让数字和字母进行随机播放。任何帮助表示赞赏。

#!/usr/bin/env python3

import Tkinter as tk
import random

def code(value):
    # inform function to use external/global variable
    global pin

    if value == 'D':
        # remove last element from `pin`
        pin = pin[:-1]
        # remove all from `entry` and put new `pin`
        e.delete('0', 'end')
        e.insert('end', pin)

    elif value == 'E':
         # check pin

       if pin == "3529":

        print("PIN OK")


       else:
            print("PIN ERROR!")
            # clear pin
            pin = ''
            e.delete('0', 'end')


    else:
        # add number to `pin`
        pin += value
        # add number to `entry`
        e.insert('end', value)

    print("Current:", pin)



# --- main ---

# keypad description
keys = [
['1', '2', '3'],
['4', '5', '6'],
['7', '8', '9'],
['D', '0', 'E'],
]



for key in keys:
    random.shuffle(key)
    random.shuffle(keys)
    print(keys)

# create global variable 
pin = '' # empty string

# init
root = tk.Tk()

# create `entry` to display `pin`
e = tk.Entry(root, justify='right')
e.grid(row=0, column=0, columnspan=3, ipady=5)

# create `buttons` using `keys
for y, row in enumerate(keys, 1):
    for x, key in enumerate(row):
        # `lambda` inside `for` have to use `val=key:code(val)`
        # instead of direct `code(key)`
        b = tk.Button(root, text=key, command=lambda val=key:code(val))
        b.grid(row=y, column=x, ipadx=20, ipady=20)

# start program

root.mainloop()

1 个答案:

答案 0 :(得分:0)

enumerate(keys, 1)更改为enumerate(keys),将b.grid(row=y, column=x, ipadx=20, ipady=20)更改为b.grid(row=y+1, column=x, ipadx=20, ipady=20),以便显示该条目。

完整代码:

import tkinter as tk
import random

def code(position):
    global pin
    b = buttons[position]
    value = b['text']

    if value == 'D':
        # remove last element from `pin`
        pin = pin[:-1]
        # remove all from `entry` and put new `pin`
        e.delete('0', 'end')
        e.insert('end', pin)

    elif value == 'E':
        # check pin
        if pin == "3529":
            print("PIN OK")
        else:
            print("PIN ERROR!")
            # clear pin
            pin = ''
            e.delete('0', 'end')
    else:
        # add number to `pin`
        pin += value
        # add number to `entry`
        e.insert('end', value)

    print("Current:", pin)

    shuffle_buttons()

def shuffle_buttons():
    for key in keys:
        random.shuffle(key)
    random.shuffle(keys)
    for y, row in enumerate(keys):
        for x, key in enumerate(row):
            b = buttons[(x, y)]
            b['text'] = key                

# --- main ---

# keypad description

keys = [
    ['1', '2', '3'],
    ['4', '5', '6'],
    ['7', '8', '9'],
    ['D', '0', 'E'],
]

buttons = {}

# create global variable 
pin = '' # empty string

# init
root = tk.Tk()

# create `entry` to display `pin`
e = tk.Entry(root, justify='right')
e.grid(row=0, column=0, columnspan=3, ipady=5)

# create `buttons` using `keys
for y, row in enumerate(keys):
    for x, key in enumerate(row):
        position  = (x, y)
        b = tk.Button(root, text= key, command= lambda val=position: code(val))
        b.grid(row=y+1, column=x, ipadx=20, ipady=20)

        buttons[position] = b

shuffle_buttons()

root.mainloop()