第二次作业

发布时间 2023-11-15 12:11:29作者: 常雅丹

计算器:

from tkinter import *

import tkinter as tk

import tkinter.messagebox

import pickle

from PIL import Image,ImageTk

root =tk.Tk()

root.title(“常雅丹”)

root.geometry(‘400x300’)

def get_image(filename,width,height):

im=Image.open(filename).resize((width,height))

return ImageTk.PhotoImage(im)

canvas_root =tk.Canvas(root,width=400,height=400)

im_root =get_image(‘a.jpg’,400,350)

canvas_root.create_image(200,120,image=im_root)

canvas_root.pack()

tk.Label(root,text=‘用户:’,font=(‘Arial’,14)).place(x=80,y=80)

tk.Label(root,text=‘密码:’,font=(‘Arial’,14)).place(x=80,y=120)

 

定义用户登录

def usr_login():
// 这两行代码就是获取用户输入的usr_name和usr_pwd
usr_name = var_usr_name.get()
usr_pwd = var_usr_pwd.get()

//这里设置异常捕获,当我们第一次访问用户信息文件时是不存在的,所以这里设置异常捕获。

//中间的两行就是我们的匹配,即程序将输入的信息和文件中的信息匹配。

try:

    with open('usrs_info.pickle', 'rb') as usr_file:

        usrs_info = pickle.load(usr_file)

except FileNotFoundError:

 

 

  // 这里就是我们在没有读取到`usr_file`的时候,程序会创建一个`usr_file`这个文件,并将管理员

  // 的用户和密码写入,即用户名为`admin`密码为`admin`。

    with open('usrs_info.pickle', 'wb') as usr_file:

        usrs_info = {'admin': 'admin'}

        pickle.dump(usrs_info, usr_file)

        usr_file.close()  // 必须先关闭,否则pickle.load()会出现EOFError: Ran out of input

 

// 如果用户名和密码与文件中的匹配成功,则会登录成功,并跳出弹窗how are you? 加上你的用户名。

if usr_name in usrs_info:

    if usr_pwd == usrs_info[usr_name]:

        tk.messagebox.showinfo(title='Welcome', message='欢迎您的登陆:' + usr_name)

 

        window_login = tk.Toplevel(root)

        window_login.geometry('500x500')

        window_login.title('算法窗口')

 

        def run1():

            a = float(inp1.get())

            b = float(inp2.get())

            s = '%0.2f+%0.2f=%0.2f\n' % (a, b, a + b)

            txt.insert(END, s)  // 追加显示运算结果

            inp1.delete(0, END) // 清空输入

            inp2.delete(0, END)  // 清空输入

 

        def run2(x, y):

            a = float(x)

            b = float(y)

            s = '%0.2f-%0.2f=%0.2f\n' % (a, b, a - b)

            txt.insert(END, s)  // 追加显示运算结果

            inp1.delete(0, END)  // 清空输入

            inp2.delete(0, END)  // 清空输入

 

        def run3(x, y):

            a = float(x)

            b = float(y)

            s = '%0.2f*%0.2f=%0.2f\n' % (a, b, a * b)

            txt.insert(END, s)  // 追加显示运算结果

            inp1.delete(0, END)  // 清空输入

            inp2.delete(0, END)  // 清空输入

 

        def run4(x, y):

            a = float(x)

            b = float(y)

            s = '%0.2f/%0.2f=%0.2f\n' % (a, b, a / b)

            txt.insert(END, s)  // 追加显示运算结果

            inp1.delete(0, END)  // 清空输入

            inp2.delete(0, END)  // 清空输入

 

        lb1 = Label(window_login, text='请输入两个数,按下面两个按钮之一进行算法计算')

        lb1.place(relx=0.1, rely=0.1, relwidth=0.8, relheight=0.1)

        inp1 = Entry(window_login)

        inp1.place(relx=0.1, rely=0.2, relwidth=0.3, relheight=0.1)

        inp2 = Entry(window_login)

        inp2.place(relx=0.6, rely=0.2, relwidth=0.3, relheight=0.1)

 

       // 方法-直接调用 run1()

        btn1 = Button(window_login, text='加法', command=run1)

        btn1.place(relx=0.1, rely=0.4, relwidth=0.3, relheight=0.1)

 

       // 方法二利用 lambda 传参数调用run2()

        btn2 = Button(window_login, text='减法', command=lambda: run2(inp1.get(), inp2.get()))

        btn2.place(relx=0.6, rely=0.4, relwidth=0.3, relheight=0.1)

 

        btn3 = Button(window_login, text='乘法', command=lambda: run3(inp1.get(), inp2.get()))

        btn3.place(relx=0.1, rely=0.5, relwidth=0.3, relheight=0.1)

        btn4 = Button(window_login, text='除法', command=lambda: run4(inp1.get(), inp2.get()))

        btn4.place(relx=0.6, rely=0.5, relwidth=0.3, relheight=0.1)

       // 在窗体垂直自上而下位置60%处起,布局相对窗体高度40%高的文本框

        txt = Text( window_login )

        txt.place(rely=0.6, relheight=0.4)

        // 如果用户名匹配成功,而密码输入错误,则会弹出'Error, your password is wrong, try again.'

    else:

        tk.messagebox.showerror(message='Error, your password is wrong, try again.')

else:  // 如果发现用户名不存在

    is_sign_up = tk.messagebox.askyesno('Welcome! ', 'You have not sign up yet. Sign up now?')

     //  提示需不需要注册新用户

    if is_sign_up:

        usr_sign_up()

 

 

 

定义用户注册功能

def usr_sign_up():

def sign_to_Hongwei_Website():

//以下三行就是获取我们注册时所输入的信息

np = new_pwd.get()

npf = new_pwd_confirm.get()

nn = new_name.get()

 

   // 这里是打开我们记录数据的文件,将注册信息读出

    with open('usrs_info.pickle', 'rb') as usr_file:

        exist_usr_info = pickle.load(usr_file)

   // 这里就是判断,如果两次密码输入不一致,则提示Error, Password and confirm password must be the same!

    if np != npf:

        tk.messagebox.showerror('Error', 'Password and confirm password must be the same!')

 

   // 如果用户名已经在我们的数据文件中,则提示Error, The user has already signed up!

    elif nn in exist_usr_info:

        tk.messagebox.showerror('Error', 'The user has already signed up!')

 

   // 最后如果输入无以上错误,则将注册输入的信息记录到文件当中,并提示注册成功Welcome!,You have successfully signed up!,然后销毁窗口。

    else:

        exist_usr_info[nn] = np

        with open('usrs_info.pickle', 'wb') as usr_file:

            pickle.dump(exist_usr_info, usr_file)

        tk.messagebox.showinfo('Welcome', '注册成功!')

        // 然后销毁窗口。

        window_sign_up.destroy()

 

// 定义长在窗口上的窗口

window_sign_up = tk.Toplevel(root)

window_sign_up.geometry('300x200')

window_sign_up.title('注册窗口')

 

new_name = tk.StringVar()  // 将输入的注册名赋值给变量

 

tk.Label(window_sign_up, text='名字: ').place(x=10, y=10)  # 将`User name:`放置在坐标(10,10)。

entry_new_name = tk.Entry(window_sign_up, textvariable=new_name)  // 创建一个注册名的`entry`,变量为`new_name`

entry_new_name.place(x=130, y=10)  # `entry`放置在坐标(150,10).

 

new_pwd = tk.StringVar()

tk.Label(window_sign_up, text='密码: ').place(x=10, y=50)

entry_usr_pwd = tk.Entry(window_sign_up, textvariable=new_pwd, show='*')

entry_usr_pwd.place(x=130, y=50)

 

new_pwd_confirm = tk.StringVar()

tk.Label(window_sign_up, text='确定密码: ').place(x=10, y=90)

entry_usr_pwd_confirm = tk.Entry(window_sign_up, textvariable=new_pwd_confirm, show='*')

entry_usr_pwd_confirm.place(x=130, y=90)

 

// 下面的 sign_to_Hongwei_Website

btn_comfirm_sign_up = tk.Button(window_sign_up, text='注册', command=sign_to_Hongwei_Website)

btn_comfirm_sign_up.place(x=180, y=120)

 

计算过程程序流程图:

 

 

btn_login = tk.Button(root, text=‘登录’, command=usr_login)

btn_login.place(x=140, y=150,relwidth=0.2, relheight=0.1)

btn_sign_up = tk.Button(root, text=‘注册’, command=usr_sign_up)

btn_sign_up.place(x=260, y=150,relwidth=0.2, relheight=0.1)

 

root.mainloop()

 

 

 

 

异常:

在进行单目运算时刚开始输入的不是数字会报错。