欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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()

一些要点:

  1. 在主程序 login.py 中必须使用 lg.mainloop() 函数,界面设计程序 ui_login.py 的类 class
    Login(tk.Tk)
    中不能使用 mainloop() 函数。这样才能正确调用界面设计模块及其变量。
  2. 在类 class Login(tk.Tk) 中定义相关变量,如 self.user, self.pwd, self.btn_ok
    等,使主程序能够使用这些变量来修改界面及进行逻辑设计。
  3. 在界面设计程序 ui_login.py 中导入自定义的模块时,要使用相对导入,如上述的 from . import ui_tools 。如果是直接导入如 import ui_tools , 主程序会报错:找不到 ui_tools 模块。

以上是使用tkinter进行程序界面及逻辑分离的初步设计,等待不断完善。

发布日期:8月 27, 2021
作者:lshgly
分类:IT、全部、原创
标签:tkinter、界面分离