zoukankan      html  css  js  c++  java
  • python GUI 之 tkinter

    写一个 登陆窗口来学习 tkinter ,还剩下一些问题

    代码暂时如下

    
    import tkinter as tk
    import webbrowser
    import pickle
    from tkinter import messagebox
    
    class window(tk.Tk):
        def get_winfo_size(self):
            return self.winfo_screenwidth(),self.winfo_screenheight()
    
        def center_window(self,width,height):
            screen_width, screen_height = self.get_winfo_size()
            self.width = width
            self.height = height
            self.pos_x = int((screen_width - width) / 2)
            self.pos_y = int((screen_height - height) / 2)
            self.quit()
            # print(self.winfo_reqwidth(), self.winfo_reqheight())
            return super().geometry('{}x{}+{}+{}'.format(width, height, self.pos_x, self.pos_y))
    
    
        def get_self_size(self):
            return  self.width,self.height
    
    class login():
    
        def __init__(self):
            self.user_file = './user_info.pickle'
            login = window()
            login.resizable(0,0)
            login.title('登录窗口')
            login.geometry('500x300')
            login.center_window(500, 300)
    
            width, height = login.get_self_size()
            print(width, height)
    
            # 头部窗口
            head_frame = tk.Frame(login)
    
            # 画布 画背景图片
            canvas = tk.Canvas(head_frame, bg='blue', height=100, width=500)
            image_file = tk.PhotoImage(file='./image/bg.gif')
            image = canvas.create_image(0, 0., anchor='nw', image=image_file)
            canvas.pack()
            head_frame.pack()
    
            # 中间 窗口
            centroid_frame = tk.Frame(login)
    
            # 账号 密码框 登录 重置按钮
            self.var_account_name = tk.StringVar()
            self.var_psw = tk.StringVar()
    
            self.signup_window = None
    
            account_label = tk.Label(centroid_frame, text='账号', width=4, height=2)
            account_label.grid(row=0, column=0, padx=5, pady=5)
    
            account_entry = tk.Entry(centroid_frame, width=30, show=None,textvariable=self.var_account_name)
            account_entry.grid(row=0, column=1, padx=5, pady=5)
    
            psw_label = tk.Label(centroid_frame, text='密码', width=4, height=2)
            psw_entry = tk.Entry(centroid_frame, width=30, show='*',textvariable=self.var_psw)
    
            psw_label.grid(row=1, column=0, padx=5, pady=5)
            psw_entry.grid(row=1, column=1, padx=5, pady=5)
    
            register_label = tk.Label(centroid_frame, text="还没有账号?注册", fg="blue", cursor="hand2")
            register_label.grid(row=1, column=2, padx=5, pady=5)
            register_label.bind('<Button-1>',self.register_callback)
    
            centroid_frame.pack()
    
            # 尾部窗口
            # tail_frame = tk.Frame(login)
    
            remember_psw = tk.Checkbutton(login, text='记住密码')
            remember_psw.place(x=120, y=205, anchor='nw')
    
            auto_login = tk.Radiobutton(login, text='自动登录')
            auto_login.place(x=210, y=205, anchor='nw')
    
            login_btn = tk.Button(login, text='登录',command=self.login_trigger)
            reset_btn = tk.Button(login, text='重置',command=self.reset_trigger)
    
            login_btn.place(x=120, y=250, anchor='nw')
            reset_btn.place(x=210, y=250, anchor='nw')
    
            # tail_frame.place(x=0,y=250,anchor='nw')
    
            # hyperlink = tkHyperlinkManager.HyperlinkManager(text)
    
            login.mainloop()
    
        def login_trigger(self):
            usr_name = self.var_account_name.get()
            psw = self.var_psw.get()
            try:
                with open(self.user_file,'rb') as usr_file:
                    user_info = pickle.load(usr_file)
            except (FileNotFoundError,EOFError) as fe:
                with open(self.user_file,'wb') as usr_file:
                    user_info = {'admin':'admin'}
                    pickle.dump(user_info,usr_file)
    
            if usr_name not in user_info:
                messagebox.showwarning(title='账号信息提示框',message='用户不存在')
                return
            else:
                if psw != user_info[usr_name]:
                    messagebox.showerror(title='密码警告提示框',message='密码错误')
                else:
                    messagebox.showinfo(title='登陆成功消息框',message='恭喜!登陆成功!')
    
        def register_callback(self,event):
            # webbrowser.open_new(r'http://www.baidu.com')
            print('register callback...')
    
            self.signup_window = window()
            self.signup_window.center_window(400, 250)
            self.signup_window.title('注册窗口')
    
            # 注册 账号密码
            self.signup_window.var_register_usr_name = tk.StringVar()
            self.signup_window.var_register_usr_psw = tk.StringVar()
            self.signup_window.var_register_usr_psw_confirm = tk.StringVar()
    
    
            text_frame = tk.Frame(self.signup_window)
    
            register_account_label = tk.Label(text_frame,text='账号',width=4,height=2)
            register_account_entry = tk.Entry(text_frame,width=30,show=None,textvariable=self.signup_window.var_register_usr_name)
    
            register_psw_label = tk.Label(text_frame,text='密码',width=4,height=2)
            register_psw_entry = tk.Entry(text_frame,width=30,show='*',textvariable=self.signup_window.var_register_usr_psw)
    
    
            register_psw_confirm_label = tk.Label(text_frame,text='确认密码',width=8,height=2)
            register_psw_confirm_entry = tk.Entry(text_frame,width=30,show='*',textvariable=self.signup_window.var_register_usr_psw_confirm)
    
            # register_account_label.place(x=0,y=20,anchor='nw')
            # register_account_entry.place(x=30,y=20,anchor='nw')
            # register_psw_label.place(x=0,y=60,anchor='nw')
            # register_psw_entry.place(x=30,y=60,anchor='nw')
    
            register_account_label.grid(row=0,column=0,padx=15,pady=10)
            register_account_entry.grid(row=0,column=1,padx=15,pady=10)
    
            register_psw_label.grid(row=1,column=0,padx=15,pady=10)
            register_psw_entry.grid(row=1,column=1,padx=15,pady=10)
    
    
            register_psw_confirm_label.grid(row=2,column=0,padx=15,pady=10)
            register_psw_confirm_entry.grid(row=2,column=1,padx=15,pady=10)
    
            text_frame.pack()
    
            # 注册按钮
            register_button = tk.Button(self.signup_window,text='注册',command=self.register_user)
            register_button.pack()
    
            self.signup_window.mainloop()
    
        def register_user(self):
            register_usr_name = self.signup_window.var_register_usr_name.get()
            register_psw = self.signup_window.var_register_usr_psw.get()
            register_psw_confirm = self.signup_window.var_register_usr_psw_confirm.get()
    
            # 用户名 规则, 密码 规则  , 正则等待完善
            print('register_usr_name %s' %register_usr_name)
            print(register_psw , register_psw_confirm)
    
            if register_psw != register_psw_confirm:
                messagebox.showerror(title='密码不相等提示框',message='两次输入密码不等!')
            else:
                try:
                    with open(self.user_file) as usr_file:
                        register_user_info = {register_usr_name:register_psw}
                        print(register_user_info)
                        pickle.dump(register_user_info,usr_file)
                        self.signup_window.destroy()
                except (FileNotFoundError,EOFError) as e:
                    print(e)
    
    
        def reset_trigger(self):
            self.var_account_name.set('')   # 记得这里用 set 置空
            self.var_psw.set('')
    
    
    if __name__ == '__main__':
        log = login()
    
    
    如果有来生,一个人去远行,看不同的风景,感受生命的活力。。。
  • 相关阅读:
    return 与 exit() 的区别
    RtlInitUnicodeString
    计算机网络 学习笔记-概论
    STM32学习笔记(五) USART异步串行口输入输出(轮询模式)
    STM32学习笔记(四) RCC外设的学习和理解
    简单RTOS学习(一) uc/os-II 工程模板建立
    web前端学习(一) html+js实现文本框背景及只读属性修改
    TCP/IP协议学习(一) LWIP实现网络远程IAP下载更新
    STM32学习笔记(三) STM32的GPIO的深入学习
    STM32学习笔记(二) 基于STM32-GPIO的流水灯实现
  • 原文地址:https://www.cnblogs.com/Frank99/p/10384540.html
Copyright © 2011-2022 走看看