【问题标题】:Is there any differences between python2 and python3 about adding menu bar to Frame in tkinter?python2和python3在tkinter中向Frame添加菜单栏有什么区别吗?
【发布时间】:2018-08-25 08:17:04
【问题描述】:

我正在尝试在 python 上移植一个项目 2to3,并卡在 tkinter 中。

在python2中,在tkinter中给Frame添加菜单栏是没有问题的,

但是python3出现属性错误。 (框架对象没有属性'tk_menuBar')

python2和python3在tkinter中给Frame添加菜单栏有什么区别吗?

class TkMap(Map, tkinter.Tk):
""" Map with Tkinter GUI functions """
def __init__(self, cols, rows, value,
             width, height, widthMM, heightMM,
             title, menu = None, keybindings = []):
    """ TkMap extends Map and Tkinter """
    Map.__init__(self, cols, rows, widthMM, heightMM)
    tkinter.Tk.__init__(self)
    self.title(title)
    if menu == None:
        menu = [('File',[['Exit',self.destroy]])]
    keybindings.append( ("<Configure>", self.changeSize))
    self.menuButtons = {}
    self.debug = 0
    self.application = 0
    self.width = width
    self.height = height
    self.colScale = self.width / self.cols
    self.rowScale = self.height / self.rows
    self.addMenu(menu)

def addMenu(self, menu):
    """ Create a menu """
    self.mBar = tkinter.Frame(self,relief=tkinter.RAISED,borderwidth=2)
    self.mBar.pack(fill=tkinter.X)

    *for entry in menu:
        self.mBar.tk_menuBar(self.makeMenu(self.mBar, entry[0],entry[1]))*

    self.mBar.pack(side = "top")

PS。这是我的第一个问题,所以如果您指出我关于不礼貌的错误,我将不胜感激。

【问题讨论】:

  • 运行你的代码我得到一个语法错误。修复它后,我得到另一个语法错误,然后是另一个语法错误,然后是 NameError: name 'Map' is not defined... 实际上不能重现您的问题的代码没有帮助。
  • 您的主要错误是发布无效代码。虽然在这种特定情况下我们可能会看到问题,但通常您需要提供我们可以复制和粘贴然后运行的代码。您有缩进错误、缺少类定义、缺少导入和几个语法错误。
  • 感谢您指出我的错误。在这种情况下,我只想知道无法找到的 2.x 和 3.x 之间的 tk_menubar 语法,所以我不在乎代码是否有效。下次在其他问题上,我会记住的。

标签: python python-3.x tkinter


【解决方案1】:

您不应该在 python 2 或 3 中使用tk_menuBar。该函数的文档字符串是这样写的:

"""不要使用。在 Tk 3.6 和更早版本中需要。"""

注意:tk 3.6 早在 90 年代初就已经过时了。

无法将菜单附加到Frame 小部件。您可以添加Menubutton 的实例来模拟菜单栏,但不会得到真正的菜单栏。

您可以通过配置menu 属性将Menu 附加到根窗口或Toplevel 的实例。

import tkinter as tk

root = tk.Tk()

menubar = tk.Menu()
fileMenu = tk.Menu()
editMenu = tk.Menu()
viewMenu = tk.Menu()

menubar.add_cascade(label="File", menu=fileMenu)
menubar.add_cascade(label="Edit", menu=editMenu)
menubar.add_cascade(label="View", menu=viewMenu)

root.configure(menu=menubar)

root.mainloop()

【讨论】:

  • 啊...谢谢您的回答。太惨了,不能用了。
  • @agigom1993:你没有失去任何功能。它只是一个包装器,使向框架中添加菜单按钮更容易一些。
猜你喜欢
  • 1970-01-01
  • 2016-10-03
  • 2010-11-07
  • 1970-01-01
  • 1970-01-01
  • 2018-03-26
  • 2012-05-14
  • 2015-06-13
相关资源
最近更新 更多