Tkinter:小部件没有在<tab>事件上突出显示

时间:2015-04-26 02:36:56

标签: python tkinter widget

我在Mac上运行Python 2.7.9。我一直无法弄清楚为什么当我运行我的程序时,每次我按Tab键移动到下一个小部件时只有Entry Widgets突出显示。以下是一些测试代码。当我运行脚本并按Tab键时,第一个输入字段将突出显示。下次我按Tab键时,第二个输入字段会突出显示。但是,当我按Tab键移动到Button Widget时,Button正在接收焦点,但没有高亮显示可以直观地向用户指示焦点。

完全跳过OptionMenu小部件,这也是一个谜。无线电按钮和复选框都接收焦点,就像按钮小部件一样,并且再次没有高亮显示。

我尝试了各种.config()安排无济于事。我错过了什么?

from tkinter import *

class App:

    def __init__(self, master):
        frame = Frame(master)
        frame.grid()

        #Tests to make sure that Button receives focus.
        def yup(self):
            print "yup"

        entry1 = Entry(frame)
        entry1.pack()

        entry2 = Entry(frame)
        entry2.pack()

        button1 = Button(frame, text="Test")
        button1.pack()
        button1.bind('<Return>', yup)

        var1 = IntVar()
        c = Checkbutton(frame, text="Expand", variable=var1)
        c.pack()

        var2 = StringVar()
        radio = Radiobutton(frame, text="Test", variable=var2, value=1)
        radio.pack()

        var3 = StringVar()
        optionmenu1 = OptionMenu(frame, var3, "one", "two", "three")
        optionmenu1.pack()


root = Tk()
root.geometry('400x400+0+0')
app = App(root)

root.mainloop()

2 个答案:

答案 0 :(得分:1)

听起来您需要为"Full Keyboard Access"配置OS X,以允许Tab专注于所有UI控件(而不仅仅是文本框和列表)。

在Yosemite(10.10)中,此设置可在系统偏好设置&gt;下找到。键盘&gt;快捷方式,可以使用Control+F7切换。请注意,它与Python无关,并且将在系统范围内发生。

修改

因此,在进行了一些更多测试之后,在Mac上使用tk实际突出显示某些小部件似乎存在一些问题。以下是原始样本的精简版本,为简单起见进行了一些小修改。

import Tkinter as tk
import ttk # more on this in a minute

class App(tk.Frame):

    def __init__(self, master):

        tk.Frame.__init__(self, master)

        self.master = master

        entry1 = tk.Entry(self)
        entry1.pack()

        entry2 = tk.Entry(self)
        entry2.pack()

        button1 = tk.Button(self, text="Test", command=self.yup)
        button1.pack()

    def yup(self):
        print("yup")

    # ...

root = tk.Tk()
app = App(root).pack()

root.mainloop()

如前所述启用全键盘访问,我可以验证按钮确实获得焦点:在第三个选项卡上,在前两个条目小部件之后,点击<space>“点击”按钮并打印到标准输出。但是没有可视指示选择按钮。

将按钮从tk.Button更改为ttk.Button“修复了这个问题,并且在浏览用户界面时确实显示了按钮周围的正常”选择“框架。

button1 = tk.Button(self, text="Test", command=self.yup)

# change this to:
button1 = ttk.Button(self, text="Test", command=self.yup)

我不知道为什么会这样,而且我不知道关于tkinter.ttk的共识是什么,但我更喜欢ttk到“普通”tk,因为它似乎产生了在我的经验中,对于OS X来说看起来更“原生”的小部件。注意我还删除了bind语句,并使用OS X默认值space报告我的结果,以激活启用了完全键盘访问的UI元素。

有关ttk here的更多信息。另请注意,并非所有tk窗口小部件都具有ttk实现,并且ttk中还存在一些tk窗口小部件。

最后在下方找到原始代码段的“ttk”版本。

import Tkinter as tk
import ttk

class App(ttk.Frame):

    def __init__(self, master):

        ttk.Frame.__init__(self, master)

        self.master = master

        entry1 = ttk.Entry(self)
        entry1.pack()

        entry2 = ttk.Entry(self)
        entry2.pack()

        button1 = ttk.Button(self, text="Test", command=self.yup)
        button1.pack()

    def yup(self):
        print("yup")

    # ...

root = tk.Tk()
app = App(root).pack()

root.mainloop()

希望这有帮助。

答案 1 :(得分:0)

尝试更改背景和高亮背景色,如下所示,但问题可能是因为程序缩进的方式 - &gt;运行第二个代码块。

top=Tk()

## active background
Button(top, text="Quit", bg="lightblue", activebackground="orange",
       command=top.quit).grid(row=1)
top.mainloop()

##--------------- note the 3 lines that have been changed ---------
class App:

  ## function was not indented
  def __init__(self, master):
    frame = Frame(master)
    frame.grid()

    entry1 = Entry(frame)
    entry1.pack()
    entry1.focus_set()

    entry2 = Entry(frame)
    entry2.pack()

    button1 = Button(frame, text="Test")
    button1.pack()
    ## function called incorrectly
    button1.bind('<Return>', self.yup)

    var1 = IntVar()
    c = Checkbutton(frame, text="Expand", variable=var1)
    c.pack()

    var2 = StringVar()
    radio = Radiobutton(frame, text="Test", variable=var2, value=1)
    radio.pack()

    var3 = StringVar()
    optionmenu1 = OptionMenu(frame, var3, "one", "two", "three")
    optionmenu1.pack()

    Button(frame, text="Quit", bg="orange", command=master.quit).pack()

  ## function indented too far
  #Tests to make sure that Button receives focus.
  def yup(self, args):
      print "yup"


root = Tk()
root.geometry('400x400+0+0')
app = App(root)

root.mainloop()