Python Forum
[Tkinter] arrow key selection for menu
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[Tkinter] arrow key selection for menu
#5
(Apr-14-2021, 06:57 PM)Yoriz Wrote: I used deque to group buttons together so you can rotate the active button, and then another deque to contain the header button and the deque groups.
There is a function start_with_first_selected that is set to False to get the behaviour you asked for of having nothing shown as selected, to do this it means the last button of each group is the active one but not yet shown until you rotate that group for the first time.
I think I prefer start_with_first_selected set to True so the first item of each group is active to begin with.

You will probably want to play around with the formatting of the headers to make them look different from the selections.

I commented out all pygame stuff.

# Import module
from collections import deque
from itertools import islice
from tkinter import *
import tkinter
# from PIL import Image, ImageTk

# import keyboard
# import pynput
# import pygame

# pygame.init()
# keys = pygame.key.get_pressed()

# Create object
root = tkinter.Tk()

# Adjust size
root.geometry("640x300")
root.configure(bg='black')

# Specify Grid
# options for grid:
# MINSIZE, PAD, UNIFORM, WEIGHT

Grid.rowconfigure(root, 0, weight=1, uniform='a')
Grid.rowconfigure(root, 1, weight=1, uniform='b')
Grid.rowconfigure(root, 2, weight=1, uniform='b')
Grid.rowconfigure(root, 3, weight=1, uniform='b')
Grid.rowconfigure(root, 4, weight=1, uniform='b')
Grid.rowconfigure(root, 5, weight=1, uniform='b')
Grid.rowconfigure(root, 6, weight=1, uniform='b')
Grid.rowconfigure(root, 7, weight=1, uniform='b')
Grid.rowconfigure(root, 8, weight=1, uniform='b')
Grid.rowconfigure(root, 9, weight=1, uniform='b')
Grid.columnconfigure(root, 0, weight=1, uniform='d')
Grid.columnconfigure(root, 1, weight=1, uniform='d')
Grid.columnconfigure(root, 2, weight=1, uniform='d')
Grid.columnconfigure(root, 3, weight=1, uniform='d')
Grid.columnconfigure(root, 4, weight=1, uniform='d')
Grid.columnconfigure(root, 5, weight=1, uniform='d')
Grid.columnconfigure(root, 6, weight=1, uniform='d')
Grid.columnconfigure(root, 7, weight=1, uniform='d')
#Grid.columnconfigure(root,4,weight=1, uniform='a')
# Grid.rowconfigure(root,0,row=0,weight=0)


# notes on different widget options other notes sections will be added for late rreference needs and
# desired customizations.
# w = Canvas (master, option-value
# bd, bg, cursor, highlight color, width, height
# w = CheckButton(master, option=value)
# Title, activebackground, activeforeground, bg, command, font, image
# w=Entry(master, option=value)
# bd, bg, cursor, command, highlightcolor, width, height
# w=Label(master, option=value)
# bg, bd, command, font, image, width, height
# w = Listbox(master, option=value)
# hightlightcolor, bg, bd, font, image, width, height
# w = MenuButton(master, option=value)
# activebackground, activeforeground, bg, bd, cursor, image, width, height, highlightcolor
# w = Scrollbar(master, option=value)
# width, activebackground, bg, bd, cursor
# w = Text(master, option=value)
# highlightcolor, insertbackground, bg, font, image, width, height
# w = tk.menu button(parent, option, ...)
# activebackground, activeforeground, anchor, background or bg, cursor, compound, direction, disabledforeground, fg, font, height, highlightbackground, highlightcolor, highlightthickness, image, justify, menu, padx, pady, relief, state, takefocus, text, textvariable, underline, width, wraplength
#
#
#

# image files
# photo = PhotoImage(file = r"c:\Menu_title.png") # old sentry gun menu title

# Specify Framesw = Frame(master, option=value)
# bg, bd, cursor, height, highlightbackground, highlightcolor, highlightthickness, relief, width


# Create Buttons
# master, option=value, ...
# activebackground, activeforeground, bd, bg, command, fg, font, height, highlightcolor, image, justify, padx, pady, relief, state, underline, width, wraplength
button_1 = Button(root, justify=CENTER, text="AUTO-REMOTE", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
button_2 = Button(root, justify=CENTER, text="HARD", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
button_3 = Button(root, justify=CENTER, text="SEMIHARD", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
button_4 = Button(root, justify=CENTER, text="SOFT", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
sbutton_1 = Button(root, justify=CENTER, text="BIO", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
sbutton_2 = Button(root, justify=CENTER, text="INERT", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
tsbutton_1 = Button(root, justify=CENTER, text="MULTI SPEC", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
tsbutton_2 = Button(root, justify=CENTER, text="INFRA RED", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
tsbutton_3 = Button(root, justify=CENTER, text="UV", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
wsbutton_1 = Button(root, justify=CENTER, text="SAFE", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
wsbutton_2 = Button(root, justify=CENTER, text="ARMED", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
isbutton_1 = Button(root, justify=CENTER, text="SEARCH", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
isbutton_2 = Button(root, justify=CENTER, text="TEST", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
isbutton_3 = Button(root, justify=CENTER, text="ENGAGED", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
isbutton_4 = Button(root, justify=CENTER, text="INTERROGATE", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
trbutton_1 = Button(root, justify=CENTER, text="AUTO", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
trbutton_2 = Button(root, justify=CENTER, text="SELECTIVE", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
smman = Button(root, justify=CENTER, text="MAN-OVERRIDE", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
smauto = Button(root, justify=CENTER, text="SEMI-AUTO", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
gun_1 = Button(root, borderwidth=7, bg='black', relief=RIDGE,disabledforeground='yellow', state=DISABLED, text="kp")
gun_2 = Button(root, borderwidth=7, bg='black', fg='yellow',disabledforeground='yellow', state=DISABLED, text="kp")
# header = Button(root, image = photo, compound = TOP) # image reference
headernew = Button(root, bg='black', state=DISABLED, fg='yellow', disabledforeground='yellow',highlightbackground='yellow', borderwidth=2, justify=CENTER, text="UA 571-C \n REMOTE SENTRY WEAPON SYSTEM")
syst = Button(root, bg='black', state=DISABLED, fg='yellow', disabledforeground='yellow',highlightbackground='yellow', borderwidth=2, justify=CENTER, text="SYSTEM \n   MODE")
weap = Button(root, bg='black', state=DISABLED, fg='yellow', disabledforeground='yellow',highlightbackground='yellow', borderwidth=2, justify=CENTER, text="WEAPON \n   STATUS")
iff = Button(root, bg='black', state=DISABLED, fg='yellow', disabledforeground='yellow',highlightbackground='yellow', borderwidth=2, justify=CENTER, text="IFF \n   STATUS")
test = Button(root, bg='black', state=DISABLED, fg='yellow', disabledforeground='yellow',highlightbackground='yellow', borderwidth=2, justify=CENTER, text="TEST \n   ROUTINE")
target = Button(root, bg='black', state=DISABLED, fg='yellow', disabledforeground='yellow',highlightbackground='yellow', borderwidth=2, justify=CENTER, text="TARGET PROFILE")
spectral = Button(root, bg='black', state=DISABLED, fg='yellow', disabledforeground='yellow',highlightbackground='yellow', borderwidth=2, justify=CENTER, text="SPECTRAL PROFILE")
ts = Button(root, bg='black', state=DISABLED, fg='yellow', disabledforeground='yellow',highlightbackground='yellow', borderwidth=2, justify=CENTER, text="TARGET SELECT")
# bg='black', fg='yellow', highlightbackground='yellow', highlightcolor='black'

# Set grid
# widget.grid(grid_options)
# column, columnspan, ipadx, ipady, padx, pady, row, rowspan, sticky
gun_1.grid(row=0, column=0, ipadx=2, ipady=2, padx=2, pady=2, sticky=W)
gun_2.grid(row=0, column=7, ipadx=2, ipady=2, padx=2, pady=2, sticky=E)
headernew.grid(row=0, column=1, columnspan=6, sticky="NSEW")
button_1.grid(row=2, column=0, columnspan=2, sticky="NSEW")
button_2.grid(row=9, column=0, columnspan=3, sticky="NSEW")
button_3.grid(row=8, column=0, columnspan=3, sticky="NSEW")
button_4.grid(row=7, column=0, columnspan=3, sticky="NSEW")
sbutton_1.grid(row=7, column=3, columnspan=2, sticky="NSEW")
sbutton_2.grid(row=8, column=3, columnspan=2, sticky="NSEW")
tsbutton_1.grid(row=7, column=5, columnspan=3, sticky="NSEW")
tsbutton_2.grid(row=8, column=5, columnspan=3, sticky="NSEW")
tsbutton_3.grid(row=9, column=5, columnspan=3, sticky="NSEW")
wsbutton_1.grid(row=2, column=2, columnspan=2, sticky="NSEW")
wsbutton_2.grid(row=3, column=2, columnspan=2, sticky="NSEW")
isbutton_1.grid(row=2, column=4, columnspan=2, sticky="NSEW")
isbutton_2.grid(row=3, column=4, columnspan=2, sticky="NSEW")
isbutton_3.grid(row=4, column=4, columnspan=2, sticky="NSEW")
isbutton_4.grid(row=5, column=4, columnspan=2, sticky="NSEW")
trbutton_1.grid(row=2, column=6, columnspan=2, sticky="NSEW")
trbutton_2.grid(row=3, column=6, columnspan=2, sticky="NSEW")
smman.grid(row=3, column=0, columnspan=2, sticky="NSEW")
smauto.grid(row=4, column=0, columnspan=2, sticky="NSEW")


syst.grid(row=1, column=0, columnspan=2, sticky="NSEW")
weap.grid(row=1, column=2, columnspan=2, sticky="NSEW")
iff.grid(row=1, column=4, columnspan=2, sticky="NSEW")
test.grid(row=1, column=6, columnspan=2, sticky="NSEW")
target.grid(row=6, column=0, columnspan=3, sticky="NSEW")
spectral.grid(row=6, column=3, columnspan=2, sticky="NSEW")
ts.grid(row=6, column=5, columnspan=3, sticky="NSEW")

group1 = deque((button_1, smman, smauto))
group2 = deque((wsbutton_1, wsbutton_2))
group3 = deque((isbutton_1, isbutton_2, isbutton_3, isbutton_4))
group4 = deque((trbutton_1, trbutton_2))
group5 = deque((button_4, button_3, button_2))
group6 = deque((sbutton_1, sbutton_2))
group7 = deque((tsbutton_1, tsbutton_2, tsbutton_3))
header_group = deque(((syst, group1), (weap, group2),
                     (iff, group3), (test, group4),
                     (target, group5), (spectral, group6),
                     (ts, group7)))


def toggle_button_group(button_group):
    button_group[0].config(
        foreground='black', background='yellow', relief='sunken')
    for button in islice(button_group, 1, None):
        button.config(foreground='yellow', background='black', relief='raised')


def toggle_header_group(header_group):
    header_group[0][0].config(
        disabledforeground='black', background='yellow', relief='sunken')
    for button in islice(header_group, 1, None):
        button[0].config(disabledforeground='yellow',
                         background='black', relief='raised')


def start_with_first_selected(first_selected=False):
    if first_selected:
        toggle_button_group(group1)
        toggle_button_group(group2)
        toggle_button_group(group3)
        toggle_button_group(group4)
        toggle_button_group(group5)
        toggle_button_group(group6)
        toggle_button_group(group7)
    else:
        # set last of each group to selected
        group1.rotate(1)
        group2.rotate(1)
        group3.rotate(1)
        group4.rotate(1)
        group5.rotate(1)
        group6.rotate(1)
        group7.rotate(1)


start_with_first_selected(False)
toggle_header_group(header_group)


def on_down(event):
    group = header_group[0][1]
    group.rotate(-1)
    toggle_button_group(group)


def on_up(event):
    group = header_group[0][1]
    group.rotate(1)
    toggle_button_group(group)


def on_left(event):
    header_group.rotate(1)
    toggle_header_group(header_group)


def on_right(event):
    header_group.rotate(-1)
    toggle_header_group(header_group)


root.bind('<Down>', on_down)
root.bind('<Up>', on_up)
root.bind('<Left>', on_left)
root.bind('<Right>', on_right)

# while True:
# # Execute tkinter
root.mainloop()
#   for event in pygame.event.get():
#     if event.type == pygame.KEYDOWN:
#       if event.key == pygame.K_q:
#         pygame.quit()
#         sys.exit(0)
#         quit()
#         break
#   if keys[pygame.K_w]:
#     break

Thanks! I will give that a go this weekend. Your help is greatly appreciated. The more I do this stuff the more I learn.
Reply


Messages In This Thread
arrow key selection for menu - by knoxvilles_joker - Apr-13-2021, 03:09 PM
RE: arrow key selection for menu - by Yoriz - Apr-13-2021, 04:33 PM
RE: arrow key selection for menu - by Yoriz - Apr-14-2021, 06:57 PM
RE: arrow key selection for menu - by knoxvilles_joker - Apr-15-2021, 03:17 PM

Possibly Related Threads…
Thread Author Replies Views Last Post
  Python Turtle. Pointers of the "arrow" direction of the vector. roomONmoon 1 859 Dec-09-2023, 11:49 PM
Last Post: deanhystad
  How to move in entries using the arrow keys by applying the bind and focus? pymn 4 5,137 Apr-06-2022, 04:29 AM
Last Post: pymn

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020