我在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()
答案 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()