大家好!我在tkinter中编写了一个简单的程序。本质上是一个带有数据库(sqlite3)的注册程序。
所以现在,在我看来,它看起来不太好。是的,有人建议我重构代码,但我不知道该怎么做。虽然我理解OOP的本质。
代码:
from tkinter import Tk, Label, Entry, Button, StringVar, Toplevel, messagebox
import sqlite3
def check_user(login, password):
conn = sqlite3.connect('users.db')
c = conn.cursor()
c.execute('''CREATE TABLE IF NOT EXISTS users
(id INTEGER PRIMARY KEY,
login TEXT,
password TEXT)''')
c.execute("SELECT login, password FROM users WHERE login = ?", (login, ))
data_select_user = c.fetchone()
data_submit_uesr = (login, password)
if data_select_user == data_submit_uesr:
messagebox.showinfo(title="Welcome!", message="It's Ok!")
else:
messagebox.showerror(title="REGISTER!", message="REGISTER PLEASE!")
conn.commit()
conn.close()
def insert_user(login, password):
conn = sqlite3.connect('users.db')
c = conn.cursor()
c.execute('''CREATE TABLE IF NOT EXISTS users
(id INTEGER PRIMARY KEY,
login TEXT,
password TEXT)''')
c.execute("INSERT INTO users (login, password) VALUES (?,?)", (login, password))
conn.commit()
conn.close()
def submit():
login = login_var.get()
password = password_var.get()
# print('its ok')
check_user(login, password)
login_var.set("")
password_var.set("")
class root2:
def __init__(self):
super().__init__()
def submit2():
login = login_var2.get()
password = password_var2.get()
insert_user(login, password)
login_var2.set("")
password_var2.set("")
root2 = Toplevel(root)
root2.title("Register Form")
def call_func2():
close2()
submit2()
def close2():
root2.destroy()
login_var2 = StringVar()
password_var2 = StringVar()
Label(root2, text="Login:").grid(row=0, column=0)
Entry(root2, textvariable=login_var2).grid(row=0, column=1)
Label(root2, text="Password:").grid(row=1, column=0)
Entry(root2, textvariable=password_var2, show='*').grid(row=1,
column=1)
Button(root2, text="Submit", command=call_func2).grid(row=2, column=1)
root = Tk()
root.title("Login Form")
root.resizable(False, False)
login_var = StringVar()
password_var = StringVar()
def click():
root = root2()
def close():
root.destroy()
def call_func():
# close()
submit()
Label(root, text="Login:").grid(row=0, column=0)
Entry(root, textvariable=login_var).grid(row=0, column=1)
Label(root, text="Password:").grid(row=1, column=0)
Entry(root, textvariable=password_var, show='*').grid(row=1, column=1)
Button(root, text="Submit", command=call_func).grid(row=2, column=1)
Button(root, text="Create new account", command=click).grid(row=3,
column=1)
root.mainloop()
我不知道那些建议你这样做的人如何称呼重构,但根据经典(Martin Fowler),重构是程序的等效转换。也就是说,程序的更改不会改变其功能。
最简单的重构方法是重命名变量并将代码移至函数中。所有现代 IDE 通常都支持这些转换。但必须谨慎对待更复杂类型的重构。
因此,在开始重构代码之前,您需要用测试正确地覆盖它。否则你怎么知道你的重构没有破坏任何东西?在这方面,图形应用程序很难重构。如果您遵循模型-视图-控制器模型,那么生活将会变得更加简单,该模型将业务逻辑、窗口和小部件以及事件处理分开。所有业务逻辑都应该放入单独的类和函数中,可以逐个单元进行测试。
这种分离本身就是一次伟大的重构;)
我建议从基础开始:Martin Fowler,改进现有代码。要么是关于 Smalltalk 的,要么是关于 Java 的,我现在不记得了。但具体的语言并不重要,书中最主要的是思想。影响我世界观的少数几本书之一。我推荐它。