Python Tkinter文本编辑器不显示菜单小部件
我正试图通过python重新制作记事本,问题是我的菜单无法打包。我正在使用tkinter模块。到目前为止,尝试的产品应该是一个文本框,上面有一个菜单栏。点击每一个菜单按钮都会弹出一个平均值。我还没有为每个菜单选项编写任何函数,所以我知道我所有的“add_命令”都没有命令Python Tkinter文本编辑器不显示菜单小部件,python,menu,widget,tkinter,Python,Menu,Widget,Tkinter,我正试图通过python重新制作记事本,问题是我的菜单无法打包。我正在使用tkinter模块。到目前为止,尝试的产品应该是一个文本框,上面有一个菜单栏。点击每一个菜单按钮都会弹出一个平均值。我还没有为每个菜单选项编写任何函数,所以我知道我所有的“add_命令”都没有命令 from tkinter import * import tkinter.messagebox import tkinter # Text Box class ScrolledText(Frame): def
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()
将菜单按钮作为滚动文本小部件的子项是非常罕见的。制作菜单栏的正确方法是创建菜单(而不是菜单按钮),然后将菜单附加到根目录:
menubar = tk.Menu(root)
root.configure(menu=menubar)
fileMenu = tk.Menu(menubar)
menubar.add_cascade(label="File", menu=fileMenu)
...
这样做可以保证您得到一个正确的、本地的菜单栏。出于某种原因,我发现网格不会与包一起显示。我用软件包重置了所有菜单,效果很好。有人知道为什么会这样吗?您不能在同一个包含小部件中使用pack和grid,因为它们都会响应正在打包/网格化的小部件中的更改。因此,pack将根据其算法增长或收缩小部件。grid将看到小部件的大小发生了变化,并尝试重新排列小部件以适应其算法。pack将看到一些小部件改变了大小,并尝试重新排列小部件以适应其算法。grid将看到一些小部件的大小和。。。无限的。