7

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

import tkinter as tk

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

effbot.org 的文档 forMenu指定默认值为tearoff1,但没有解释该值的用途。

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

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

4

4 回答 4

11

官方 python 文档承认他们对细节有点了解:

tkinter 包是 Tcl/Tk 之上的一个薄的面向对象层。要使用 tkinter,您不需要编写 Tcl 代码,但您需要查阅 Tk 文档,有时还需要查阅 Tcl 文档。

Tk 文档为tearoff您提供了您正在寻找的内容:

tearoff 允许您为创建浮动菜单的主窗口分离菜单。如果您创建一个菜单,当您单击顶部菜单项时,您将在顶部看到虚线。如果您单击这些虚线,菜单就会脱落并变成浮动的。

于 2018-03-26T18:48:46.750 回答
6

Tkinter 菜单与撕下在这里,您可以在后台看到 tkinterMenu的代码。我不确定这会有多大用处,但根据New Mexico Tech的说法:

正常情况下,一个菜单可以被撕掉:选项列表中的第一个位置(位置 0)被撕掉元素占据,额外的选项从位置 1 开始添加。如果设置 tearoff=0,菜单将没有撕下功能,将从位置 0 开始添加选择。

于 2018-03-26T18:53:23.413 回答
0

默认情况下,菜单中的选择从位置 1 开始。如果我们设置 tearoff = 1,那么它将从第 0 位置开始

于 2020-06-06T22:50:15.083 回答
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 的 Hover Class。在 Python 中用鼠标光标悬停在某物上时显示消息

我只是将tear-off设置为1以查看浮动效果。

于 2018-10-03T18:43:44.387 回答