用tkinter写项目时,合理设计个框架很重要,这样便于修改。可以把界面放在一个类里面,然后逻辑代码继承这个类,这样就实现了逻辑与UI的分离。如下所示:
class LoginUi():
def __init__(self,root):
self.root=root
self.root.geometry('500x500+100+100')
self.root.title("login")
self.creat_widgets()
def creat_widgets(self):
self.username=tk.StringVar()
self.password=tk.StringVar()
self.page=tk.Frame(self.root)
self.page.pack()
tk.Label(self.page).grid(row=0,column=0)
tk.Label(self.page,text='account:').grid(row=1,column=1)
tk.Entry(self.page,textvariable=self.username).grid(row=1,column=2)
tk.Label(self.page,text='password:').grid(row=2,column=1)
tk.Entry(self.page,textvariable=self.password).grid(row=2,column=2)
tk.Button(self.page,text='login',command=self.login).grid(row=3,column=1,pady=10)
tk.Button(self.page,text='exit',command=self.page.quit).grid(row=3,column=2,pady=10)
class Login(LoginUi):
def __init__(self,root):
super().__init__(root)
self.flag=True
def login(self):
name=self.username.get()
pwd=self.password.get()
flag,msg=DB.check_login(name,pwd)
if flag:
self.page.destroy()
MainPage(self.root)
else:
messagebox.showinfo(title='warning',message=msg)
if __name__=='__main__':
root=tk.Tk()
login=Login(root)
root.mainloop()
这种写法虽然分离了,但总感觉太散了,我还是喜欢一个类里写好界面,定义函数。如果要是处理文件数据或数据库,就单独写个数据模型,把数据模型导入进来更好。如下:
class AboutFrame(tk.Frame):
def __init__(self,root):
super().__init__(root)
tk.Label(self,text='本次作品').pack()
tk.Label(self,text='hello world').pack()
tk.Label(self,text='qq:272117416').pack()
class ChangeFrame(tk.LabelFrame):
def __init__(self,root):
super().__init__(root)
self.name=tk.StringVar()
self.math=tk.StringVar()
self.chinese=tk.StringVar()
self.englilsh=tk.StringVar()
self.status=tk.StringVar()
self.creat_page()
def creat_page(self):
tk.Label(self).grid(row=0,pady=10)
tk.Label(self,text='姓名').grid(row=1,column=1)
tk.Entry(self,textvariable=self.name).grid(row=1,column=2,pady=10)
tk.Label(self,text='数学').grid(row=2,column=1)
tk.Entry(self,textvariable=self.math).grid(row=2,column=2,pady=10)
tk.Label(self, text='语文').grid(row=3, column=1)
tk.Entry(self, textvariable=self.chinese).grid(row=3, column=2, pady=10)
tk.Label(self, text='英语').grid(row=4, column=1)
tk.Entry(self, textvariable=self.englilsh).grid(row=4, column=2, pady=10)
tk.Button(self,text='查询',command=self.search_info).grid(row=5,column=1,pady=10)
tk.Button(self,text='修改',command=self.change_info).grid(row=5,column=2,pady=10)
def search_info(self):
pass
def change_info(self):
pass
class Ui():
def __init__(self,root):
self.root=root
self.root.title("学生管理")
self.root.geometry('500x500+100+100')
self.creat_widgets()
def creat_widgets(self):
self.username=tk.StringVar()
self.password=tk.StringVar()
self.about_frame=AboutFrame(self.root)
self.change_frame=ChangeFrame(self.root)
menubar=tk.Menu(self.root)
menubar.add_command(label='about',command=self.show_about)
menubar.add_command(label='change',command=self.show_change)
self.root['menu']=menubar
def show_about(self):
pass
def show_change(self):
pass