Tkinter pythonu 3.8 comboboxes ve smyčce. Jak opravit špatné volby při přidání do seznamu?

0

Otázka

Ive vytvořil smyčku comboboxes a jsem připojí volby jsem se do seznamu. K dispozici jsou 3 comboboxes. Seznam musí mít 3 odpovídající prvky. Problém je, že pokud změním názor při výběru a nahradit možnost, seznam (samozřejmě), zvyšuje ve velikosti. V tomto kódu mám 3 možnosti: '!', "více či méně",'špatné'. Chci změnit možnosti při výběru, ale vedení seznamu vždy s 3 unikátní prvky odpovídající počet combobox. Jsem myslel o používání set, ale nefungoval, protože skutečné smyčky je velký.

Potřebuju seznam s jen len z comboboxes s výsledek odpovídá poslední volby, a to nezávisle na počtu volba změny jsem udělal.

Děkuji za jakoukoliv pomoc.

from tkinter import  ttk
from tkinter import Tk
from tkinter import Button

root = Tk()
my_heroes = ['Zidane', 'Ronaldo', 'Messi']
position = ['The One!', 'more or less','the bad']
result =[]

def get_combo_choice(event, cmb):
    result.append(cmb.get())
    print(result)
    
  
for index, heroe in enumerate(my_heroes):
    var = StringVar()
    bestPlayers = ttk.Combobox(root,values=position, textvariable=var, state="readonly")
    bestPlayers.grid(row=0 + index, column=1,padx=(15,25))
    
    label = Label(root, text = heroe)
    label.grid(row=0 + index, column=0,padx=(15,25))

    bestPlayers.bind("<<ComboboxSelected>>",lambda event, cmb=var:get_combo_choice(event, cmb))

    
    button = Button(root, text ="get list of choices", command = callback)
    button.grid(row=4, column=0,padx=(15,25))

root.mainloop()

Tiskové roste na tři, ok, ale pak pokračuje... Musím udržet velikost seznam = combobox len a volně aktualizovat hodnoty poslední 3 možnosti na konci.

['!']

['!', "více či méně"]

['!', "více či méně", 'špatné']

['!', "více či méně", 'špatný','!']

['!', "více či méně", 'špatný','!', "více či méně"]

['!', "více či méně", 'špatný','!', "více či méně", '!']

['!', "více či méně", 'špatný','!', "více či méně", '!', "více či méně"]

['!', "více či méně", 'špatný','!', "více či méně", '!', "více či méně", "více či méně"]

append combobox list python
2021-11-14 02:36:19
3

Nejlepší odpověď

1

Můžete omezit seznam délce usng seznam plátek.

def get_combo_choice(event, cmb):
    global result
    result.append(cmb.get())
    # limit list len to 3 using ~2
    result = result[~2:]
    print(result)

Za účelem kontroly result sloupce pár věcí, které musí být přidány do vašeho kódu.

result =[None, None, None]
best = []

# Here's the alternative 
def get_combo_choice(event, cmb):
    i = best.index(event.widget)
    result[i] = cmb.get()
    print(result)

Uvnitř\loop vložka best.append(bestPlayers)

2021-11-14 08:02:33

Zajímavé, ale, řekněme, že jsem změnit první combobox 3 nebo více krát a vyberte combobox 2 a 3 jen jednou každý. V seznamu se zobrazí jen poslední tři vybere z první combobox a ne to, co potřebuji: poslední výběr combobox1, první výběr z combo 2 a 3. Jak to vyřešit hlavní problém?
pkanda

To je trochu složitější, ale budu měnit mé odpovědi zahrnout alternativní.
Derek
0

Pane Dereku Aktualizoval jsem můj kód s vaší odpovědí. Funguje to jako kouzlo!! Jsi učil mě hodně, velký dík!

import tkinter as tk
from tkinter import  ttk
from tkinter import Tk
from tkinter import Button

root = Tk()
my_heroes = ['Zidane', 'Ronaldo', 'Messi']
position = ['The One!', 'more or less','the bad']
# result =[]

# def get_combo_choice(event, cmb):
#     result.append(cmb.get())
#     print(result)
result =[None, None, None]
best = []

# Here's the alternative 
def get_combo_choice(event, cmb):
    i = best.index(event.widget)
    result[i] = cmb.get()
    print(result)    
  
for index, heroe in enumerate(my_heroes):
    var = tk.StringVar()
    bestPlayers = ttk.Combobox(root,values=position, textvariable=var, state="readonly")
    best.append(bestPlayers)
    bestPlayers.grid(row=0 + index, column=1,padx=(15,25))
    
    label = tk.Label(root, text = heroe)
    label.grid(row=0 + index, column=0,padx=(15,25))

    bestPlayers.bind("<<ComboboxSelected>>",lambda event, cmb=var:get_combo_choice(event, cmb))

    
    button = tk.Button(root, text ="get list of choices", command = get_combo_choice)
    button.grid(row=4, column=0,padx=(15,25))

root.mainloop()

kód následek :

['!', None, None]

['!', None, None]

['!', None, None]

['!', "více či méně", None]

['!', "více či méně", 'špatné']

2021-11-14 03:28:43
0

Poslední otázka: v: def get_combo_choice(události, cmb):

Chápu, akce(výběr--> ex:"jeden"),

cbm (--> proměnné) a že výsledky použití indexu, aby si výběr z nejlepších(seznam),

čemu nerozumím je to, proč nemůžu používat, i = nejlepší.index (), když nejlepší je seznam již víme. Co je (událost.widget) a co je to tam dělá? Mimochodem váš kód vyhovuje všem mým potřebám.

2021-11-15 11:02:24

event.widget je odkaz na objekt v object.bind( což v tomto případě je Comboboxpak i = best.index( hledání best seznam a vrátí celé číslo index pro event.widget (0, 1 nebo 2).
Derek

Pane Dereku, díky za Osvícení !!
pkanda

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................