将每个窗口封装成一个class,窗口之间跳转,在窗口销毁和窗口打开中进行。
这里用登录注册作为示范:
带数据库版:
import gc
import sys
import PySimpleGUI as sg
from db import Account
class LoginWindow(object):
def __init__(self):
# UI一定要放在初始化里面,否则GC无法销毁。
self.login_layout = [
[sg.Text('账号'), sg.InputText(key='-username-')],
[sg.Text('密码'), sg.InputText(key='-password-')],
[sg.Button('登录', key='-button_login-'), sg.Button('注册', key='-button_register-')]
]
self.login_window = None
self.create()
# 监听事件
def listening(self):
while True:
event, values = self.login_window.read()
# 监听X退出
if event == sg.WIN_CLOSED:
break
# 监听登录事件
if event == '-button_login-':
username = self.login_window['-username-'].get()
password = self.login_window['-password-'].get()
# 这里使用peewee框架来操作SQLite数据库
accounts = Account.select().where(Account.username == username, Account.password == password)
if len([account for account in accounts]) == 0:
sg.popup_quick_message('账号或密码错误')
continue
else:
# 登录成功
sg.popup_quick_message('登录成功')
# 监听注册跳转
if event == '-button_register-':
# 开启注册界面
RegisterWindow()
self.destroy()
# 创建登录界面
def create(self):
self.login_window = sg.Window("登录界面", layout=self.login_layout)
# 开启监听
self.listening()
# 销毁登录界面
def destroy(self):
self.login_window.close()
self.login_layout = None
self.login_window = None
# 主动触发GC,否则再次创建窗口的时候会报资源未释放。
gc.collect()
class RegisterWindow(object):
def __init__(self):
# UI一定要放在初始化里面,否则GC无法销毁。
self.register_layout = [
[sg.Text('账号'), sg.InputText(key='-username-')],
[sg.Text('密码'), sg.InputText(key='-password-')],
[sg.Text('密码'), sg.InputText(key='-re_password-')],
[sg.Button('注册', key='-button_register-')]
]
self.register_window = None
self.create()
# 监听事件
def listening(self):
while True:
r_event, r_values = self.register_window.read()
if r_event == sg.WIN_CLOSED:
break
if r_event == '-button_register-':
r_username: str = self.register_window['-username-'].get()
r_password: str = self.register_window['-password-'].get()
r_re_password = self.register_window['-re_password-'].get()
# 这里使用peewee框架来操作SQLite数据库
if r_password == r_re_password and len(
[x for x in Account.select().where(Account.username == r_username)]) == 0:
if r_username.strip() == '' or r_password.strip() == '':
sg.popup_quick_message('账号密码不能为空!')
continue
insert = Account.insert(username=r_username, password=r_password)
insert.execute()
sg.popup_quick_message('注册成功')
else:
sg.popup_quick_message('账号重复')
continue
self.destroy()
# 创建注册界面
def create(self):
self.register_window = sg.Window('注册', layout=self.register_layout)
# 开启监听
self.listening()
# 销毁注册界面
def destroy(self):
self.register_window.close()
self.register_layout = None
self.register_window = None
# 主动触发GC,否则再次创建窗口的时候会报资源未释放。
gc.collect()
if __name__ == '__main__':
LoginWindow()
sys.exit()
无数据库版:
import gc
import sys
import time
import PySimpleGUI as sg
class LoginWindow(object):
def __init__(self):
# UI一定要放在初始化里面,否则GC无法销毁。
self.login_layout = [
[sg.Text('账号'), sg.InputText(key='-username-')],
[sg.Text('密码'), sg.InputText(key='-password-')],
[sg.Button('登录', key='-button_login-'), sg.Button('注册', key='-button_register-')]
]
self.login_window = None
self.create()
# 监听事件
def listening(self):
while True:
event, values = self.login_window.read()
# 监听X退出
if event == sg.WIN_CLOSED:
break
# 监听登录事件
if event == '-button_login-':
username = self.login_window['-username-'].get()
password = self.login_window['-password-'].get()
if username == password == 'admin':
# 登录成功
sg.popup_quick_message('登录成功')
else:
sg.popup_quick_message('账号或密码错误')
continue
# 监听注册跳转
if event == '-button_register-':
# 开启注册界面
self.hide()
RegisterWindow()
self.un_hide()
self.destroy()
# 创建登录界面
def create(self):
self.login_window = sg.Window("登录界面", layout=self.login_layout)
# 开启监听
self.listening()
# 销毁登录界面
def destroy(self):
self.login_window.close()
self.login_layout = None
self.login_window = None
# 主动触发GC,否则再次创建窗口的时候会报资源未释放。
gc.collect()
# 隐藏登录界面
def hide(self):
self.login_window.hide()
# 显示登录界面
def un_hide(self):
self.login_window.un_hide()
class RegisterWindow(object):
def __init__(self):
# UI一定要放在初始化里面,否则GC无法销毁。
self.register_layout = [
[sg.Text('账号'), sg.InputText(key='-username-')],
[sg.Text('密码'), sg.InputText(key='-password-')],
[sg.Text('密码'), sg.InputText(key='-re_password-')],
[sg.Button('注册', key='-button_register-')]
]
self.register_window = None
self.create()
# 监听事件
def listening(self):
while True:
r_event, r_values = self.register_window.read()
if r_event == sg.WIN_CLOSED:
break
if r_event == '-button_register-':
r_username: str = self.register_window['-username-'].get()
r_password: str = self.register_window['-password-'].get()
r_re_password = self.register_window['-re_password-'].get()
# 这里使用peewee框架来操作SQLite数据库
if r_password == r_re_password:
if r_username.strip() == '' or r_password.strip() == '':
sg.popup_quick_message('账号密码不能为空!')
continue
sg.popup_quick_message('注册成功,请去登录')
time.sleep(1.5)
break
else:
sg.popup_quick_message('账号重复')
continue
self.destroy()
# 创建注册界面
def create(self):
self.register_window = sg.Window('注册', layout=self.register_layout)
# 开启监听
self.listening()
# 销毁注册界面
def destroy(self):
self.register_window.close()
self.register_layout = None
self.register_window = None
# 主动触发GC,否则再次创建窗口的时候会报资源未释放。
gc.collect()
if __name__ == '__main__':
LoginWindow()
sys.exit()