Tkinter python 3.8组合框在循环中.如何在添加到列表时更正错误的选择



我创建了一个组合框循环,并将所做的选择附加到列表中。共有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)

Derek先生我用你的答案更新了我的代码。它就像一个符咒!!你教了我很多,非常感谢!
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(,它在那里做什么?顺便说一下,你的代码符合我的所有需求。

相关内容

  • 没有找到相关文章

最新更新