Jump to content
Simões Lopes

Conversor de Decimal para Romano

Recommended Posts

Simões Lopes

Agradecia que me indicassem qual o erro neste programa que não efetua o cálculo. Consigo executar o programa sem a interface tkinter e dá o resultado correto.

Obrigado pela ajuda.

from tkinter import *

class Conversor:

    def __init__(self,master=None):

        self.texto1=Label(i,text='DECIMAL')
        self.texto1.place(x=30,y=20)
        self.texto2=Label(i,text='ROMANO')
        self.texto2.place(x=300,y=20)

        self.ed=Entry(i)
        self.ed.place(x=30,y=50)

        self.bt=Button(i, width=10, text='Calcular',command=self.int_to_roman)
        self.bt.place(x=30,y=120)

        self.res=StringVar
        self.lb=Label(i,text='Resultado',textvariable=self.res)
        self.lb.place(x=300,y=120)

        

    def int_to_roman(self):

        n1=self.ed.get()
        n1=int(n1)
            
        if not isinstance(n1, type(1)):
            raise ValueError ("Expected integer, got {}".format(type(n1)))
        
        if not 0 < n1 < 4000:
            raise ValueError ("Argument must be between 1 and 3999")
        
        ints = (1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1)           #Tupla com os números inteiros
        nums = ('M', 'CM', 'D', 'CD','C', 'XC','L','XL','X','IX','V','IV','I')  #Tupla com os números romanos
        result = []                                                             #Lista com o resultado da conversão

        for i in range(len(ints)):                                              #Loop para apurar o valor do número romano
            count = int(n1 / ints)                                           #A parte inteira da divisão é colacada em count
            result.append(nums * count)                                      #A letra do indice multiplicada pelo inteiro é adicionada á lista
            n1 -= ints * count                                               #O produto do indice da tupla dos inteiros pelo contador é subtraido
        return ''.join(result)
    
                                                                                # do valor do input. Os valores são juntos(join) e retornados
        self.res.set(result) 

  
i=Tk()
     
i.title('CONVERSOR DECIMAL -> ROMANO')

i.geometry('400x200')

Conversor(i)

soldier=PhotoImage(file='C:/Users/Benigno/AppData/Local/Programs/Python/Python36/Python_Tkinter/Roman_soldier.gif')
soldier=soldier.subsample(4,4)
label=Label(i,image=soldier)
label.pack()


i.mainloop()     

 

Edited by pwseo
tags de código...

Share this post


Link to post
Share on other sites
pwseo
Em 30/04/2018 às 15:43, Simões Lopes disse:

Agradecia que me indicassem qual o erro neste programa que não efetua o cálculo. Consigo executar o programa sem a interface tkinter e dá o resultado correto.

O ideal seria referires que erro o programa está a emitir para que te possamos ajudar. Referiste que consegues executar o programa sem interface tkinter e que te dá o resultado correcto... como? Eu isolei o código da tua função int_to_roman() e obtenho um erro de sintaxe.

Clarifica primeiro o que está a acontecer de errado e o que pretendes.

Share this post


Link to post
Share on other sites
Simões Lopes

Obrigado pwseo pela disponibilidade e interesse, mas consegui resolver o problema,

Assim: no final da função int_to_roman o return executa bem se não for modo de interface gráfico, caso contrário tem que se refazer os comandos:

r=(''.join(result))
self.res.set(result)

para:

r=(''.join(result))
self.lb['text']=format(r)

Até uma próxima, e Obrigado mais uma vez.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.