数据类型
作业1:从键盘输入一个字符串,统计大写字母、小写字母、数字字符和其他字符的个数 。 请完成三种以上不同形式的输出。
python
s = input('请输入字符串s:' )u,l,d,e=0,0,0,0for i in s:if i.isupper():u += 1elif i.islower():l += 1elif i.isdigit():d += 1else:e += 1print(str.format('字符串s中大写字母{}个,小写字母{}个,数字字符{}个,其他字符{}个',u,l,d,e))print('字符串s中大写字母{}个,小写字母{}个,数字字符{}个,其他字符{}个'.format(u,l,d,e))print(f'字符串s中大写字母{u}个,小写字母{l}个,数字字符{d}个,其他字符{e}个')
作业2:尝试独立编写,从键盘输入最近几天的温度,用逗号分隔,求最高温度和最低温度,保留2位小数。
python
tem = input("请输入最近几天的温度,用半角逗号分隔:")list = tem.split(",") #分隔符为半角逗号max = float(max(list)) #求列表list中元素的最大值min = float(min(list))print(str.format("最高温度是{:.2f}度,最低温度是{:.2f}度",max,min))
作业3:尝试完成登录小程序,要求随机产生4位验证码,验证码可以包括大小写字母和数字字符。
python
import randoms = "FpV74ctsYQqIW9JMhPRcs1UfRxm9XY6ZAnBD9zFqeshgi1FLglIZI63nQRGkTS27jTlJrbSpPD2" #随机长字符串input_str = ""for i in range(4):ran = random.randint(0,len(s)-1)input_str = input_str + s[ran] #ran是长字符串中任意一个字符的索引print(str.format("随机验证码是:{}",input_str))login_name = input("请输入用户名:")login_pass = input("请输入登录密码:")login_str = input("请输入随机验证码:")if login_name == "test" and login_pass == "passw0rd" and login_str == input_str:print(str.format("用户{}已成功登录!",login_name))elif login_str != login_str:print("验证码错误")else:print("用户名与密码不匹配")
作业4:输入一个月份数字,返回对应月份名称缩写。
python
months = "JanFebMarAprMayJunJulAugSepOctNovDec"m = input("请输入月份数,要求在1-12之间:")indices = (int(m)-1)*3 #月份简写的切片首字母索引和月份数的关系output = months[indices:indices+3] #包左不包右print(str.format("月份简写是{}",output))
控制结构
作业1:分段函数—各种数学函数的练习。
python
from math import *x = eval(input("请输入x的值:"))if (x <=0 ):y = sin(x)+eelse:y = log(x)print(f"y的值是{y:.2f}")
作业2:闰年的判断。
闰年是能被4整除,但不能被100整除的年份(例如2008是闰年,1900不是闰年) ,能被400整除的年份(例如2000年)也是闰年。
python
year = eval(input("请输入年份:"))if year % 400 == 0 or (year % 4 == 0 and year % 100 != 0):print(str.format("{}年是闰年",year))else:print(str.format("{}年不是闰年",year))
作业3:百分制转换为五级制。
python
point = eval(input("请输入分数,0-100之间:"))grade = ""if point >= 90:grade = "优秀"elif point >= 80:grade = "良好"elif point >= 70:grade = "一般"elif point >= 60:grade = "及格"else:grade = "不及格"print(str.format("此分数{}",grade))
作业4:打印九九乘法表。
python
for i in range(1,10): #乘数i的取值区间为[1,9]for j in range (1,i+1): #乘数j的取值区间为[1,i]s = i*jprint(str.format("{}*{}={}",i,j,s,),end=" ") #当乘数i相同时以空格为结束符将打印结果分隔开print() #回车
作业5:打印斐波那契数列。
python
a, b = 0, 1while b < 1000:print(b,end = " ") #规定以空格为结束符a, b = b, a + b
作业6:打印100-200之间的素数。
python
nums = [] #生成一个空列表numsfor num in range(100,201):for i in range(2,num): #被除数i的取值区间为[2,num-1]if num % i == 0:breakif num == i+1: #当i取到最大值num-1依旧不满足num % i == 0,判断num是素数nums.append(num) #将对象num加入列表nums的末端print("100-200之间的素数有:",nums)
拓展:输入一个正整数,判断是否为素数。
python
x = input("请输入一个正整数,按q退出:")if x.upper() == "Q": #若将字符串全部大写后等于Q,退出程序exitelse:x = eval(x) #将字符串转换为数值型for i in range(2,x):if x % i == 0:print(f"{x}不是素数")breakif x == i + 1:print(f"{x}是素数")
作业7:完善四组运算小程序。
python
a = eval(input("请输入数字a:"))op = input("请输入四则运算符(+-*/):")b = eval(input("请输入数字b:"))if op != "+" or "-" or "*" or "/":print("请输入正确的四则运算符!")else:if op == "+":s = a + belif op == "-":s = a - belif op == "*":s = a * belif op == "/":s = a / bprint(str.format("计算结果为{}{}{}={}",a,op,b,s))
作业8:完善登录小程序。
python
import randomstr1 = ""for i in range(6):ran = random.randint(1,9)str1 = str1 + str(ran)#生成六位数字验证码,登录print(str.format("验证码是{}",str1))login_name = input("请输入用户名:")login_pass = input("请输入登录密码:")login_str = input("请输入随机验证码:")if login_name == "test" and login_pass == "passw0rd" and login_str == str1:print(str.format("用户{}已成功登录!",login_name))elif login_str != str1:print("验证码错误")else:print("用户名与密码不匹配")
作业9:完善猜数字小游戏。
python
import randomprint("=" * 30)print("欢迎来到猜数字小游戏!")print("=" * 30)ran = random.randint(0, 10)num = eval(input("请输入数字(0-9):"))i = 1while i <= 3: #尝试少于三次if num > ran :print("大了!")elif num < ran:print("小了!")else:print("恭喜你,猜中了!")breaknum = eval(input("请输入数字(0-9):"))i += 1else: #第四次if num != ran:print("已经尝试四次失败了,请再试一次吧!")if num == ran:print("恭喜你,猜中了!")
函数与模块
作业1:定义计算并返回第n阶调和数(1 + 1/2 + 1/3 + … + 1/n)的函数,并调用该函数。
python
def harmonic(n): #计算n阶调和数(1+1/2+1/3+...+1/n)total=0.0for i in range(1,n+1):total+=1.0/ireturn totaln=eval(input("请输入正整数n:"))print(harmonic(n))
作业2:定义一个函数,其功能是求正整数的阶乘,并利用该函数求解6!、16!和26!的结果。
python
def func(n):s =1if n == 0:return 1elif n >= 1:for i in range(1, n + 1) :s *= ireturn selse:print('出错')print(func(6))print(func(16))print(func(26))
作业3:定义一个登录函数,定义一个获取验证码的函数,允许用户登录3次。
python
import randomdef code(n) :str1 = ""for i in range(n):ran = random.randint(1,9)str1 += str(ran)return str1#生成n位数字验证码,登录code1 = code(4)print(str.format("验证码是{}",code1))login_name = input("请输入用户名:")login_pass = input("请输入登录密码:")login_str = input("请输入随机验证码:")def login(login_name,login_pass,login_str):name = "test"pwd = "passw0rd"for i in range(3) :if login_name == name and login_pass == pwd and login_str == code1 :print(str.format("用户{}已成功登录!", login_name))breakelse :print("请重试")login_name = input("请输入用户名:")login_pass = input("请输入登录密码:")login_str = input("请输入随机验证码:")else :print("用户被锁定")#登录函数login(login_name,login_pass,login_str)
文件操作和异常
作业1:设计一个图书管理小程序。
python
import jsonimport osfilename = 'family.json'# 判断文件是不是存在json_file = os.path.exists(filename)books =[]#增加图书def add_books():global books# 文件存在if json_file:with open(filename)as f:books = json.load(f)while True:name = input('请输入要添加的图书:')isExist = Falsefor book in books:if book['name']==name:print('该书已存在')isExist = Truebreak# 用户输入的图书不在books中if not isExist:price = input('请输入价格:')book = {}book['name'] = namebook['price'] = pricebooks.append(book)print('图书添加成功!')answer = input('继续增加吗?(y/n)')if answer.upper() == 'Y':continueelse:breakwith open(filename,'w')as f:json.dump(books,f)return#浏览图书def show_books():if json_file:#文件存在with open(filename)as f:books = json.load(f)for book in books:print(book['name'],'价格是',book['price'])return#删除图书def del_books():if json_file:with open(filename)as f:books = json.load(f)while True:name = input('请输入要删除的图书:')isDel = Falsefor index, book in enumerate(books):if book['name'] == name:isDel = Truebooks.pop(index)if isDel:print('图书删除成功!')else:print('不存在图书{}!'.format(name))answer = input('继续删除吗?(y/n)')if answer.upper() == 'Y':continueelse:breakwith open(filename,'w')as f:json.dump(books,f)return#查询图书def search_books():if json_file:with open(filename)as f:books = json.load(f)name= input('请输入要查询的图书:')for book in books:if book['name'] == name:print(book['name'], book['price'])returnprint("不存在名字是{}的图书".format(name))def main():while True:print('欢迎使用图书小程序!')print('|-------1.图书增加--------|')print('|-------2.图书浏览--------|')print('|-------3.图书查询--------|')print('|-------4.图书删除--------|')print('|-------5.退出------------|')n = input('请选择要进行的操作:')if n=='1':add_books()input('按回车键继续...')elif n=='2':show_books()input('按回车键继续...')elif n=='3':search_books()elif n == '4':del_books()elif n == '5':breakelse:print('请输入1-5之间的数!')breakif __name__=='__main__':main()
类与对象
作业1:建立银行卡类
属性:账户名、余额
方法: 0. 通过init实现属性初始化
存款(金额)
取款(金额)
转账(card)给card转*\钱,对应的余额属性要减少
打印对象要显示的所有属性信息
python
class Card:def __init__(self, number, name, blance):self.number=numberself.name=nameself.blance=blancedef save_money(self, blance):self.blance+=blancedef get_money(self, blance):if blance>self.blance:print("余额不足")return Falseelse:self.blance -=blancereturn Truedef search_blance(self):print("卡号{},姓名{} 的余额是{}".format(self.number, self.name, self.blance))def give_money(self, card, blance):if blance>self.blance:print("余额不足")else:card.blance += blanceself.blance -= blanceflag = self.get_money(blance)if flag:card.save_money(blance)class ATM:def __init__(self, name=None, size=None, card=None):self.name = nameself.size = sizeself.card = carddef insert_card(self, card):self.card = carddef save_money(self, blance):self.card.save_money(blance)def get_money(self, blance):self.card.get_money(blance)def search_blance(self):self.card.search_blance()def give_money(self, card, blance):self.card.give_money(card, blance)card1 = Card('00123', '小明', 10000)card1.search_blance()card1.save_money(8000)card1.search_blance()card1.get_money(2000)card1.search_blance()card2 = Card('00112', '小华', 0)card1.give_money(card2, 20000)card2.search_blance()atm = ATM()atm.insert_card(card1)atm.search_blance()atm.save_money(8000)atm.search_blance()
作业2:编写简单的工资管理程序,系统可以管理以下四类人:工人(worker)、销售员(salesman)、经理(manager)、销售经理(salesmanager)。所有的员工都有员工号,姓名,工资等属性,有设置姓名,获取姓名,获取员工号,计算工资等方法。 1)工人,工人具有工作小时数和时薪的属性,工资计算法为基本工资+工作小时数时薪 2)销售员:具有销售额和提成比例的属性,工资计算方法为基本工资+销售额提成比例 3)经理:具有固定月薪的属性,工资计算方法为固定月薪 4)销售经理:工资计算方法为销售额*提成比例+固定月薪 请根据以上要求设计合理的类,完成以下功能: 1)创建的不同类型的员工 2)计算月薪 3)显示所有人的工资情况
python
class Person:def __init__(self,no,name,salary):self.no = noself.name = nameself.salary = salarydef __str__(self):msg = '工号:{},姓名:{},本月工资:{}'.format(self.no,self.name,self.salary)return msg#def getSalary(self):#return self.salaryclass Worker(Person):def __init__(self,no,name,salary,hours,per_hour):super().__init__(no,name,salary)self.hours = hourself.per_hour = per_hourdef getSalary(self):money = self.hours * self.per_hourself.salary += moneyreturn self.salaryclass Salesman(Person):def __init__(self,no,name,salary,salemoney,percent):super().__init__(no,name,salary)self.salemoney = salemoneyself.percent = percentdef getSalary(self):money = self.salemoney * self.percentself.salary += moneyreturn self.salary
课程设计:设计一个图书馆里系统。
python
import sqlite3 # 导入sqlite数据库操作模块import tkinter # 导入Tkinter GUI图形界面模块# 由于是一个基于数据库的管理系统, 因此程序运行就建立数据库连接, 最后还要关闭连接conn = sqlite3.connect("./books.db")# 作为简单的演示程序, 我们只创建一个books表, 包含4个字段(列) ID, ISBN, TITLE, AUTHOR# 数据库里同样的表名只能有一个, 为了防止第二次以后运行出错, 建表SQL语句中 使用了 IF NOT EXISTS 防止出错sql = '''CREATE TABLE IF NOT EXISTS books (id INTEGER PRIMARY KEY AUTOINCREMENT,isbn CHAR(36) UNIQUE NOT NULL,title TEXT NOT NULL,author TEXT);'''conn.execute(sql)conn.commit()# 做测试数据 开始>>>>>>>>>># 为了方便调试, 如果数据库里没有数据, 我们查询一下books表里是否有数据, (顺带了解一下查询有多少条数据的SQL)# 如果没有数据,我们添加几条测试数据进去, 仅仅为调试用, 这一段可以注释掉的sql = '''SELECT COUNT(*) FROM books'''cur = conn.cursor()cur.execute(sql)row = cur.fetchone() # 取第一条if row[0] == 0:sql = '''INSERT INTO books (isbn, title, author) VALUES (?, ?, ?);'''cur.execute(sql, ('isbn001', '庆余年', '猫腻'))cur.execute(sql, ('isbn002', '赘婿', '愤怒的香蕉'))cur.execute(sql, ('ABCD1234', '天龙八部', '金庸'))conn.commit()# 做测试数据 结束<<<<<<<<<<<<<<<<<<<# 创建主窗口winMain = tkinter.Tk()winMain.title('图书管理系统')# 设置窗口大小:宽x高,注,此处不能为 "*",必须使用 "x" 字母xyz的xwinMain.geometry('800x600')# 在窗口中添加控件# 1. 添加一个静态文本控件, 显示"图书一览"这几个字lbl = tkinter.Label(winMain, text="图书一览")lbl.place(x=5, y=5) # 让静态文本控件使用tkinter控件几何布局, place是相对于窗口左上角的相对位置指定, 左上角(0,0) 向右向下是+# tkinter控件的几何布局有下面几个:# pack() 包装;# grid() 网格;# place() 位置;# 2. 添加一个表格控件, 显示图书数据# tkinter没有专门的表格控件,表格是用Treeview实现的, 具体参考Treeview的API文档,# 只要是GUI编程就没有简单短小的代码, 只能去查阅API, 设置显示参数以及数据, 下面例子的用法供参考# 这里先定义一个列名称的元组, 用于表格控件的列定义columns = ("id", "isbn", "title", "author")# 再定义一个列标题的元组, 用于表格控件列标题的显示titles = ("ID", "版号", "书名", "作者")# 开始创建这个表格控件from tkinter.ttk import Treeview # Treeview在tkinter.ttk包里, 因此需要这样引用进来grid = Treeview(winMain, columns=columns, show='headings')# y=30 的原因是要让出30的位置给上面的静态文本"图书一览" width=790的原因是左右去掉5个边距grid.place(x=5, y=30, width=790, height=530)# 循环设置列标题for i, c in enumerate(columns, 0):grid.heading(c, text=titles[i])# 查询数据并将数据显示到表格中去# 由于在增,改,删这些操作之后都需要重新查询一下数据并显示,因此将查询并显示这部分代码封装到一个函数中, 调用这个函数即可# 先定义查询并在表格中显示所有图书函数, 为了更加通用, 因此将书名作为查询条件参数, 参数是空查询全部def researchBooks(title):# 清空表格中以前显示的值for row in grid.get_children():grid.delete(row)# 根据不同情况 拼接带条件或者不带条件的SQL语句sql = ''' SELECT id, isbn, title, author FROM books '''cur = conn.cursor()if title is not None and title != '': # 带条件的SQL语句sql += " WHERE title like '%" + title + "%' ORDER BY id"else: # 不带条件的sql += ' ORDER BY id'cur.execute(sql)# 将数据库里查询出来的值, 逐条添加到表格控件中显示for row in cur:grid.insert('', 'end', values=row)# 调用上面这个查询函数researchBooks(None)# 窗口左下角, 添加4个控件, 一个静态文本:"输入书名:", 一个文本框控件让用户可以输入书名, 一个 "查询" 按钮, 一个"清空"按钮# 添加"输入书名:"静态文本lblHint = tkinter.Label(winMain, text="输入书名:")lblHint.place(x=5, y=600-5-30, width=80)# 添加用户可以输入书名的文本框控件txtTitle = tkinter.Entry(winMain)txtTitle.place(x=5+80+5, y=600-5-30, width=120, height=30)# 添加查询按钮# 因为查询按钮要绑定查询图书的事件函数, 因此先定义并实现这个查询函数def onBtnSearchClick():title = txtTitle.get()# 调用查询函数, 并把查询结果显示到表格里researchBooks(title)# 创建查询按钮并绑定点击事件,然后放置到窗口上btnSearch = tkinter.Button(winMain, text="查询", command=onBtnSearchClick)btnSearch.place(x=5+80+5+120+5, y=600-5-30, width=60, height=30)# 创建清空按钮并绑定点击事件,然后放置到窗口上# 同样先定义清空按钮的事件def onBtnClearClick():txtTitle.delete(0, tkinter.END) # 这是清空文本框的方法# 重新查询所有的值, 并刷新表格控件researchBooks(None)btnClear = tkinter.Button(winMain, text="清空", command=onBtnClearClick)btnClear.place(x=5+80+5+120+5+60+5, y=600-5-30, width=60, height=30)# 窗口右下角添加操作按钮, 从右到左三个按钮: 添加图书, 修改图书, 删除图书# 添加图书按钮, 也是同样先定义按钮的点击事件def onBtnAddClick():# 当点击添加按钮的时候, 我们先创建一个窗口, 让用户输入图书的信息dlg = tkinter.Toplevel(winMain) # 用Toplevel创建一个子窗口, 参数是主窗口dlg.geometry('400x145') # 对话框的几何属性, 窗口大小参数的意义和上面主窗口一样dlg.title('添加图书') # 设置标题# 添加控件# 图书id在数据库中是自增长的, 所以不用设置控件# isbn 的标签(label)和文本框(Entry)lblIsbn = tkinter.Label(dlg, text='ISBN:')lblIsbn.place(x=5, y=5, width=80, height=30)txtIsbn = tkinter.Entry(dlg)txtIsbn.place(x=5+80+5, y=5, width=400-5-80-5-5, height=30)# title 的label和EntrylblTitle = tkinter.Label(dlg, text='书名:')lblTitle.place(x=5, y=40, width=80, height=30)txtTitle = tkinter.Entry(dlg)txtTitle.place(x=5 + 80 + 5, y=40, width=400 - 5 - 80 - 5 - 5, height=30)# author 的label和EntrylblAuthor = tkinter.Label(dlg, text='作者:')lblAuthor.place(x=5, y=80, width=75, height=30)txtAuthor = tkinter.Entry(dlg)txtAuthor.place(x=5 + 80 + 5, y=75, width=400 - 5 - 80 - 5 - 5, height=30)# 保存按钮, 创建保存按钮之前也要先定义按钮点击的事件函数def onBtnSaveClick():# 取出画面上用户输入的数据isbn = txtIsbn.get()title = txtTitle.get()author = txtAuthor.get()# 这个地方要做几个错误检查,例如isbn的长度, isbn是否重复 等, 为了方便阅读学习代码此处略# 错误检查后, 更新到数据库中sql = 'INSERT INTO books (isbn, title, author) VALUES (?, ?, ?)'cur = conn.cursor()# 执行sql的时候, 最好用Try来捕获异常, 如果错误的话给出提示, 为了方便阅读学习代码此处略cur.execute(sql, (isbn, title, author))conn.commit()# 保存结束以后, 调用researchBooks函数, 将主画面表格刷新即可researchBooks(None)# 关闭新建这个对话框, 整个事件结束dlg.destroy()# 创建保存按钮并把上面这个保存事件和按钮绑定btnSave = tkinter.Button(dlg, text="保存", command=onBtnSaveClick)btnSave.place(x=400-5-80, y=110, width=80, height=30)# 显示这个对话框dlg.mainloop()# 主窗口上创建并安放添加图书按钮,并绑定点击事件为上面定义的onBtnAddClick事件函数btnAdd = tkinter.Button(winMain, text="添加图书", command=onBtnAddClick)btnAdd.place(x=800-5-80, y=600-5-30, width=80, height=30)# 修改图书按钮, 也是同样先定义按钮的点击事件def onBtnUpdateClick():# 当点击修改图书按钮的时候, 先要取得主窗口上选择的哪一行图书数据item = grid.item(grid.selection()) # 表格控件选择的那一行元素if item is None: # 保护一下, 防止没在表格中选择一行图书而出错returnrow = item['values'] # 表格中这一行的值(是一个列表: [id, isbn, 书名, 作者])id = row[0] # 取得主键idisbn = row[1] # isbntitle = row[2] # 书名author = row[3] # 作者# 我们创建一个窗口, 把用户选择的图书的信息显示出来,并让用户修改dlg = tkinter.Toplevel(winMain) # 用Toplevel创建一个子窗口, 参数是主窗口dlg.geometry('400x145') # 对话框的几何属性, 窗口大小参数的意义和上面主窗口一样dlg.title('修改图书') # 设置标题# 添加控件# 图书id是主键, 所以不用设置控件# isbn 的label和EntrylblIsbn = tkinter.Label(dlg, text='ISBN:')lblIsbn.place(x=5, y=5, width=80, height=30)txtIsbn = tkinter.Entry(dlg)txtIsbn.place(x=5 + 80 + 5, y=5, width=400 - 5 - 80 - 5 - 5, height=30)txtIsbn.insert(0, isbn) # 让isbn文本框显示ISBN的值# title 的label和EntrylblTitle = tkinter.Label(dlg, text='书名:')lblTitle.place(x=5, y=40, width=80, height=30)txtTitle = tkinter.Entry(dlg)txtTitle.place(x=5 + 80 + 5, y=40, width=400 - 5 - 80 - 5 - 5, height=30)txtTitle.insert(0, title) # 让title文本框显示书名的值# author 的label和EntrylblAuthor = tkinter.Label(dlg, text='作者:')lblAuthor.place(x=5, y=80, width=75, height=30)txtAuthor = tkinter.Entry(dlg, textvariable=author)txtAuthor.place(x=5 + 80 + 5, y=75, width=400 - 5 - 80 - 5 - 5, height=30)txtAuthor.insert(0, author) # 让author文本框显示作者的值# 保存按钮, 创建保存按钮之前也要先定义按钮点击的事件函数def onBtnSaveClick():# 取出画面上用户输入的数据isbn = txtIsbn.get()title = txtTitle.get()author = txtAuthor.get()# 这个地方要做几个错误检查,例如isbn的长度, isbn是否重复等, 为了方便阅读学习代码此处略# 错误检查后, 更新到数据库中sql = 'UPDATE books SET isbn=?, title=?, author=? WHERE id=?'cur = conn.cursor()# 执行sql的时候, 最好用Try来捕获异常, 如果错误的话给出提示, 为了方便阅读学习代码此处略cur.execute(sql, (isbn, title, author, id))conn.commit()# 保存结束以后, 调用researchBooks函数, 将主画面表格刷新即可researchBooks(None)# 关闭新建这个对话框, 整个事件结束dlg.destroy()# 创建保存按钮并把上面这个保存事件和按钮绑定btnSave = tkinter.Button(dlg, text="保存", command=onBtnSaveClick)btnSave.place(x=400 - 5 - 80, y=110, width=80, height=30)# 显示这个对话框dlg.mainloop()# 主窗口上创建并安放修改图书按钮,并绑定点击事件为上面定义的onBtnUpdateClick事件函数btnUpdate = tkinter.Button(winMain, text="修改图书", command=onBtnUpdateClick)btnUpdate.place(x=800-5-80-5-80, y=600-5-30, width=80, height=30)# 删除图书按钮, 同样, 先定义按钮的点击事件def onBtnDeleteClick():# 取得主窗口表格上选择的哪一行图书item = grid.item(grid.selection()) # 表格控件选择的那一行元素if item is None: # 保护一下, 防止没在表格中选择一行图书而出错returnrow = item['values'] # 表格中这一行的值(是一个列表: [id, isbn, 书名, 作者])id = row[0] # 取得主键idtitle = row[2] # 书名import tkinter.messageboxresult = tkinter.messagebox.askokcancel(title='删除确认', message='确定删除' + title + '吗?')if not result: # 选择的不是确定按钮, 意味着取消, 这时候就返回即可return# 上面如果选择的不是确定按钮, 就return了, 所以下面这部分就开始删除sql = '''DELETE FROM books WHERE id = ?'''cur = conn.cursor()cur.execute(sql, (id, ))conn.commit()# 删除完了以后, 调用查询函数, 查询所有图书, 并刷新表格researchBooks(None)# 创建并安放删除图书按钮btnDelete = tkinter.Button(winMain, text="删除图书", command=onBtnDeleteClick)btnDelete.place(x=800-5-80-5-80-5-80, y=600-5-30, width=80, height=30)# 开始GUI窗口的消息循环, 等待用户输入winMain.mainloop()conn.close()