【问题标题】:takefocus = NO fails to prevent tkinter.ttk.Notebook tabs from taking focustakefocus = NO 无法防止 tkinter.ttk.Notebook 选项卡获得焦点
【发布时间】:2016-11-08 08:39:19
【问题描述】:

在以下示例中,我已将 Notebook 设置为不获取焦点,以便在使用 enable_traversal() 支持的快捷方式从小部件导航到小部件时跳过其选项卡。这主要有效,但不完全有效。如果一个选项卡已经被显示(但没有焦点),按下它的<Alt-Key> 下划线样式的快捷方式会给它焦点。我怎样才能防止这种情况发生?

from tkinter import *
from tkinter import ttk

root = Tk()

nb = ttk.Notebook(root, takefocus = NO)
nb.enable_traversal()

f1 = Frame(nb)
b1a = Button(f1, text = 'Charlie')
b1b = Button(f1, text = 'Delta')

f2 = Frame(nb)
b2a = Button(f2, text = 'Echo')
b2b = Button(f2, text = 'Foxtrot')

b1a.pack()
b1b.pack()

b2a.pack()
b2b.pack()

f1.pack()
f2.pack()

nb.pack()

nb.add(f1, text = 'Alpha', underline = 0)
nb.add(f2, text = 'Bravo', underline = 0)

【问题讨论】:

  • 请阅读docs,了解什么是takefocus生效。它可以防止笔记本本身通过焦点遍历获得焦点。不是标签。
  • 要清楚,我想防止笔记本顶部的选项卡标签获得焦点,而不是每个选项卡包含的框架。我尝试将每个选项卡设置为不像这样聚焦:nb.tab(0)['takefocus'] = NO 但是,我怀疑这会在选项卡包含的框架上设置选项,而不是选项卡的标签。由于不可见的小部件默认不获取焦点,因此没有观察到任何变化。
  • 标签本身应该受到笔记本本身设置为takefocus = NO的影响。里面的框架是另一回事,但作为基本笔记本一部分的 tabctrl 本身应该是这样的。 但是:如果我没记错的话,该选项只接受那里的内容。所以你应该在添加最后一个标签后设置它。

标签: python tkinter ttk


【解决方案1】:

为什么还要添加underline=0?删除这两行中的那段代码。此外,在添加选项卡时添加另一个参数 takefocus=False。并在创建笔记本时删除 takefocus。

【讨论】:

  • 我添加了下划线参数,因为我希望<Alt-Key>-style 直接访问选项卡。正如我所提到的,takefocus = NO 参数部分地阻止了选项卡标签获得焦点(即在通过按 Tab 循环浏览小部件时)。从笔记本中移除 takefocus 会移除这个想要的效果。将 takefocus = NO 添加到 nb.add() 方法调用似乎为选项卡中的 Frame 设置了该选项,而不是选项卡标签。有没有办法可以访问标签标签本身?
猜你喜欢
  • 2015-06-06
  • 2011-03-22
  • 2011-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-29
相关资源
最近更新 更多