简体   繁体   中英

Tkinter Text editor not showing menu widgets

I am attempting to remake notepad through python the problem is my menu won't pack. I am using the tkinter module. So far the attempted product should be a text box with a menu bar above it. clicking on each menu button should pull up a mean. I did not write any functions for each menu option yet so I know all of my "add_command"s don't have a command

from tkinter import *
import tkinter.messagebox
import tkinter

# Text Box
class ScrolledText(Frame):
        def __init__(self, parent=None, text='', file=None):
                Frame.__init__(self, parent)
        self.pack(expand=YES, fill=X)               #make expandable
        self.makewidgets()
        self.settext(text,file)

    def makewidgets(self):
        sbar = Scrollbar(self)
        text = Text(self, relief=SUNKEN)
        sbar.config(command=text.yview)                 # xlink sbar and text
        text.config(yscrollcommand=sbar.set)            # moving one moves other
        sbar.pack(side=RIGHT, fill=Y)                   #pack first-clip last
        text.pack(side=LEFT, expand=YES, fill=BOTH)     # text clipped first
        self.text = text

def settext(self, text='', file=None):
    if file:
        text = open(file, 'r').read()
    self.text.delete('1.0', END)
    self.text.insert('1.0', text)
    self.text.mark_set(INSERT, '1.0')
    self.text.focus()

def gettext(self):
    return self.text.get('1.0', END+'-1c')

# Menu Bar
class SimpleEditor(ScrolledText):
    def __init__(self, parent=None, file=None):
        frm = Frame(parent)
        frm.pack(fill=X)
        #Menus
        mf = Menubutton(root, text='File', width=5, activebackground='lightblue')
        mf.grid(row=0, column=0, sticky=W)
        mf.menu = Menu(mf, tearoff=0)
        mf["menu"] = mf.menu

        me = Menubutton(root, text='Edit', width=5, activebackground='lightblue')
        me.grid(row=0, column=1)
        me.menu = Menu(me, tearoff=0)
        me["menu"] = me.menu

        mo = Menubutton(root, text='Format', width=8, activebackground='lightblue')
        mo.grid(row=0, column=2, sticky=W)
        mo.menu = Menu(mo, tearoff=0)
        mo["menu"] = mo.menu

        mv = Menubutton(root, text='File', width=5, activebackground='lightblue')
        mv.grid(row=0, column=3, sticky=W)
        mv.menu = Menu(mv, tearoff=0)
        mv["menu"] = mv.menu

        mh = Menubutton(root, text='Help', width=5, activebackground='lightblue')
        mh.grid(row=0, column=4, sticky=W)
        mh.menu = Menu(mh, tearoff=0)
        mh["menu"] = mh.menu

        # File Options
        mf.menu.add_command(label='New          Ctrl+N', activebackground='lightblue')
        mf.menu.add_command(label='Open...      Ctrl+O', activebackground='lightblue')
        mf.menu.add_command(label='Save         Ctrl+S', activebackground='lightblue')
        mf.menu.add_command(label='Save as...', activebackground='lightblue')
        mf.menu.add_separator()
        mf.menu.add_command(label='Page Setup...', activebackground='lightblue')
        mf.menu.add_command(label='Print...      Ctrl+P', activebackground='lightblue')
        mf.menu.add_separator()
        mf.menu.add_command(label='Exit', activebackground='lightblue')

        # Edit Options
        me.menu.add_command(label='Undo         Ctrl+Z', activebackground='lightblue')
        me.menu.add_separator()
        me.menu.add_command(label='Cut          Ctrl+X', activebackground='lightblue')
        me.menu.add_command(label='Copy         Ctrl+C', activebackground='lightblue')
        me.menu.add_command(label='Paste        Ctrl+V', activebackground='lightblue')
        me.menu.add_command(label='Delete          Del', activebackground='lightblue')
        me.menu.add_separator()
        me.menu.add_command(label='Find         Ctrl+F', activebackground='lightblue')
        me.menu.add_command(label='Find Next        F3', activebackground='lightblue')
        me.menu.add_command(label='Replace...   Ctrl+H', activebackground='lightblue')
        me.menu.add_command(label='Go To...     Ctrl+G', activebackground='lightblue')
        me.menu.add_separator()
        me.menu.add_command(label='Select All   Ctrl+A', activebackground='lightblue')
        me.menu.add_command(label='Time/Date        F5', activebackground='lightblue')

        # Format Options
        mo.menu.add_checkbutton(label='Word Wrap', activebackground='lightblue')
        mo.menu.add_command(label='Font...', activebackground='lightblue')

        # View Options
        mv.menu.add_checkbutton(label='Status Bar', activebackground='lightblue')

        # Help Options
        mh.menu.add_command(label='View Help', activebackground='lightblue')
        mh.menu.add_separator()
        mh.menu.add_command(label='About Notepad', activebackground='lightblue')


if __name__ == '__main__':
    root = Tk()
    if len(sys.argv) > 1:
        ScrolledText(file=sys.argv[1]).mainloop()
    else:
        ScrolledText(text='').mainloop()
    root.mainloop()

It is highly unusual to make menu buttons as children of a scrolled text widget. The proper way to make a menubar is to create a menu (not a menubutton), and then attach the menu to the root:

    menubar = tk.Menu(root)
    root.configure(menu=menubar)
    fileMenu = tk.Menu(menubar)
    menubar.add_cascade(label="File", menu=fileMenu)
    ...

Doing it this way guarantees you get a proper, native menubar.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM