首页 > 解决方案 > 在python中的列表框之间移动项目

问题描述

我是 python 的新手,我身后只有一点 VBA 经验。我正在尝试使用 tkinter 创建一个简单的卡片跟踪程序。我希望能够在两个列表框之间移动卡片,以便它们可以首先被丢弃然后返回到牌组。我已经掌握了基础知识,设置了两个列表框和两个在它们之间移动卡片的按钮;但是,我无法为列表框中的选定卡片执行此操作。(目前它只是设置为移动第一个值。)

我一直在寻找解决方案,但几乎没有编程经验,我无法解释我的代码中已经存在的各种解决方案。从我读过的内容来看,列表框返回的格式和使用索引值之间似乎存在一些不兼容。我找到了有关如何将一种转换为另一种的各种建议,但未能使其对自己有用!

非常感谢您的帮助!

 from tkinter import *
root = Tk()
root.title("Twilight Struggle Card Counter")
root.geometry("1400x600")

#Define named cards
KOH = "King of Hearts"
QOD = "Queen of Diamonds"

#Compile card lists
Draw = [KOH,QOD,3,4,5,6]
Discard = []

#Create Draw listbox
Drawbox = Listbox(root,width=20)
Drawbox.pack(pady=15)

#Create Discard listbox
Discardbox = Listbox(root,width=20)
Discardbox.pack(pady=20)

#Add lists to listbox
for item in Draw:
    Drawbox.insert(END, item)

for item in Discard:
    Discardbox.insert(END, item)

#need to find a way to convert listbox value to integer
a = Drawbox.index(ACTIVE)
b = Discardbox.index(ACTIVE)

#Discard button
def discard():
    Discard.append(Draw.pop(a))
    Drawbox.delete(0, END)  #clear listbox
    for item in Draw:
        Drawbox.insert(END, item)
    Discardbox.delete(0, END)
    for item in Discard:
        Discardbox.insert(END, item)
    
    print("Draw", Draw, "Discard", Discard)
    
Discard_Button = Button(root,text="Discard", command=discard)
Discard_Button.pack(pady=10)

#Add button
def Add():
    Draw.append(Discard.pop(b))
    Discardbox.delete(0, END)  #clear listbox
    for item in Discard:
        Discardbox.insert(END, item)
    Drawbox.delete(0, END)
    for item in Draw:
        Drawbox.insert(END, item)
    
    print("Draw", Draw, "Discard", Discard)
    
Add_Button = Button(root,text="Add", command=Add)
Add_Button.pack(pady=10)

root.mainloop()


 

标签: pythontkinterlistbox

解决方案


您可以使用该curselection方法获取当前选择的项目。它将返回一个列表,因此您需要从列表中获取所选项目的索引。

解决方案看起来像这样:

def discard():
    selection = Drawbox.curselection()
    if selection:
        index = selection[0]
        card = Draw.pop(index)
        Discard.append(card)
        Drawbox.delete(index)
        Discardbox.insert("end", card)

推荐阅读