在 Tkinter Python 中,当 listbox 的选择模式设置为 “extended” 时,需要获取选定的项。例如,在 listbox 中选择多个脚本,并将这些脚本作为参数传递给解释器,以逐个运行这些脚本并给出结果。然而,使用以下方法只能选择一个脚本:
def get_list(*event):
que2.put_nowait(script)
seltext = liste.get(index)
script=seltext
que2.put_nowait(script)
def get_port(event):
index = liste1.curselection()[0]
seltext = liste1.get(index)
nb_port=seltext[1]
que1.put_nowait(nb_port)
def call_interpreter1():
b=que2.get(block=True)
a=que1.get(block=True)
print "prameters are :" ,a ,b ,"\r\n"
c='python C:\\workspace\\Project_Interpreter\\ValidationTool-v1.0.py -s %s %s'%(b,a)
ps=sp.Popen(['cmd','/K',c],creationflags=0,shell=False,stdout=PIPE,stderr=sp.STDOUT,stdin=PIPE)
- 解决方案
要获取选择,需要在 listbox 上调用curselection
方法。此方法返回一个包含每个选中项索引的列表。然后可以使用get
方法获取该索引处的项。
for index in liste1.curselection():
item = liste1.get(index)
print(index, ":", item)
示例代码:
import tkinter as tk
from queue import Queue
que1 = Queue()
que2 = Queue()
def get_list(*event):
for index in liste.curselection():
script = liste.get(index)
que2.put_nowait(script)
def get_port(event):
index = liste1.curselection()[0]
seltext = liste1.get(index)
nb_port=seltext[1]
que1.put_nowait(nb_port)
def call_interpreter1():
b=que2.get(block=True)
a=que1.get(block=True)
print("prameters are :",a ,b ,"\r\n")
c='python C:\\workspace\\Project_Interpreter\\ValidationTool-v1.0.py -s %s %s'%(b,a)
ps=sp.Popen(['cmd','/K',c],creationflags=0,shell=False,stdout=PIPE,stderr=sp.STDOUT,stdin=PIPE)
root = tk.Tk()
liste = tk.Listbox(root, height=5, width=30, selectmode="extended")
liste.insert(1, "Script 1")
liste.insert(2, "Script 2")
liste.insert(3, "Script 3")
liste.insert(4, "Script 4")
liste.insert(5, "Script 5")
liste1 = tk.Listbox(root, height=5, width=30, selectmode="extended")
liste1.insert(1, ("Port 1", 1))
liste1.insert(2, ("Port 2", 2))
liste1.insert(3, ("Port 3", 3))
btn_get_list = tk.Button(root, text="Get List", command=get_list)
btn_get_port = tk.Button(root, text="Get Port", command=get_port)
btn_call_interpreter = tk.Button(root, text="Call Interpreter", command=call_interpreter1)
liste.pack()
liste1.pack()
btn_get_list.pack()
btn_get_port.pack()
btn_call_interpreter.pack()
root.mainloop()
在上面的代码中,我们创建了两个 Listbox,每个 Listbox 都在创建时指定了 selectmode="extended"
,表示可以多选。然后,绑定了按钮事件,以便在用户点击按钮时获取所选项目。
当用户点击 “Get List” 按钮时,get_list
函数将遍历选定的项并将其放入队列 que2
中。
当用户点击 “Get Port” 按钮时,get_port
函数将获取第一个选定项的索引,并使用 get
方法获取该项的文本。然后将文本解析为端口号,并将其放入队列 que1
中。
当用户点击 “Call Interpreter” 按钮时,call_interpreter1
函数将从队列 que2
和 que1
中获取选定的脚本和端口号,并将这些信息作为参数传递给解释器。解释器将运行选定的脚本,并给出结果。