我创建了一个组合框循环,并将所做的选择附加到列表中。共有3个组合框。列表必须有3个相应的元素。问题是,如果我在选择和替换选项时改变主意,列表(当然(的大小会增加。在这个代码中,我有3个选项:"The One!","或多或少","坏"。我想在选择过程中更改选项,但保持列表中始终有3个与组合框数量相对应的唯一元素。我一直在努力使用set,但没有成功,因为实际的循环很大。
我需要一个列表,其中只有一个组合框的长度,其结果与最后的选择相对应,与我所做的选择更改的数量无关。
谢谢你的帮助。
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()
印刷品增加到三个,好吧,但随后继续。。。我需要保持list=combox-len的大小,并在最后自由更新最后3个选项的值。
["The One!"]
["一个!","或多或少"]
您可以通过使用列表切片来限制列表长度。
def get_combo_choice(event, cmb):
global result
result.append(cmb.get())
# limit list len to 3 using ~2
result = result[~2:]
print(result)
为了控制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 \ loop内插入best.append(bestPlayers)
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()
代码结果:
["一个!",没有,没有]
["一个!",没有,没有]
["一个!",没有,没有]
["一个!","或多或少",无]
最后一个问题:in:def get_combo_choice(事件,cmb(:
我理解事件(选项-->例如:"一个"(,
cbm(-->变量(,结果使用索引从最佳(列表(、中进行选择
我不明白的是,如果best是一个我们已经知道的列表,为什么我不能使用I=best.index((。什么是(event.widget(,它在那里做什么?顺便说一下,你的代码符合我的所有需求。