zoukankan      html  css  js  c++  java
  • 20181218 实验二《Python程序设计》实验报告

    20181218 2019-2020-2 《Python程序设计》实验二报告

    课程:《Python程序设计》
    班级: 1812
    姓名:
    学号:20181218
    实验教师:王志强
    实验日期:2020年4月11日
    必修/选修: 公选课

    1.实验内容

    • 设计并完成一个完整的应用程序,完成加减乘除模等运算,功能多多益善。
    • 考核基本语法、判定语句、循环语句、逻辑运算等知识点

    2. 实验过程及结果

    涉及方法、函数

    大部分需要使用tkinter模块。官方文档见博客最后参考资料部分。

    • Tk() 可以不需要参数进行实例化的一个对象,通常是应用的主窗口

    • title("标题") 设置窗口标题的方法

    • get() 得到变量当前值的方法

    • set() 设置变量当前值的方法

    • StringVar, IntVar, DoubleVar, BooleanVar 一些好用的变量子类

    • Button(master,...) 按钮组件,master是按钮的父容器,后面可添加许多可选项,见下表。

      可选项 描述
      activebackground 鼠标放上时按钮的背景色
      activeforeground 鼠标放上去时按钮的前景色
      bd 按钮边框的大小,默认为2像素
      bg 按钮的背景色
      command 按钮关联的函数,当按钮被点击时,执行该函数
      fg 按钮的前景色(按钮文本的颜色)
      font 文本字体
      height 按钮的高度
      highlightcolor 要高亮的颜色
      image 按钮上要显示的图片
      justify 显示多行文本的时候,设置不同行之间的对齐方式,可选项包括LEFT, RIGHT, CENTER
      padx 按钮在x轴方向上的内边距(padding),是指按钮的内容与按钮边缘的距离
      pady 按钮在y轴方向上的内边距(padding)
      relief 边框样式,设置控件3D效果,可选的有:FLAT, GROOVE, RAISED, RIDGE, SOLID, or SUNKEN
      state 设置按钮组件状态,可选的有NORMAL、ACTIVE、 DISABLED。默认 NORMAL
      underline 下划线。默认按钮上的文本都不带下划线。取值就是带下划线的字符串索引,为0时,第一个字符带下划线,为1时,前两个字符带下划线,以此类推
      width 按钮的宽度,如未设置此项,其大小以适应按钮的内容(文本或图片的大小)
      wraplength 限制按钮每行显示的字符的数量
      text 按钮的文本内容
      anchor 锚选项,控制文本的位置,默认为中心
    • Entry(master,...) 文本框组件,用于输入一行文本,可选项类似Button

    • grid() 几何管理类中的网格

    • pack() 几何管理类中的包装,具体可以看博客最后的参考资料

    • bind(event,handle) 事件绑定,几个常用的event:'<Button-1>'左键单击,'<Button-2>'中键单击,'<Button-3>'右键单击,'<Double-Button-1>'双击

    • eval(expression[, globals[, locals]]) 执行字符串表达式并返回表达式的值

    • mainloop() 显示窗口,开始事件循环

    计算器代码

    代码的码云链接:
    https://gitee.com/python_programming/sl_20181218/blob/27ebcf7a0d1ebd4b51e2ea84bb9159597c315ac6/exp2.py
    代码如下:

    from tkinter import *
    class Calculator:
        def __init__(self,master):
            self.master = master # 父容器
            self.initWidgets() # 调用initWidgets()方法
        def initWidgets(self):
            self.content = StringVar(self.master,'') # 设置文本框显示的字符串
            self.textarea = Entry(relief=SUNKEN,font=("Source Sans Pro Black",25),bg="LightCyan",fg="MediumBlue",width="28",textvariable=self.content) # 创建一个Entry组件
            self.textarea.pack(side=TOP,pady=10,padx=3) # 将这个组件置于窗口上方,y轴外边距为10,x轴外边距为3
            fra = Frame(self.master)
            fra.pack(side=TOP)
            Tuple = ("↺","&","|","~","^","1","2","3","+","4","5","6","-","7","8","9","*","/","0","%","**","(",")","=")
            for i in range(len(Tuple)):
                button = Button(fra,font=("Source Sans Pro Black",20),width="6",text=Tuple[i],bg="MistyRose",relief=SOLID) # 创建Button组件
                button.grid(row=i//4,column=i%4) # column后面是列数
                button.bind("<Button-1>",self.ButtonClick) # 将鼠标左键单击按钮与ButtonClick绑定
    
        def ButtonClick(self,button):
            textcontent = self.content.get() # 获取文本框的内容值
            if button.widget["text"] in ("0","1","2","3","4","5","6","7","8","9","+","-","*","/","%","**","&","|","~","^","(",")"):
                textcontent+=button.widget["text"] # 将按下的按钮上的字符串添加到变量textcontent中
                self.content.set(textcontent) # 将变量textcontent的值输出到文本框上
            elif button.widget["text"] == "=": # 当按钮的文本为"="时
                self.content.set(eval(textcontent)) # 将textcontent的值(字符串)转为表达式并计算得到结果,将结果输出到文本框上
            elif button.widget["text"] == "↺": # 当按钮的文本为"↺"时
                textcontent = "" # 将textcontent的值清零
                self.content.set(textcontent)
            else:
                self.content.set("出错啦!")
    root = Tk() # 实例化一个Tk对象
    root.title("星月计算器")
    Calculator(root) # 我理解的意思是,将原来的root对象作为参数,将Calculator实例化为新的root对象
    root.mainloop()
    

    可以实现的功能:加、减、乘、除、模、乘方、按位与、按位或、按位取反、按位异或、上下小括号。"="用于输出计算结果,"↺"用于清空。
    计算实现的原理是eval函数,即将字符串转化为表达式然后运行输出结果。而由于负责显示的文本框并没有限制为只读,所以用户不仅可以通过鼠标左键单击按钮来进行输入,也可以使用键盘直接在文本框处输入!

    打包为exe

    首先是py -3 -m pip install pyinstaller安装pyinstaller工具。

    然后来到代码文件所在路径,pyinstaller -F 文件名.py,将代码打包为一个.exe可执行文件,存在当前路径下的dist文件夹中

    打包成功!

    计算器的样子如下

    这个可执行文件我也传到了码云上,这里不再多给出测试截图,可以自行下载测试!码云链接为:
    https://gitee.com/python_programming/sl_20181218/blob/27ebcf7a0d1ebd4b51e2ea84bb9159597c315ac6/dist/exp2.exe

    3. 实验过程中遇到的问题和解决过程

    • 问题1:报错TypeError: 'int' object is not iterable
    • 问题1解决方案:将for i in len(Tuple):改为for i in range(len(Tuple)):
    • 问题2:报错_tkinter.TclError: cannot use geometry manager grid inside . which already has slaves managed by pack
    • 问题2解决方案:看到博客https://blog.csdn.net/gdkyxy2013/article/details/103855509说不能在一个程序中使用两种布局,但是网上别人的代码都是两种布局一起使用。我怀疑是Python2和Python3的区别,于是改为使用Python2,就不报错了。注意使用Python2引入库时是Tkinter而不是tkinter
      然而事情又有转机,当我遇到下面的问题3时,由于不知道错误在哪,于是将网上别人的计算器代码复制下来运行,发现用Python38运行成功了。这时我再将自己的代码改回Python3运行,发现也能成功。很神奇。因为我是一点点写的,问题是逐步出现的,可能写到后面的时候,就满足语法了?
    • 问题3:报错AttributeError: Entry instance has no attribute 'set'出错的代码:
    • 问题3解决方案:Entry和Button都不能使用set,这就解答了我对网上代码的疑惑。需要另外新建一个变量来实现set的功能。参考https://stackoverflow.com/questions/25103699/attributeerror-button-instance-has-no-attribute-set

      不报错代码如下:

      虽然不报错了,但是set并没有实现。经过print手动debug,可知get成功了,但是set还是失败。于是我复制网上的代码到本地运行,找不同纠错。而且我还是不明白,我新建的content变量,为何连着文本框的值呢?
      终于,找到不同了。原来是新建textarea这个Entry的时候,要把一个可选项textvariable设为我们新建的变量self.content。同时,这也是content与textarea产生联系的地方。
      正确代码如下:

    其他(感悟、思考等)

    这次实验是一个小尝试,我觉得趁实验的机会学习做一个图形化的计算器并且打包为可执行文件是很有趣也很有意义的。最后做出来的时候真的很开心!主要是学习了tkinter模块的一些简单的应用,我首先是找到别人写的图形化计算器的代码,然后看里面看不懂的地方,就去Python官方文档或者菜鸟教程或其他博客去查意思,逐渐读懂之后跟着写,并且在外观上自己决定,最终成功做出这个图形化的计算器。

    参考资料

    RGB颜色值与十六进制颜色码转换工具
    Python练习1--简易图形界面计算器
    关于tkinter的的布局管理pack()篇
    Python 3 教程
    tkinter --- Tcl/Tk的Python接口
    python-Tkinter中的Frame类的目的是什么?

  • 相关阅读:
    Django集成celery发送异步邮件
    Bootstrap表格实现列左右调整大小
    Django通用类视图实现忘记密码重置密码功能
    Django项目使用ckeditor(不使用admin)
    HTML提交form表单后获取返回的数据
    Django后端发送小程序微信模板消息(服务通知)
    Django对接支付宝实现支付宝充值金币功能
    Django全文搜索django-haystack+whoosh+jieba实现中文全文搜索
    Django生成PDF文档显示在网页上以及解决PDF中文显示乱码的问题
    PHP socket 接收 java端口 netty 网络字节序
  • 原文地址:https://www.cnblogs.com/hardcoreYutian/p/12678965.html
Copyright © 2011-2022 走看看