Сместить фокус между кнопками в кадре с помощью клавиш со стрелками? - PullRequest
0 голосов
/ 29 января 2020

Я новичок здесь, и у меня все еще есть учебные отношения с Python и tkinter. Для моего первого проекта я хотел создать платформу для ретро-игр, основанную на моей собственной коллекции игр, на основе GUI, вдохновленной Netflix. Пока что это в основном работает так, как задумано: категории выбираются случайным образом из списка всех доступных категорий, и на основании этого создается кнопка для каждой игры в категории. Опять же, все это работает нормально.

Проблема: учитывая характер приложения, важно, чтобы пользователь мог управлять им с помощью клавиатуры или контроллера Bluetooth. Я могу установить фокус на первую кнопку в первой категории, но мне сложно понять, как на самом деле переместить фокус с одной кнопки на другую (влево и вправо) или с одного кадра на другой (вверх и вниз) используя, пока, клавиши со стрелками. Есть ли несколько простой способ сделать это? Я искал несколько дней и нашел очень мало.

Код, который у меня есть: (изменить, чтобы удалить данные вечного модуля)

import tkinter as tk

c1i = []
c1b = []
tab_1 = ["a", "b", "c", "d", "e", "f"]

def populate():
    for i in tab_1:
        new_button = tk.Button(scrl_frame, bd = 0, command = None)
        c1b.append(new_button)
        new_button.pack(side = "left", padx = 5)


root = tk.Tk()
root.geometry ("800x1200")
main_frame = tk.Frame(root, height = 1200, width = 800)
main_canvas = tk.Canvas(main_frame, height = 1200, width = 800, bg = "black")
frame_1 = tk.Frame(main_canvas, height = 170, width = 800, bg = "black")
canvas_1 = tk.Canvas(frame_1, height = 170, width = 800, bg = "black")

scrl_frame = tk.Frame(canvas_1, bg = "black")
scrl = tk.Scrollbar(frame_1, orient = "horizontal", bg = "black", command = canvas_1.xview)
scrl_frame.bind("<Configure>", lambda k: canvas_1.configure(scrollregion = canvas_1.bbox("all")))

populate()

canvas_1.create_window((0, 0), window = scrl_frame, anchor = "w")
canvas_1.configure(xscrollcommand = scrl.set)


main_frame.pack(fill = "both", expand = True)
main_canvas.pack(fill = "both", expand = True)
frame_1.pack(fill = "x", side = "bottom")
canvas_1.pack(pady = 5, fill = "both", expand = True)
scrl.pack(fill = "x")

root.mainloop()

1 Ответ

0 голосов
/ 30 января 2020

Поскольку у вас уже есть список c1b для хранения кнопок, вам необходимо объявить глобальную переменную для хранения того, какая кнопка в списке активна, и другую глобальную переменную, указывающую на активный список кнопок:

index = 0
buttons = c1b
buttons[index].focus_set()  # focus on the first button

Затем вам нужно привязать события клавиш <Left> и <Right> к обратному вызову для переключения фокуса:

def switch_button(event):
    global index
    if event.keysym == 'Left':
        if index > 0:
            index -= 1
    else:
        if index < len(buttons)-1:
            index += 1
    buttons[index].focus_set()

root.bind('<Left>', switch_button)
root.bind('<Right>', switch_button)

Также вам нужно привязать события клавиш <Up> и <Down> к обратный вызов для переключения категории:

def switch_category(event):
    global index
    if event.keysym == 'Up':
        print('select upper category')
        # set 'buttons' to upper category
    else:
        print('select lower category')
        # set 'buttons' to lower category
    # focus on the first button in the category
    index = 0
    buttons[index].focus_set()

root.bind('<Up>', switch_category)
root.bind('<Down>', switch_category)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...