pycharm编译没出错,显示tkinter窗口但没有菜单。刚开始编译显我的Menu(root)有错,然后我再程序中添加了root.protocol("WM_DELETE_WINDOW", root.quit),没有出错,但是菜单还是没有出现。
#import tkinter as Tk
import tkinter.messagebox as Tk
#from PIL import Image
'''
用火注册信息管理系统
功能包括:
1.查看全部已注册用户信息
2.查看用户信息
3.修改用户信息
4.删除用户信息
5.添加用户信息
6.创建/重置用户数据库
每个注册用户的信息包括用户名()和密码()
所有用户数据保存在SQLite数据库userifo.dat的表users中
程序启动后,显示操作菜单,并根据选择执行不同的操作
各种菜单操作定义为函数,调用函数完成对应操作
'''
'''
系统发生异常时,除了将异常信息显示给用户外,还将异常信息写入文件chapter9_do_log.txt
'''
try: # 添加异常处理 #集中导入需要使用的模块和函数
from tkinter import *
from tkinter.messagebox import *
import sqlite3
from traceback import print_tb
from datetime import datetime
root = Tk()
root.geometry('600x300') # 设置窗口初始大小
systitle = '用户注册信息管理系统'
root.title(systitle) # 设置系统标题
root.protocol("WM_DELETE_WINDOW", root.quit)
root.mainloop()
#pic = PhotoImage(file=r'backpic.gif')
#label1 = Label(image=pic) # 载入图片作为背景
#label1.place(x=0,y=0)
mainframe = LabelFrame() # mainframe作为显示各个系统功能界面的容器
mainframe.pack()
dbfile = 'userdata.dat' # 设置用户数据库文件名
root.mainloop()
##函数showal1()显示当前已注册用户信息###
def showall():
global mainframe
try:
cn = sqlite3.connect(dbfile) # 连接SQLite数据库
cur = cn.execute('select * from users') # 查询所有用户数据
users = cur.fetchall()
cn.close()
mainframe.destroy()
root.mainloop()
if len(users) == 0:
showwarning(systitle, "当前无注册用户!")
else:
mainframe = LabelFrame(text='当前已注册用户信息如下:')
mainframe.pack(anchor=CENTER, pady=30, ipadx=5, ipady=5)
mainframe.columnconfigure(1, minsize=80)
mainframe.columnconfigure(2, minsize=200)
mainframe.columnconfigure(3, minsize=200)
Label(mainframe, text='序号', font=('隶书', 15, 'bold'), bd=1, relief=SOLID) \
.grid(row=1, column=3, sticky=N + E + S + W)
Label(mainframe, text='密码', font=('隶书', 15, 'bold'), bd=1, relief=SOLID) \
.grid(row=1, column=2, sticky=N + E + S + W)
rn = 2
n = 0
for x in users:
cn = 1
Label(mainframe, text=str(rn - 1), font=('宋体', 14), bd=1, relief=SOLID) \
.grid(row=rn, column=cn, sticky=N + E + S + W)
for a in x:
cn += 1
Label(mainframe, text=str(a), font=('宋体', 14), bd=1, relief=SOLID) \
.grid(row=rn, column=cn, sticky=N + E + S + W)
rn += 1
except Exception as ex:
showerror(systitle, '数据库访问出错:%s' % ex)
raise ex # 向外传递异常,以便统一写入日志
##函数showall()代码结束
##check_update()执行查找、修改或删除操作###
def check_update():
try:
global mainframe
mainframe.destroy() # 删除已有功能界面
mainframe = LabelFrame(text='查找、修改或删除用户')
mainframe.pack(anchor=CENTER, pady=20, ipadx=5, ipady=5)
tf = LabelFrame(mainframe, text='查找用户:')
tf.pack(anchor=CENTER, pady=10, ipadx=5, ipady=5)
Label(tf, text='请输入要查找的用户ID:', anchor=E).grid(row=1, column=1)
userid = StringVar()
txtuid = Entry(tf, textvariable=userid)
txtuid.grid(row=1, column=2)
btok = Button(tf, text='确定')
btok.grid(row=1, column=3)
editframe = LabelFrame(mainframe, text='删除或修改用户数据:')
editframe.pack(anchor=CENTER, pady=20, ipadx=5, ipady=5)
btdel = Button(editframe, text='删除用户', state=DISABLED)
btdel.pack(anchor=NW)
#mainloop()
op = LabelFrame(editframe, text='删除用户:')
op.pack(anchor=CENTER, pady=10, ipadx=5, ipady=5)
Label(op, text='新用户ID:', anchor=E).grid(row=1, column=1)
newuserid = StringVar()
newtxtuid = Entry(op, textvariable=newuserid)
newtxtuid.grid(row=1, column=2)
Label(op, text='新密码', anchor=E).grid(row=2, column=1, sticky=E)
newpassword = StringVar()
newtxtpwd = Entry(op, textvariable=newpassword)
newtxtpwd.grid(row=2, column=2)
bteditsave = Button(op, text='保存修改', state=DISABLED)
bteditsave.grid(row=1, column=3, rowspan=2, sticky=N + E + S + W)
#mainloop()
def dofind():
uname = userid.get()
if find(uname) == -1:
showinfo(systitle, '%s 还未注册!' % uname)
else:
btdel.config(state=NORMAL)
bteditsave.config(state=NORMAL)
def dodelete():
uname = userid.get()
if askokcancel('用户注册管理系统', "确认删除用户:%s?" % uname):
cn = sqlite3.connect(dbfile)
cn.execute('delete from users where userid=?', (uname,))
cn.commit()
cn.close()
showinfo(systitle, "成功删除用户:%s" % uname)
def saveedit():
uname = userid.get()
newname = newuserid.get()
if newname == '':
showerror(systitle, '新的用户名输入错误:%s' % newname)
newtxtuid.focus_set()
else:
# 检查是否已存在同名的注册用户
if find(newname) == 1:
showerror(systitle, '你输入的用户名%s已经使用:' % newname)
newtxtuid.focus_set()
else:
pwd = newpassword.get()
if pwd == '':
showerror(systitle, '你输入的密码无效!')
newtxtpwd.focus_set()
else:
cn = sqlite3.connect(dbfile)
cn.execute('update users set userid=?,password=?,where userid=?', (newname, pwd, uname))
cn.commit()
cn.close()
showinfo(systitle, '已成功修改用户数据!')
btok.config(command=dofind)
btdel.config(command=dodelete)
bteditsave.config(command=saveedit)
btok.pack()
btdel.pack()
bteditsave.pack()
except Exception as ex:
print('\t 数据库访问出错', ex)
showerror(systitle, '数据库访问出错:%s' % ex)
raise ex
##函数check_update()代码结束
##函数adduser()添加新用户###
def adduser():
try:
global mainframe
mainframe.destroy()
mainframe = LabelFrame(text='添加新用户:')
mainframe.pack(anchor=CENTER, pady=20, ipadx=5, ipady=5)
tf = Frame(mainframe)
tf.pack()
Label(tf, text='用户ID:', anchor=E).grid(row=1, column=1)
userid = StringVar()
txtuid = Entry(tf, textvariable=userid)
txtuid.grid(row=1, column=2)
Label(tf, text='密码:', anchor=E).grid(row=2, column=1, sticky=E)
password = StringVar()
txtpwd = Entry(tf, textvariable=password)
txtpwd.grid(row=2, column=2)
tf2 = Frame(mainframe)
tf2.pack()
btclear = Button(tf2, text='重置')
btclear.grid(row=1, column=1)
btok = Button(tf2, text='保存')
btok.grid(row=1, column=2)
btok.pack()
btclear.pack()
def clearall():
userid.set('')
password.set('')
def savenew():
uname = userid.get()
pwd = password.get()
if uname == '':
showerror(systitle, '用户名输入无效!')
else:
# 检查是否已存在同名的注册用户
if find(uname) == 1:
showerror(systitle, '你输入的用户名已经使用,请重新添加用户!')
txtuid.focus()
else:
if pwd == '':
showerror(systitle, '登录密码输入无效!')
else:
cn = sqlite3.connect(dbfile)
cn.execute('insert into users values(?,?)', (uname, pwd))
cn.commit()
cn.close()
showinfo(systitle, '已成功添加用户!')
btclear.config(command=clearall)
btok.config(command=savenew)
btok.pack()
btclear.pack()
except Exception as ex:
showerror(systitle, '数据库访问出错:%s' % ex)
raise ex
##h函数adduser()结束
##函数find(namekey)查找是否存在用户名为namekey的注册用户###
def find(namekey):
try:
cn = sqlite3.connect(dbfile)
cur = cn.execute('select * from users where userid=?', (namekey,))
user = cur.fetchall()
if len(user) > 0:
n = 1
else:
n = -1
cn.close()
return n
except Exception as ex:
showerror(systitle, '数据库访问出错:%s' % ex)
raise ex
##函数find结束##
##如果ressetdb()重置用户数据库(删除已注册的用户数据)###
def resetdb():
try:
global mainframe
mainframe.destroy()
msg = '该操作将删除所有已注册用户数据,\n请确认是否继续?'
if askokcancel('用户注册信息管理系统', msg):
cn = sqlite3.connect(dbfile)
cn.execute('drop table if exists users')
cn.execute('create table users(userid text primary key,password text)')
cn.close()
showinfo(systitle, '已成功重置用户数据库')
except Exception as ex:
showerror(systitle, '数据库访问出错:%s' % ex)
raise ex
#函数resetdb()结束##
def goexit():
if askokcancel('用户注册信息管理系统', "确认退出系统?"):
root.destroy()
##函数goexit代码结束##
# 创建系统菜单
menubar = Menu(root)
root.config(menu=menubar)
#def showmsg(msg):
#label.config(text=msg)
file = Menu(menubar, tearoff=0)
file.add_command(label='创建/重置用户数据', command=resetdb)
file.add_command(label='显示全部已注册用户', command=showall)
file.add_command(label='查找/修改/删除用户信息', command=check_update)
file.add_command(label='添加新用户', command=adduser)
file.add_separator()
file.add_command(label='退出', command=goexit)
menubar.add_cascade(label='系统操作菜单', menu=file)
root.grid()
except Exception as ex:
from traceback import print_tb
from datetime import datetime
log = open('chapterll_do_log.txt', 'a')
x = datetime.today()
# 为用户显示异常日志信息
print('\n出错了:')
print('日期时间:', x)
print('异常信息:', ex)
print('堆栈跟踪信息:')
print_tb(ex.__traceback__)
# 将异常日志信息写入文件
print('\n出错了:', file=log)
print('日期时间:', x, file=log)
print('异常信息:', ex.args[0], file=log)
print('堆栈跟踪信息:', file=log)
print_tb(ex.__traceback__, file=log)
log.close()
print('发生了错误,系统已退出')