xml地图|网站地图|网站标签 [设为首页] [加入收藏]
控制台语音计算器,python装饰器理解
分类:编程

记得上高中时,给人当会计,帮忙结算月度工资;用的就是带语音功能的计算器! 当时用起来倍儿爽,于是速度加倍,效率加速;结果让老板赔了不少钱!

开头不讲"Hello Word",读尽诗书也枉然 : Word 操作组件介绍 - Spire.Doc 

【博主】反骨仔  【原文地址】

 

就是因为这个,才对语音计算器有了深刻印象!可能是这货坑了我!哼~!

  本打算过几天简单介绍下组件 Spire.XLS,突然发现园友率先发布了一篇,既然 xls 已经出现,为避免打上抄袭嫌疑,博主只能抢先一步使用 Spire.Doc 简单介绍 Doc 操作,下面是通过 WinForm 程序执行代码完成介绍的。

  本机环境:Win10 x64、VS 2015、MS Office 2016。

 

1.装饰器的作用

好吧,闲言少叙,直入正题吧!

目录

  • NuGet 包安装 Dll 引用文件
  • 开头不讲“Hello World”,读尽诗书也枉然
  • 文档内容检索与替换
  • 格式化操作 - 字体、颜色、排版缩进和样式等
  • 小结

 

在不修改被装饰对象的源代码以及调用方式的前提下为被装饰对象添加新功能

最近在做一个项目,有个简单的功能,就是将文本转换成语音。

介绍

   这是 E-iceblue 公司开发的其中一个组件 Spire.Doc,它专门为开发人员进行创建,读取,写入、转换打印 word 文档文件提供便利,并且,它不需要你安装 MS Office,就可以对 word 进行操作。这里使用的是免费版进行演示。

图片 1

图1 官方截图

图片 2

图2 版本间的功能的差异

 

 

原则:

研究了这个功能后,抽空顺带做了个语音计算器!

一、NuGet 包安装 Dll 引用文件

图片 3

图1-1 打开 NuGet 包管理器

图片 4

图1-2 安装完后会多 3 个引用文件

 

1.不修改被装饰对象的源代码
2.不修改被装饰对象的调用方式

“来银啊,上代码!”

二、开头不讲“Hello World”,读尽诗书也枉然

  1.先创建个空白的“demo1.docx”文件
图片 5

图2-1

  2.随便写几句代码

 1     public partial class Form1 : Form
 2     {
 3         public Form1()
 4         {
 5             InitializeComponent();
 6         }
 7 
 8         private void button1_Click(object sender, EventArgs e)
 9         {
10             //打开 word 文档
11             var document = new Document(@"demo1.docx",FileFormat.Docx);
12 
13             //取第一部分
14             var section = document.Sections[0];
15 
16             //取第一个段落
17             var paragraph = section.Paragraphs[0];
18 
19             //追加字符串
20             paragraph.AppendText("Hello World!");
21 
22             //保存为 .docx 文件
23             const string fileName = @"demo1-1.docx";
24             document.SaveToFile(fileName, FileFormat.Docx);
25 
26             //启动该文件
27             Process.Start(fileName);
28         }
29     }

图片 6

图 2-2 效果图

   【备注】别忘了引入命名空间哦: using Spire.Doc;

 

  上面是向一个空的 word 文档加上“Hello World!”,这次换成直接创建一个新的包含“Hello World!”内容的文档。当然效果跟图 2-2 一样。

 1         private void button1_Click(object sender, EventArgs e)
 2         {
 3             //创建 word 文档
 4             var document = new Document();
 5 
 6             //创建新的部分
 7             var section = document.AddSection();
 8 
 9             //创建新的段落
10             var paragraph = section.AddParagraph();
11 
12             //追加字符串
13             paragraph.AppendText("Hello World!");
14 
15             //保存为 .doc 文件
16             const string fileName = @"demo1-1.doc";
17             document.SaveToFile(fileName, FileFormat.Doc);
18 
19             //启动该文件
20             Process.Start(fileName);
21         }

 

目标:

“老大,木有银,上不了”

三、文档内容检索与替换

  1.内容检索

  先在“demo2.docx”中搞了篇《琵琶行》,启动时在文本框中输入“此时无声胜有声”进行检索。

 1         private void button1_Click(object sender, EventArgs e)
 2         {
 3             //加载 demo2.docx
 4             var document = new Document(@"demo2.docx", FileFormat.Docx);
 5 
 6             //查找所有匹配的字符串
 7             TextSelection[] textSelections = document.FindAllString(this.textBox1.Text, false, false);
 8 
 9             //修改背景色
10             foreach (TextSelection selection in textSelections)
11             {
12                 selection.GetAsOneRange().CharacterFormat.TextBackgroundColor = Color.Gray;
13             }
14 
15             //保存文件
16             const string fileName = @"demo2-1.docx";
17             document.SaveToFile(fileName, FileFormat.Docx);
18 
19             //启动该文件
20             Process.Start(fileName);
21         }

图片 7

图 3.1-1

 

  2.内容替换

  大家尝试在三的基础上简单修改下代码即可。

1             document.Replace(this.textBox1.Text, this.textBox2.Text,false,false);

图片 8

图3.2-1

 

为被装饰对象添加新功能

“哎呀我去,非逼我说粗话,来个货,把代码码上来!”

四、格式化操作 - 字体、颜色、排版缩进和样式等

  1.字体和颜色

  新建一个空白的 demo3.docx 文件。

 1         private void button1_Click(object sender, EventArgs e)
 2         {
 3             //加载 docx
 4             var document = new Document(@"demo3.docx", FileFormat.Docx);
 5 
 6             //获取第一个部分
 7             Section section = document.Sections[0];
 8 
 9             //创建一个新的段落或者取第一个段落
10             Paragraph paragraph
11                 = section.Paragraphs.Count > 0 ? section.Paragraphs[0] : section.AddParagraph();
12 
13             //追加文本
14             const string text = "This paragraph is demo of text font and color. "
15                                 + "The font name of this paragraph is Tahoma. "
16                                 + "The font size of this paragraph is 20. "
17                                 + "The under line style of this paragraph is DotDot. "
18                                 + "The color of this paragraph is Blue. ";
19             TextRange txtRange = paragraph.AppendText(text);
20 
21             //设置字体
22             txtRange.CharacterFormat.FontName = "Tahoma";
23 
24             //设置字体大小
25             txtRange.CharacterFormat.FontSize = 20;
26 
27             //设置下划线
28             txtRange.CharacterFormat.UnderlineStyle = UnderlineStyle.DotDot;
29 
30             //改变字体颜色
31             txtRange.CharacterFormat.TextColor = Color.Blue;
32 
33             //保存文件
34             const string fileName = @"demo3-1.docx";
35             document.SaveToFile(fileName, FileFormat.Docx);
36 
37             //启动该文件
38             Process.Start(fileName);
39         

图片 9

 图4.1-1

 

  2.排版缩进

  取空白的 docx 文件。

 1         private void button1_Click(object sender, EventArgs e)
 2         {
 3             //加载 docx
 4             var document = new Document(@"demo3.docx", FileFormat.Docx);
 5 
 6             //获取第一个部分
 7             Section section = document.Sections[0];
 8 
 9             //创建一个新的段落或者取第一个段落
10             Paragraph paragraph
11                 = section.Paragraphs.Count > 0 ? section.Paragraphs[0] : section.AddParagraph();
12 
13             //Append Text
14             paragraph.AppendText("这是缩进排版 Demo。");
15             paragraph.ApplyStyle(BuiltinStyle.Heading3);
16 
17             var random = new Random();
18             paragraph = section.AddParagraph();
19             for (var i = 0; i < random.Next(0, 10); i++)
20             {
21                 paragraph = section.AddParagraph();
22                 paragraph.AppendText($"I'm {i}");
23 
24                 if (i == 0)
25                 {
26                     paragraph.ListFormat.ApplyBulletStyle();
27                 }
28                 else
29                 {
30                     paragraph.ListFormat.ContinueListNumbering();
31                 }
32 
33                 paragraph.ListFormat.CurrentListLevel.NumberPosition = -10;
34             }
35 
36             //保存文件
37             const string fileName = @"缩进排版.docx";
38             document.SaveToFile(fileName, FileFormat.Docx);
39 
40             //启动该文件
41             Process.Start(fileName);
42         }

图片 10

 图4.2-1

 

  3.文本样式

 1         private void button1_Click(object sender, EventArgs e)
 2         {
 3             //创建一个新的 word
 4             var document = new Document();
 5 
 6             //创建第一部分
 7             var section = document.AddSection();
 8 
 9             //创建第一个段落
10             var paragraph = section.AddParagraph();
11 
12             //追加字符串
13             paragraph.AppendText("Builtin Style:");
14 
15             foreach (BuiltinStyle builtinStyle in Enum.GetValues(typeof(BuiltinStyle)))
16             {
17                 paragraph = section.AddParagraph(); //增加段落
18 
19                 paragraph.AppendText(builtinStyle.ToString());  //追加文本
20 
21                 paragraph.ApplyStyle(builtinStyle); //应用样式
22             }
23 
24             const string fileName = "Style.docx";
25             document.SaveToFile(fileName, FileFormat.Docx); //保存文件
26 
27             Process.Start(fileName);    //启动
28         }

图片 11

图4.3-1

 

2.装饰器的定义和使用

“好的,老大!”

小结

  以上只是几个小小的 Demo,当然,Spire.Doc 的强大远远不止如此。你使用该组件时所遇到的困难,我们可以共同来探讨哦。

 

来看下面的代码:

哈哈哈,俺就是那个带点儿逗比的搬砖员儿!好吧,代码来了,小主,等急了吧?

图片 12

using System;
using System.Speech.Synthesis;
using System.Collections.Generic;

namespace ReadTxt
{
    class Program
    {

        static string num1 = "", firchar = "", lastchar = "", tempRe = "";

        static void Main(string[] args)
        {

            Console.Title = "语音计算器";
            bool jump = true;
            do
            {

                ConsoleKeyInfo info = Console.ReadKey();
                switch (info.Key)
                {
                    case ConsoleKey.Escape: Environment.Exit(0); jump = false; break;
                    case ConsoleKey.NumPad0:    GetKeyRead("0");     break;
                    case ConsoleKey.NumPad1:    GetKeyRead("1");     break;
                    case ConsoleKey.NumPad2:    GetKeyRead("2");     break;
                    case ConsoleKey.NumPad3:    GetKeyRead("3");     break;
                    case ConsoleKey.NumPad4:    GetKeyRead("4");     break;
                    case ConsoleKey.NumPad5:    GetKeyRead("5");     break;
                    case ConsoleKey.NumPad6:    GetKeyRead("6");     break;
                    case ConsoleKey.NumPad7:    GetKeyRead("7");     break;
                    case ConsoleKey.NumPad8:    GetKeyRead("8");     break;
                    case ConsoleKey.NumPad9:    GetKeyRead("9");     break;
                    case ConsoleKey.Add:        GetKeyRead("加");    break;
                    case ConsoleKey.Subtract:   GetKeyRead("减");    break;
                    case ConsoleKey.Multiply:   GetKeyRead("乘");    break;
                    case ConsoleKey.Divide:     GetKeyRead("除");    break;
                    case ConsoleKey.Enter:
                        if (!string.IsNullOrEmpty(num1) && GetSignIsTrue(num1))
                        {
                            SetValue(num1);
                            num1 = "";
                        }
                        else
                        {
                            num1 = "";
                            if (!string.IsNullOrEmpty(num1))
                            {
                                Console.Beep();
                                Console.WriteLine("Error.");
                            }
                        }
                        break;
                    default:
                        break;
                }
            } while (jump);
            Console.Read();
        }

        //判断用户输入的内容是否合法
        static void GetKeyRead(string str)
        {
            SpeechSynthesizer spvoice = new SpeechSynthesizer();
            spvoice.Rate = 1;
            spvoice.Volume = 100;

            if (!string.IsNullOrEmpty(num1))
            {
                firchar = num1.Substring(0, 1);
                lastchar = num1.Substring(num1.Length - 1, 1);
            }

            switch (str)
            {
                case "加":
                    if (firchar != "加" && lastchar != "加")
                    {
                        if (lastchar != "减" && lastchar != "乘" && lastchar != "除")
                        {
                            num1 += str;
                        }
                        else
                        {
                            num1 = num1.Remove(num1.Length - 1);
                            num1 += str;
                        }
                    }

                    break;
                case "减":
                    if (firchar != "减" && lastchar != "减")
                    {
                        if (lastchar != "加" && lastchar != "乘" && lastchar != "除")
                        {
                            num1 += str;
                        }
                        else 
                        {
                            num1 = num1.Remove(num1.Length - 1);
                            num1 += str;
                        }
                    }

                    break;
                case "乘":
                    if (firchar != "乘" && lastchar != "乘")
                    {
                        if (lastchar != "加" && lastchar != "减" && lastchar != "除")
                        {
                            num1 += str;
                        }
                        else
                        {
                            num1 = num1.Remove(num1.Length - 1);
                            num1 += str;
                        }
                    }
                    break;
                case "除":
                    if (firchar != "除" && lastchar != "除")
                    {
                        if (lastchar != "加" && lastchar != "减" && lastchar != "乘")
                        {
                            num1 += str;
                        }
                        else
                        {
                            num1 = num1.Remove(num1.Length - 1);
                            num1 += str;
                        }
                    }
                    break;
                default:
                    num1 += str;
                    break;
            }
            spvoice.SpeakAsync(str);
            Console.Clear();
            Console.Write(tempRe + num1.Replace('加', '+').Replace('减', '-').Replace('乘', '*').Replace('除', '/').Replace("等于", "="));
        }

        static bool GetSignIsTrue(string num1) 
        {
            if (!string.IsNullOrEmpty(num1))
            {
                firchar = num1.Substring(0, 1);
                lastchar = num1.Substring(num1.Length - 1, 1);
            }

            return firchar != "加" && lastchar != "加" && firchar != "减" && lastchar != "减" && firchar != "乘" && lastchar != "乘" && firchar != "除" && lastchar != "除";
        }

        //计算
        static void SetValue(string num1)
        {
            List<double> array = new List<double>();
            List<string> sign = new List<string>();
            num1 = num1.Replace('加', '+').Replace('减', '-').Replace('乘', '*').Replace('除', '/');
            string tempCap = "";
            char[] MyChar = num1.ToCharArray();
            for (int i = 0; i < MyChar.Length; i++)
            {
                if (MyChar[i].ToString() == "+" || MyChar[i].ToString() == "-" || MyChar[i].ToString() == "*" || MyChar[i].ToString() == "/")
                {
                    array.Add(Convert.ToDouble(tempCap));
                    tempCap = "";
                    sign.Add(MyChar[i].ToString());
                }
                else
                {
                    if (i == MyChar.Length - 1)
                    {
                        tempCap += MyChar[i].ToString();
                        array.Add(Convert.ToDouble(tempCap));
                    }
                    else
                    {
                        tempCap += MyChar[i].ToString();
                    }
                }
            }

            double resultTemp = 0;
            for (int i = 0; i < sign.ToArray().Length; i++)
            {
                if (sign[i] == "*")
                {
                    resultTemp = array[i] * array[i + 1];
                    array[i] = resultTemp;
                    array.Remove(array[i + 1]);
                    sign.Remove(sign[i]);
                    resultTemp = 0;
                    i--;
                }
                else if (sign[i] == "/")
                {
                    resultTemp = array[i] / array[i + 1];
                    array[i] = resultTemp;
                    array.Remove(array[i + 1]);
                    sign.Remove(sign[i]);
                    resultTemp = 0;
                    i--;
                }
            }

            for (int i = 0; i < sign.ToArray().Length; i++)
            {
                if (sign[i] == "+")
                {
                    resultTemp = array[i] + array[i + 1];
                    array[i] = resultTemp;
                    array.Remove(array[i + 1]);
                    sign.Remove(sign[i]);
                    resultTemp = 0;
                    i--;
                }
                else if (sign[i] == "-")
                {
                    resultTemp = array[i] - array[i + 1];
                    array[i] = resultTemp;
                    array.Remove(array[i + 1]);
                    sign.Remove(sign[i]);
                    resultTemp = 0;
                    i--;
                }
            }

            double answ = array[0];
            array.Clear();
            sign.Clear();
            tempRe += num1.Replace('加', '+').Replace('减', '-').Replace('乘', '*').Replace('除', '/') + "= " + answ + "n";
            GetKeyRead("等于" + answ);
        }
    }
}

index函数的作用是程序在随机睡眠1到5秒之后,打印一句话

ok,这就是全部代码了,请容在下粗略的介绍下实现步骤:

现在想为index函数添加一个新功能:统计index函数的运行时间,该怎么做呢??

1.既然是语音计算器,首先要解决的就是如何实现语音?

修改index函数如下:

其实,语音功能实现起来并不复杂,微软早就封装好了一个,将文本转换成语音功能的类库,现在你要做的就是:找到它,然后把它引用到你的项目里!

图片 13

什么?这个类库叫啥?

运行程序,执行结果如下:

表急嘛,心急吃不了“热豆腐”,有可能“豆腐”还跑了呢,要耐心点儿,才能约到手!是吧?

welcome to index page
cost time: 2.000999927520752

好吧,介绍下这个类库,它叫“System.Speech.dll”。.net FrameWork 的安装目录里就有它的身影!装了.net FrameWork 的童鞋,可以通过以下目录去寻觅它!

可以看到,为index函数添加新功能确实实现了,但是却违反了开放封闭原则。

大概是这个:C:Program Files (x86)Reference AssembliesMicrosoftFramework.NETFrameworkv4.5

在符合开放封闭原则的前提下,如果想为index函数添加新功能,此时就要使用装饰器了

寻寻觅觅,冷冷清清,凄凄惨惨戚戚!什么?没寻觅到?

修改代码

好吧,教你一招

图片 14

图片 15

运行程序,查看执行结果

 

welcome to index page
run time: 1.0

打开C盘,直接搜索!

从程序执行结果可以看出,index函数的运行时间已经被统计出来了

没装的,那就去网上搜吧,自己下崽儿!哈哈~!愿意装的也可以装一下!

但是查看源码可以知道,index函数的源码确实没有被修改,但是index的调用方式被修改了

找到的,直接引用到项目里就行了哈!

而且还有一个问题就是,timmer这个装饰器只能被用来装饰index这个函数,如果以后想统计别的函数的运行时间,又要重新定义别的装饰器,这样也太不灵活了。

2.其次,别忘了引用下这两个命名空间:

修改上面的代码

  using System.Speech.Synthesis;  //语音类库

图片 16

  using System.Collections.Generic;  //数组集合类库

运行程序,查看程序执行结果

3.最后,简单介绍下文本转换成语音的功能!

welcome to index page
run time: 4.0

其实,也就几句话!

可以看到,index函数的源代码没有被修改,index函数的调用方式也没有改变,但是依然为index函数添加了统计时间的功能,这里使用的就是装饰器了。

SpeechSynthesizer spvoice = new SpeechSynthesizer();  //语音类
spvoice.Rate = 1;            //使用 spvoice 设置朗读频率 [范围 -10 ~ 10] 
spvoice.Volume = 80;         //使用 spvoice 设置朗读音量 [范围 0 ~ 100] 
spvoice.SpeakAsync("大家好,我是博主小白!");   //开始读

来分析下上面代码的执行流程:

好了,其他的代码就要看小主的内力了,在下就不多说了!

图片 17

本文由澳门新葡亰手机版发布于编程,转载请注明出处:控制台语音计算器,python装饰器理解

上一篇:没有了 下一篇:自定义日志记录,JObject转换的使用方法
猜你喜欢
热门排行
精彩图文