簡體   English   中英

是否可以使用“Tab”鍵通過鍵盤在 Python 中選擇 Tkinter 的 Scale 小部件?

[英]Is the Tkinter's Scale widget selectable in the Python by the keyboard with the 'Tab' key?

我使用“Tab”鍵在窗口中選擇小部件。 我可以選擇除 Scale 之外的所有需要​​操作的小部件(Entry、Checkbutton、Listbox、Buttons)。 可以這樣選擇嗎?

我已經閱讀了 Tkinter 文檔和問題Python Tkinter:控制/設置(Tab 鍵)小部件“訪問”順序以及如何在 tkinter 應用程序中設置 Tab 順序? 和其他一些人並沒有找到答案。

這是工作示例:

from tkinter import *

optionsWindow = Tk()  #  = Toplevel(bd = 5) - for secondary window case

loadTableSign = 1
loadTableCheck = IntVar()
loadTableCheck.set(loadTableSign)

fnTable = 'table.txt'
optionsTableName = StringVar()
optionsTableName.set(fnTable)

saveOptionsSign = 0
saveOptionsCheck = IntVar()
saveOptionsCheck.set(saveOptionsSign)

textVideoModes=('3840 x 2160','3264 x 2448','2048 x 1536','1280 x 1024','1024 x 768','800 x 600','640 x 480')
videoModeNumber = 0
currentVideoMode = 'Off'

dx = 25
scaleVar = IntVar()
scaleVar.set(dx)

def escapeOptions(event):  # Exit from window by <Esc> key (for this example only)
    exit()

# The place for arrows keys event handlers (see below in the question)  AAA

optionsWindow.title('Options')
optionsWindow.resizable(False,False)
optionsWindow.geometry('200x350+20+40')
#optionsWindow.focus_force()  # not used for stand-alone window
loadTableCheck.set(loadTableSign)
optionsTableName.set(fnTable)
saveOptionsCheck.set(saveOptionsSign)

Label(optionsWindow,text = 'Table filename:').place(y = 5, x = 5)
Entry(optionsWindow,width = 12, text = optionsTableName).place(y = 5, x = 105)
Label(optionsWindow,text = 'Load table on start:').place(y = 25, x = 5)
Checkbutton(optionsWindow, variable = loadTableCheck, onvalue = 1, offvalue = 0).place(y = 24, x = 120)
Label(optionsWindow, text = 'Video Modes:').place(y=45, x=60)
lbVModes = Listbox(optionsWindow, height = 9)

for i in range(len(textVideoModes)):
    lbVModes.insert(END, textVideoModes[i])
lbVModes.place(y = 65, x = 33)

#lbVModes.bind('<<ListboxSelect>>', videoModeSelect)  # commented in this example
lbVModes.selection_set(videoModeNumber)

Label(optionsWindow, text = 'Current mode:').place(y = 205, x = 5)
Label(optionsWindow, text = currentVideoMode).place(y = 205, x = 90)
Scale(optionsWindow, label = 'Scroll value:', from_ = 25, to = 200, resolution = 25, tickinterval = 25, length = 175, sliderlength = 20, width = 7, orient = HORIZONTAL, variable = scaleVar).place(y = 225, x = 5)
Label(optionsWindow, text= 'Save options on OK:').place(y = 290, x = 5)
Checkbutton(optionsWindow, variable = saveOptionsCheck, onvalue = 1, offvalue = 0).place(y = 289, x = 120)
Button(optionsWindow, text = 'Ok', width = 6).place(y = 315, x = 45)
Button(optionsWindow, text = 'Cancel', width = 6).place(y = 315, x = 105)

optionsWindow.bind('<Escape>', escapeOptions)

# The place for binding of arrows keys (see below in the question) BBB

optionsWindow.mainloop()

結果:

在此處輸入圖片說明

我想可能需要Scale小部件的事件處理程序並制作它們(位置顯示在上面的代碼中,AAA 位置):

def keyRight(event):
    global dx
    if dx < 200:
        dx += 25
        scaleVar.set(dx)

def keyLeft(event):
    global dx
    if dx > 25:
      dx -= 25
      scaleVar.set(dx)

以及它們的綁定(代碼中的 BBB 位置):

optionsWindow.bind('<Right>',keyRight)
optionsWindow.bind('<Left>',keyLeft)

處理程序工作正常(我可以隨時使用 <- 和 -> 鍵更改顯示的“滾動值”),但Scale小部件仍然無法選擇。 這個問題有解決方案嗎?

比例是可選擇的 - 我可以運行您的代碼並使用 Tab 鍵來選擇小部件。 選擇后,我可以使用箭頭鍵調整值。 默認情況下,您無需執行任何操作即可獲得該行為。

如果您要問如何有一個視覺指示它被選中,請將highlightthickness屬性設置為大於零的值。

解決另一個任務,也與Scale小部件有關,我仔細閱讀了Tkinterbook ,發現那里有配置選項takefocus ,這是這個問題的決定( takefocus=1 )。 還需要將highlightthickness選項設置為非零值,以明確表示Bryan Oakley在他的回答中提到的選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM