什么是'撕掉'属性在tkinter菜单中执行?

时间:2018-03-26 18:31:11

标签: python tkinter terminology tkinter-menu

我经常看到Tkinter应用程序在构造函数中使用tearoff=0初始化Menu小部件。

import tkinter as tk

root = tk.Tk()
menubar = tk.Menu(root)    
filemenu = tk.Menu(menubar, tearoff=0)

effbot.org's documentation for Menu指定tearoff的默认值为1,但它不解释该值的用途。

tearoff=
    Default value is 1. (tearOff/TearOff)
tearoffcommand=
    No default value. (tearOffCommand/TearOffCommand)

初始化tkinter Menu窗口小部件时tearoff属性有什么作用?

4 个答案:

答案 0 :(得分:7)

official python docs承认他们对细节有点了解:

  

tkinter包是一个位于Tcl / Tk顶部的瘦对象层。要使用tkinter,您不需要编写Tcl代码,但是您需要查阅Tk文档,有时还需要参考Tcl文档。

Tk documentation for tearoff为您提供了您正在寻找的内容:

  

撕裂允许您分离主窗口的菜单,创建浮动菜单。如果创建菜单,单击顶部菜单项时,顶部会显示虚线。如果单击这些虚线,菜单会撕下并浮动。

答案 1 :(得分:4)

Tkinter menu with tearoff在这里,您可以看到tkinter Menu在后​​台找到代码。我不确定这会有多大用,但根据New Mexico Tech

  

通常情况下,菜单可以被撕掉:选项列表中的第一个位置(位置0)被撕下元素占用,并且从位置1开始添加附加选项。如果设置了tearoff = 0 ,菜单没有撕下功能,从位置0开始添加选项。

答案 2 :(得分:0)

如果您要使用Windows测试浮动菜单,请尝试此操作。

from tkinter import *
import re

class HoverInfo(Menu):
    def __init__(self, parent, text, command=None):
       self._com = command
       Menu.__init__(self,parent, tearoff=1)
       if not isinstance(text, str):
          raise TypeError('Trying to initialise a Hover Menu with a non string type: ' + text.__class__.__name__)
       toktext=re.split('\n', text)
       for t in toktext:
          self.add_command(label = t)
          self._displayed=False
          self.master.bind("<Enter>",self.Display )
          self.master.bind("<Leave>",self.Remove )

    def __del__(self):
       self.master.unbind("<Enter>")
       self.master.unbind("<Leave>")

    def Display(self,event):
       if not self._displayed:
          self._displayed=True
          self.post(event.x_root, event.y_root)
       if self._com != None:
          self.master.unbind_all("<Return>")
          self.master.bind_all("<Return>", self.Click)

    def Remove(self, event):
     if self._displayed:
       self._displayed=False
       self.unpost()
     if self._com != None:
       self.unbind_all("<Return>")

    def Click(self, event):
       self._com()

class MyApp(Frame):
   def __init__(self, parent=None):
      Frame.__init__(self, parent)
      self.grid()
      self.lbl = Label(self, text='testing')
      self.lbl.grid()

      self.hover = HoverInfo(self, 'while hovering press return \n for an exciting msg', self.HelloWorld)

   def HelloWorld(self):
      print('Hello World')

app = MyApp()
app.master.title('test')
app.mainloop()

此示例是Gogo的悬停类。 Display message when hovering over something with mouse cursor in Python

我将撕裂度设置为1即可看到浮动效果。

答案 3 :(得分:0)

默认情况下,菜单中的选择从第1个位置开始。如果将撕裂设置为1,则它将从第0个位置开始