2017-10-20 39 views
0

Je tente de construire un convertisseur de chiffres romains en utilisant Tkinter. Je dois utiliser un bouton qui convertira les nombres décimaux en chiffres romains si les nombres sont entrés, et les chiffres romains en décimales si les chiffres sont entrés. Comment assigner les deux fonctions à un bouton, et appeler quelle fonction correspond à ce qui est entré?tkinter: affectation de plusieurs fonctions à un bouton

C'est ce que j'ai jusqu'à présent:

from tkinter import * 
    root = Tk() 
    root.title('Roman numerals') 
    root.geometry('400x300') 

    numRomanMap = (('M', 1000), ('CM', 900), ('D', 500), ('CD', 400), ('C', 100), ('XC', 90), ('L', 50), ('XL', 40), ('X', 10), ('IX', 9), ('V', 5), ('IV', 4), ('I', 1)) 

    def roman_number(): 
     roman_string = '' 
     n = float(eval(ent.get())) 
     wrongValue = ('Number is out of range') 
     if not 1 <= n <= 9999: 
        return wrongValue 
     for numeral, integer in numRomanMap: 
      while n >= integer: 
       roman_string += numeral 
       n -= integer 
     print (roman_string) 

    def decimal_number(s): 
     dec_number = 0 
     s = str(eval(ent.get())) 
     index = [] 
     for i in range(len(s)): 
      for numeral, integer in numRomanMap: 
       if s[i] == numeral: 
        index.append(integer) 
     index.append(0) 
     for i in range(len(s)): 
      if index[i] >= index[i+1]: 
       dec_number = dec_number + index[i] 
      else: 
       dec_number = dec_number - index[i] 
     print (dec_number) 

    Convertb = Button(root, text='Convert', command = roman_number) 
    ent = Entry(root) 
    ent.pack() 
    ent.delete(0, END) 
    ent.insert(0, 'Enter a number') 
    Convertb.pack() 

    root.mainloop() 
+3

pourrait faire une fonction qui vérifie simplement l'entrée de l'utilisateur, puis que bifurque dans deux autres fonctions, l'une pour l'entrée décimale et la other for RN input – Goralight

Répondre

1

Ajouter une fonction pour voir si l'entrée est un nombre.

def check_input(): 
    s = ent.get() 
    if (isinstance(s, int)): 
     roman_number(s) 
    else: 
     decimal_number(s) 

Et appeler cette fonction à partir du bouton:

Convertb = Button(root, text='Convert', command = check_input) 
+0

Est-ce que tkinters 'entry.get()' retourne int si son get est seulement int? ou est-ce toujours, peu importe l'entrée, saisir l'entrée comme un str? – Goralight

+2

@Goralight 'entry.get()' renvoie toujours une chaîne, donc vous pouvez utiliser quelque chose comme 's.isdigit()' pour vérifier l'entrée. –

+0

@ Avión Merci pour votre réponse. Je recevoir les messages d'erreur suivants: ligne 40, en check_input nombre_décimal (n) ligne 29, dans nombre_décimal si l'indice [i]> = indice [i + 1]: IndexError: index de liste hors de portée – Greta