Python tkinter 实现程序逻辑与界面设计分离
程序员文章站
2022-04-12 09:47:15
...
Python tkinter 实现程序逻辑与界面设计分离
tkinter是Python自带的图形界面设计模块,以下内容初步实现了tkinter下程序逻辑与界面设计的分离。
项目文件夹:
project # 项目文件夹
login.py # 主程序文件
database.py # 操作数据库的文件
gbase.db # 数据库文件
ui # 程序界面文件夹
__ini__.py # 空文件,使该文件夹成为包文件
ui_login.py # 登录窗口的界面设计文件
ui_tools.py # 一些界面设计的工具模块
首先是界面设计文件 ui_login.py
import tkinter as tk
from tkinter import ttk
from . import ui_tools # 使用相对导入,使不同包的 import 能找到该模块
class Login(tk.Tk):
"""登录窗口UI"""
def __init__(self):
"""初始化"""
super().__init__() # 有点相当于tk.Tk()
self.welcome = tk.StringVar()
self.user = tk.StringVar()
self.pwd = tk.StringVar()
self.msg = tk.StringVar()
self.btn_ok = ttk.Button()
self.run()
def run(self):
self.title('系统登录')
self.resizable(False, False)
self.option_add('*Font', ('', 12))
ttk.Style().configure(".", font=('', 12))
frm = tk.Frame(self)
frm.pack(padx=40, pady=20)
self.welcome.set('欢迎光临高卢美发造型管理系统')
tk.Label(frm, textvariable=self.welcome, font=('', 14, 'bold'), foreground='green').pack(pady=20)
user_frm = tk.Frame(frm)
user_frm.pack(pady=10)
pwd_frm = tk.Frame(frm)
pwd_frm.pack(pady=10)
btn_frm = tk.Frame(frm)
btn_frm.pack(pady=10)
tk.Label(user_frm, text='用户名', width=8, anchor='w').pack(padx=5, side='left')
tk.Entry(user_frm, textvariable=self.user).pack(side='left')
tk.Label(pwd_frm, text='密码', width=8, anchor='w').pack(padx=5, side='left')
tk.Entry(pwd_frm, textvariable=self.pwd, show="*").pack(side='left')
self.btn_ok = ttk.Button(btn_frm, text='确定')
self.btn_ok.pack(padx=10, side='left')
ttk.Button(btn_frm, text='取消', command=self.destroy).pack(side='left')
tk.Label(frm, textvariable=self.msg, fg='red').pack(pady=10)
ui_tools.WinCenter(self)
if __name__ == '__main__':
lg = Login()
lg.title('逻辑与界面分离设计')
lg.welcome.set('欢迎你UI时代!')
lg.mainloop()
界面设计工具模块 ui_tools.py
class WinCenter(object):
"""使窗口居中"""
def __init__(self, window):
window.withdraw() # 暂时不显示窗口来移动位置
window.update_idletasks() # 刷新GUI,获取窗口参数
sx = window.winfo_screenwidth()
sy = window.winfo_screenheight()
wx = window.winfo_width()
wy = window.winfo_height()
px = (sx - wx) // 2
py = (sy - wy) // 3
window.geometry(f'{wx}x{wy}+{px}+{py}')
window.deiconify() # 使窗口显示
主程序文件 login.py
from ui import ui_login
import hashlib
import database
lg = ui_login.Login()
def verify():
code = lg.user.get()
pwd = lg.pwd.get()
lg.msg.set('')
if not code:
lg.msg.set('用户名不能为空!')
return
elif not pwd:
lg.msg.set('密码不能为空!')
return
password = hashlib.md5((code+pwd).encode()).hexdigest()
db = database.Sqlite3DB()
sql_text = f"select id from users where code = ? and password = ? ;"
db.cur.execute(sql_text, (code, password))
result = db.cur.fetchone()
if result:
lg.msg.set('登录成功!')
else:
lg.msg.set('用户名或者密码错误!')
lg.btn_ok.configure(command=verify)
lg.mainloop()
一些要点:
- 在主程序 login.py 中必须使用 lg.mainloop() 函数,界面设计程序 ui_login.py 的类 class
Login(tk.Tk) 中不能使用 mainloop() 函数。这样才能正确调用界面设计模块及其变量。 - 在类 class Login(tk.Tk) 中定义相关变量,如 self.user, self.pwd, self.btn_ok
等,使主程序能够使用这些变量来修改界面及进行逻辑设计。 - 在界面设计程序 ui_login.py 中导入自定义的模块时,要使用相对导入,如上述的 from . import ui_tools 。如果是直接导入如 import ui_tools , 主程序会报错:找不到 ui_tools 模块。
以上是使用tkinter进行程序界面及逻辑分离的初步设计,等待不断完善。
发布日期:8月 27, 2021
作者:lshgly
分类:IT、全部、原创
标签:tkinter、界面分离