2017-04-08 4 views
0

Ich verwende eine OptionMenu eine Option aus einer Drop-Down-Tkinter StringVar erhalten Index ausgewählter Option

self.var = tk.StringVar() 
tk.OptionMenu(self, self.var, *self.options) 

Die Optionen wählen Duplikate

Aus diesem Grund enthalten könnte, wenn ich die Option wissen möchten ausgewählt ist, muss ich seinen Index in der Optionsliste kennen, nicht nur seinen Text.

self.options.index(self.var.get()) 

Dies ist jedoch O (n) und schlägt auch mit Duplikaten.

Wie kann ich den Index des Auswahlobjekts in einer Weise herausfinden, die mit Duplikaten arbeitet (Effizienz bevorzugt, aber nicht erforderlich)?

Antwort

0

Leider scheint dies impossible.

Allerdings konnte ich einen (hässlichen) Workaround bekommen. Es basiert auf ttk.Combox (von denen der Eingangsteil deaktiviert ist). Diese Methode fügt jeder Option am Ende einen Zähler hinzu. Aufgrund der endgültigen Breite der Widget-Anzeige wird dieser Zähler nicht angezeigt. Es erhält den Index ziemlich effizient, aber wegen zusätzlichen Leerzeichen, Speicherung von Speicher möglicherweise nicht optimal sein ....

import tkinter as tk 
from tkinter import ttk 

def set_index(text): 
    output=() 
    counter=0 
    for s in text: 
     output += (s.ljust(width+extra_whitespace)+str(counter),) 
     counter += 1 
    return output 

def get_index(*x): 
    s= OptionVar.get() 
    a = int(s[s.rfind(" "):]) 
    print(a) 
    return a 

root = tk.Tk() 

text = ("a","a","a","a","d","g","fgggggggh","j","a","l","p","a","d","D") 

# not entirely sure if width is based on character_width 
# you should adjust these nubmer to your own needs.... 
width = max(map(len,text)) + 3 
extra_whitespace = 20 

text_with_index = set_index(text) 


OptionVar = tk.StringVar() 
OptionVar.set(text_with_index[0]) 
OptionVar.trace("w", get_index) 

O = ttk.Combobox(root, textvariable=OptionVar, values=text_with_index) 
O.pack() 
O.configure(width=width) 
O.configure(state="readonly") 

get_index() 


root.mainloop() 

(Vorschlag, man auch die Schriftart einstellen kann ... das machen kann es leichter einzustellen width und extra_whitespace)

0
int(np.argwhere(List==value)) 

Nähe ist aber nicht Duplikate

erkennen
Verwandte Themen