weixin_58857297 2023-06-15 23:59 采纳率: 87.5%
浏览 14

pycharm编译没出错,显示tkinter窗口但没有菜单

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('发生了错误,系统已退出')

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-06-16 08:19
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 以下回答来自chatgpt:

      我可以给出一些可能导致该问题的原因并提供相应的解决方案:

      1. 您可能没有正确创建菜单或未将菜单添加到窗口中。可以尝试使用以下代码来创建一个简单的菜单并将其添加到窗口中:
      from tkinter import *
      
      root = Tk()
      menu = Menu(root)
      root.config(menu=menu)
      
      filemenu = Menu(menu)
      menu.add_cascade(label="File", menu=filemenu)
      filemenu.add_command(label="New")
      filemenu.add_command(label="Open...")
      filemenu.add_separator()
      filemenu.add_command(label="Exit", command=root.quit)
      
      mainloop()
      
      1. 您可能没有正确使用菜单项的属性和方法。请确保您的菜单项具有正确的标签和命令,并使用add_command方法将它们添加到菜单实例中。比如:
      menu = Menu(root)
      root.config(menu=menu)
      filemenu = Menu(menu)
      menu.add_cascade(label="File", menu=filemenu)
      filemenu.add_command(label="New", command=newFile)
      filemenu.add_command(label="Open...", command=openFile)
      filemenu.add_separator()
      filemenu.add_command(label="Exit", command=root.quit)
      

      请确保newFile和openFile是您事先定义的函数名称。

      1. 您可能使用了重复的菜单项标签。请确保您的菜单项标签是唯一的。如果您在菜单中使用了重复的标签,则可能会导致菜单项重叠或不显示。

      这些是一些可能导致菜单未显示的原因。请尝试使用上述方法逐一解决您的问题,并将代码添加到您的程序中。如果问题仍然存在,请分享更多细节以便提供更好的帮助。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 6月15日

悬赏问题

  • ¥15 pcl运行在qt msvc2019环境运行效率低于visual studio 2019
  • ¥15 MAUI,Zxing扫码,华为手机没反应。可提高悬赏
  • ¥15 python运行报错 ModuleNotFoundError: No module named 'torch'
  • ¥100 华为手机私有App后台保活
  • ¥15 sqlserver中加密的密码字段查询问题
  • ¥20 有谁能看看我coe文件到底哪儿有问题吗?
  • ¥20 我的这个coe文件到底哪儿出问题了
  • ¥15 matlab使用自定义函数时一直报错输入参数过多
  • ¥15 设计一个温度闭环控制系统
  • ¥100 rtmpose姿态评估