Так что это класс виджетов, который я использую, когда мне нужно выпадающее меню.Он вызывает функцию всякий раз, когда значение изменилось.он использует ttk
вместо вашего tk
виджета, но они работают вместе (ttk более нативный).
from tkinter import ttk
class Dropdown(ttk.Combobox):
def __init__(self, master, values, command = None):
super().__init__(master=master, state="readonly")
self["values"] = values
if len(values) == 0:
raise Exception("Dropdown values cannot be of length 0")
self.current(0) # Current value index
self.command = command
self.prev_val = self["values"][0]
self.bind("<<ComboboxSelected>>", self.on_selected)
@property
def values(self):
return self["values"]
def on_selected(self, event=None):
# Stops the callback from being called if the value is the same previously
if self.get() != self.prev_val:
self.prev_val = self.get()
if self.command is not None:
self.command()
# Returns the index of the current value
def get_index(self):
return self["values"].index(self.get())
EDIT: Вы можете проверить виджет, используя следующий код
import tkinter as tk
def dropdown_callback():
print("Value:", dropdown.get(), "| Index:", dropdown.get_index(), "| Values:", dropdown.values)
root = tk.Tk()
dropdown = Dropdown(root, ("Value 1", "Value 2", "Value 3"), dropdown_callback)
dropdown.pack()