计算器:
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()


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