实验报告课程名称:Python编程基础与应用实验学期:2019年至2020年第1学期实验时间:2019年5 月10 日专业:班级:学号:姓名:指导教师:实践一python标准库和GUI综合练习1.1实践:python标准库和GUI练习1.1.1实验目的1.熟练掌握python标准库中常用的库函数,理解它们的基本原理,会运用它们的常用功能。
2.熟练运用python的thinkter包来构建GUI界面,掌握它的基本组件并学会运用它们。
1.1.2实验内容及步骤1.分析问题2.编写代码3.运行程序4.结果展示1.1.3程序运行过程、方法和运行结果1.使用tkinter来编写一个计算器小程序,实现+、-、*、\、\\等基本功能。
思路:1).考虑用类来包裹整个计算器,用类的属性存储界面对象、数据与运算符等。
2).考虑使用eval()函数来执行一个字符串表达式,并返回表达式的值。
import tkinter as tk# 先有整体框架,输入计算框,各种按键。
class App:def __init__(self, master):# 基本界面self.master = master# 输入组件self.initWidgets()# 表达式self.hi = Nonedef initWidgets(self):# 创建一个输入组件self.show = bel(relief=tk.SUNKEN, width=23,bg="white", anchor=tk.W)# 对该输入组件使用pack布局self.show.pack(side=tk.TOP, pady=10)p = tk.Frame(self.master)p.pack(side=tk.TOP)# 定义字符串的元组names = ("1", "2", "3", "4", "5", "6","7", "8", "9", "0", ".", "+", "-", "*", "**", "//", "/", "%", "=", "☭",)# 遍历元组for i in range(len(names)):# 创建按钮,放入frame中b = tk.Button(p, text=names[i], width=5)b.grid(row=i//5, column=i % 5)# b.pack(side=tk.LEFT, padx=0, pady=5)# 为鼠标左键的单击事件绑定事件处理方法b.bind("<Button-1>", self.click)# 为鼠标左键双击事件绑定事件处理方法if b["text"] == "☭":b.bind("<Button-1>", self.clean)# 定义一个记录输入数字次数的变量self.i = 0def click(self, event):# 如果用户单击数字或点号if (event.widget["text"] in ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".")):# 判断self.i是否为0,0的话清空show【”text“】的值if self.i == 0:self.show["text"] = ""self.show["text"] = self.show["text"] + event.widget["text"]self.i = self.i + 1print(self.i)# 如果用户单击了运算符elif(event.widget["text"] in ("+", "-", "*", "/", "%", "**", "//")):self.show["text"] = self.show["text"] + event.widget["text"]elif(event.widget["text"] == "=" and self.show["text"] is not None):# 赋值给self.hiself.hi = self.show["text"]# 调试时使用print(self.hi)# 使用eval()函数计算结果self.show["text"] = str(eval(self.hi))self.hi = Noneself.i = 0def clean(self, event):# 点击恢复按钮时,清空表达式,计数器清空self.hi = Noneself.show["text"] = ""root = ()root.title("计算器")App(root)root.mainloop()结果:点击“=”后:2.使用python的tkinter编写一个界面,例子如下:能够通过xml标准库读写xml文件:country.xml中指定国家的rank和year属性。
country.xml结构如下:<data><country name="Panama"><rank>67</rank><year>20142</year><gdppc>13600</gdppc><neighbor direction="W" name="Costa Rica" /><neighbor direction="E" name="Colombia" /></country></data>思路:将解析xml文件的代码封装为类,注意界面的布局情况,可以使用Label 和Entry等界面组件的grid函数。
import tkinter as tkimport xml.etree.ElementTree as ETclass App:"""点击get按钮时根据用户输入的国家名判断是否时xml文件里面存在的name,若是则返回行营的rank和year值点击set按钮时将用户输入的数据按原格式存入xml文件"""def__init__(self,root):#基本界面self.root=root#所需组件self.zujian()def zujian(self):#用标签label存放固定的数据,用文本框entry存放可变数据,并用grid 固定他们的位置#set和get用按钮button来创建,再用bind设置他们的响应机制#国家name,bel(self.root,text="country:",height=1,width=10).grid(row=0,column=0)self.e1=tk.StringVar()self.e11=tk.Entry(self.root,width=50,textvariable=self.e1)self.e11.grid(row=0,column=1)#rankbel(self.root,text="rank:",height=1,width=10).grid(row=1,column=0)self.e2=tk.IntVar()self.e22=tk.Entry(self.root,width=50,textvariable=self.e2)self.e22.grid(row=1,column=1)#yearbel(self.root,text="year:",height=1,width=10).grid(row=2,column=0)self.e3=tk.IntVar()self.e33=tk.Entry(self.root,width=50,textvariable=self.e3)self.e33.grid(row=2,column=1)#getb=tk.Button(root,text="get",height=1,width=15)b.grid(row=3,column=0)b.bind("<Button-1>",self.click)#setc=tk.Button(root,text="set",height=1,width=15)c.grid(row=3,column=1)c.bind("<Button-1>",self.clean)def click(self,event):#点击get按钮的响应机制tree=ET.parse('zuoye/country.xml')#创建xml树root1=tree.getroot()#得到树根for country in root1.findall('country'):#循环遍历子节点country#判断name是否和用户输入的一致,若一致则输出他们的rank和year的值if country.get('name')==self.e11.get():#子节点下属性name的值self.e1.set(country.get('name'))self.e2.set(country.find('rank').text)#子节点下节点rank的值self.e3.set(country.find('year').text)def clean(self,event):#点击set按钮的响应机制# 写入xmltree=ET.parse('zuoye/country.xml')#创建xml树root1=tree.getroot()#得到树根#创建新的子节点countrynew=ET.Element('country',{'name':self.e11.get()})ranknew=ET.SubElement(countrynew,'rank')#子节点下节点rankranknew.text=self.e22.get()yearnew=ET.SubElement(countrynew,'year')yearnew.text=self.e33.get()#向根节点添加新的子节点,可以使用append方法添加子节点root1.append(countrynew)#写入tree.write('zuoye/country.xml',encoding="utf-8",xml_declaration= True)root=()root.title("XML")App(root)root.mainloop()结果:输入name后:点击get后:填入数据:点击set后:1.1.4实验中遇到的问题及分析、解决过程1.1.4.1问题标题(如果有,请填写标题,没有则删除这小节,写“无”)1. 问题描述正文。