2017-02-27 4 views
1

Volé de mon post précédent, c'est le but de ce post.Comment renommer les boutons lorsque 'E' est pressé

Les systèmes de chambre forte de banque qui ont un pavé numérique tactile pour l'entrée de la broche sont vulnérables à une mauvaise utilisation par un voleur. Les voleurs peuvent utiliser les caméras, eux-mêmes ou même d'autres personnes pour voir le motif que fait une broche à 4 chiffres lorsqu'elle est entrée; par conséquent, ils n'ont pas besoin de connaître la valeur réelle de votre broche, juste la séquence des pressions sur les boutons qui permettent l'entrée dans le système. Pour surmonter ce défaut fatal, un écran tactile doté d'une interface graphique peut être utilisé, les touches étant mélangées à chaque fois que la broche est entrée, qu'elle soit correcte ou non. En essayant de mélanger la matrice du clavier à chaque fois qu'un 'E' est reçu (ce qui fonctionne), l'interface graphique refuse de mettre à jour. Im essayant d'obtenir les nombres et les lettres à mélanger chaque fois qu'un utilisateur entre leur épingle. Toute aide est appréciée.

#!/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() 

Répondre

0

changement enumerate(keys, 1)-enumerate(keys) et b.grid(row=y, column=x, ipadx=20, ipady=20)-b.grid(row=y+1, column=x, ipadx=20, ipady=20) afin que l'entrée peut être affichée.

Code complet:

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() 
+0

Je mis en œuvre ce que vous avez dit, mais l'interface graphique ne marche pas mettre à jour le texte sur les boutons. Je pense que le 'pour la clé dans les touches: random.shuffle (clé) random.shuffle (keys) impression (keys)' partie doit être déplacée sous le 'valeur elif == 'E':' mais il ne sera toujours pas mélanger l'interface graphique pour moi quand j'appuie sur 'E'. – greatgamer34

+0

Vous pourriez mieux expliquer ce que vous voulez faire – eyllanesc

+0

Dois-je poster mon code mis à jour? – greatgamer34