目录
一、No such file or directory: 'flight.txt'
二、-tkinter.TclError: couldn't recognize data in image file "light.jpg"
声明
基于之前一篇文章——线上飞机订票系统python 模拟飞机订票系统_飞机订票系统python_寒酥落北琬的博客-CSDN博客
在此做一下问题解释、代码分析以及系统优化
问题解释
一、No such file or directory: 'flight.txt'
这种情况的原因应该是txt文件和py文件不在一个根目录里面
解决办法:把txt文件和py文件放在一个文件夹里面
二、-tkinter.TclError: couldn't recognize data in image file "light.jpg"
这种情况的原因是tkinter库无法识别.jpg格式的文件
解决办法:把jpg换为gif的文件,或者换一个库使用,如PIL库
代码分析
整个程序定义了10个类,分别是
航班类
class Train: # 定义一个航班类
def __init__(self):
self.ID = ''
self.firstname = ''
self.lastname = ''
self.time = ''
self.price = 0
self.seating = 0
用户类
class Users:
def __init__(self):
self.personID = ''
self.name = ''
self.ID = ''
self.time = ''
self.seating = 0
还有剩下的八个功能模块每个模块都是一个类,在每一个类里面可以定义自己需要写的函数共同实现每个模块的功能。
讲解一个模块
class ADD: # 信息录入
def Add_f(self):
roob = Toplevel(win)
roob.title('飞机信息输入')
roob.geometry('500x240')
lb1 = Label(roob, text='请输入航班号')
lb1.place(relx=0.1, rely=0.1, relwidth=0.5, relheight=0.1)
a_text = StringVar()
a_text.set("")
self.inp1 = Entry(roob, textvariable=a_text)
self.inp1.place(relx=0.6, rely=0.1, relwidth=0.3, relheight=0.1)
lb2 = Label(roob, text='请输入起点')
lb2.place(relx=0.1, rely=0.2, relwidth=0.5, relheight=0.1)
b_text = StringVar()
b_text.set("")
self.inp2 = Entry(roob, textvariable=b_text)
self.inp2.place(relx=0.6, rely=0.2, relwidth=0.3, relheight=0.1)
lb3 = Label(roob, text='请输入终点')
lb3.place(relx=0.1, rely=0.3, relwidth=0.5, relheight=0.1)
c_text = StringVar()
c_text.set("")
self.inp3 = Entry(roob, textvariable=c_text)
self.inp3.place(relx=0.6, rely=0.3, relwidth=0.3, relheight=0.1)
lb4 = Label(roob, text='请输入飞机起飞时间')
lb4.place(relx=0.1, rely=0.4, relwidth=0.5, relheight=0.1)
d_text = StringVar()
d_text.set("")
self.inp4 = Entry(roob, textvariable=d_text)
self.inp4.place(relx=0.6, rely=0.4, relwidth=0.3, relheight=0.1)
lb5 = Label(roob, text='请输入飞机的票价')
lb5.place(relx=0.1, rely=0.5, relwidth=0.5, relheight=0.1)
e_text = StringVar()
e_text.set("")
self.inp5 = Entry(roob, textvariable=e_text)
self.inp5.place(relx=0.6, rely=0.5, relwidth=0.3, relheight=0.1)
lb6 = Label(roob, text='请输入飞机的票数')
lb6.place(relx=0.1, rely=0.6, relwidth=0.5, relheight=0.1)
f_text = StringVar()
f_text.set("")
self.inp6 = Entry(roob, textvariable=f_text)
self.inp6.place(relx=0.6, rely=0.6, relwidth=0.3, relheight=0.1)
self.bt1 = Button(roob, text="清空数据", command=self.Delete)
self.bt1.place(relx=0.1, rely=0.9, relwidth=0.1, relheight=0.1)
self.bt = Button(roob, text="添加", command=lambda: self.Add(a_text, b_text, c_text, d_text, e_text, f_text))
self.bt.place(relx=0.7, rely=0.8, relwidth=0.2, relheight=0.1)
self.btClose = Button(roob, text='关闭', command=roob.destroy)
self.btClose.place(relx=0.7, rely=0.9, relwidth=0.2, relheight=0.1)
self.txt = Text(roob)
self.txt.place(relx=0.1, rely=0.8, relwidth=0.4, relheight=0.1)
def Delete(self):
self.inp1.delete(0, END)
self.inp2.delete(0, END)
self.inp3.delete(0, END)
self.inp4.delete(0, END)
self.inp5.delete(0, END)
self.inp6.delete(0, END)
def Add(self, ID, firstname, lastname, time, price, seating):
tra = Train()
tra.ID = str(ID.get())
tra.firstname = str(firstname.get())
tra.lastname = str(lastname.get())
tra.time = str(time.get())
tra.price = str(price.get())
tra.seating = str(seating.get())
print(tra.ID, tra.firstname, tra.lastname, tra.time, tra.price, tra.seating)
if self.searchByID(trainlist, tra.ID) == True:
self.txt.delete(1.0, END)
self.txt.insert(END, '航班重复,保存失败')
return
trainlist.append(tra)
file_object = open("train.txt", "a")
file_object.write(tra.ID)
file_object.write(" ")
file_object.write(tra.firstname)
file_object.write(" ")
file_object.write(tra.lastname)
file_object.write(" ")
file_object.write(tra.time)
file_object.write(" ")
file_object.write(tra.price)
file_object.write(" ")
file_object.write(tra.seating)
file_object.write("\n")
file_object.close()
self.txt.delete(1.0, END)
self.txt.insert(END, '保存成功')
return
def searchByID(self, trainlist, ID):
for item in trainlist:
if item.ID == ID:
return True
return False
class ADD里面的def Add_f(self):
比如在58行的class ADD模块里面,def Add_f(self): 可以实现添加信息
def Add_f(self):
roob = Toplevel(win)
roob.title('飞机信息输入')
roob.geometry('500x240')
lb1 = Label(roob, text='请输入航班号')
lb1.place(relx=0.1, rely=0.1, relwidth=0.5, relheight=0.1)
a_text = StringVar()
a_text.set("")
self.inp1 = Entry(roob, textvariable=a_text)
self.inp1.place(relx=0.6, rely=0.1, relwidth=0.3, relheight=0.1)
lb2 = Label(roob, text='请输入起点')
lb2.place(relx=0.1, rely=0.2, relwidth=0.5, relheight=0.1)
b_text = StringVar()
b_text.set("")
self.inp2 = Entry(roob, textvariable=b_text)
self.inp2.place(relx=0.6, rely=0.2, relwidth=0.3, relheight=0.1)
lb3 = Label(roob, text='请输入终点')
lb3.place(relx=0.1, rely=0.3, relwidth=0.5, relheight=0.1)
c_text = StringVar()
c_text.set("")
self.inp3 = Entry(roob, textvariable=c_text)
self.inp3.place(relx=0.6, rely=0.3, relwidth=0.3, relheight=0.1)
lb4 = Label(roob, text='请输入飞机起飞时间')
lb4.place(relx=0.1, rely=0.4, relwidth=0.5, relheight=0.1)
d_text = StringVar()
d_text.set("")
self.inp4 = Entry(roob, textvariable=d_text)
self.inp4.place(relx=0.6, rely=0.4, relwidth=0.3, relheight=0.1)
lb5 = Label(roob, text='请输入飞机的票价')
lb5.place(relx=0.1, rely=0.5, relwidth=0.5, relheight=0.1)
e_text = StringVar()
e_text.set("")
self.inp5 = Entry(roob, textvariable=e_text)
self.inp5.place(relx=0.6, rely=0.5, relwidth=0.3, relheight=0.1)
lb6 = Label(roob, text='请输入飞机的票数')
lb6.place(relx=0.1, rely=0.6, relwidth=0.5, relheight=0.1)
f_text = StringVar()
f_text.set("")
self.inp6 = Entry(roob, textvariable=f_text)
self.inp6.place(relx=0.6, rely=0.6, relwidth=0.3, relheight=0.1)
self.bt1 = Button(roob, text="清空数据", command=self.Delete)
self.bt1.place(relx=0.1, rely=0.9, relwidth=0.1, relheight=0.1)
self.bt = Button(roob, text="添加", command=lambda: self.Add(a_text, b_text, c_text, d_text, e_text, f_text))
self.bt.place(relx=0.7, rely=0.8, relwidth=0.2, relheight=0.1)
self.btClose = Button(roob, text='关闭', command=roob.destroy)
self.btClose.place(relx=0.7, rely=0.9, relwidth=0.2, relheight=0.1)
self.txt = Text(roob)
self.txt.place(relx=0.1, rely=0.8, relwidth=0.4, relheight=0.1)
label函数
其中下面几行代码 就是通过用label标签函数设置界面上的按钮,具体label函数的使用方法可以查看Python Tkinter详解 (二)Label标签的使用_python里label_创客老师Apple的博客-CSDN博客
lb1 = Label(roob, text='请输入航班号')
lb1.place(relx=0.1, rely=0.1, relwidth=0.5, relheight=0.1)
a_text = StringVar()
a_text.set("")
self.inp1 = Entry(roob, textvariable=a_text)
self.inp1.place(relx=0.6, rely=0.1, relwidth=0.3, relheight=0.1)
依次类推,下面的按钮都是label函数实现的
布局按钮
lb1.place(relx=0.1, rely=0.1, relwidth=0.5, relheight=0.1)
这行代码是布局按钮的,具体的relwidth之类的可以看Tkinter布局管理器(三种方法详解) (biancheng.net)
class ADD里面的def Delete(self):
def Delete(self):
self.inp1.delete(0, END)
self.inp2.delete(0, END)
self.inp3.delete(0, END)
self.inp4.delete(0, END)
self.inp5.delete(0, END)
self.inp6.delete(0, END)
这个用delete函数就好,具体可以看#Python3中tkinter编程中Text.delete_tkinter text delete_微信-支付宝的博客-CSDN博客
其他的以此类推就好