Tkinter Combobox показывает только последний элемент
Я пытаюсь реализовать Combobox в приложении Python, используя Tkinter. Основная цель - показать устройства COM, подключенные к компьютеру (протестировано с Arduino и micro:bit). На некоторых ноутбуках также будет много COM-портов. Я использовал также список для отладки - и выглядит хорошо в этой части.
Tkinter Combobox и ListBox пример
Мой код: (извините, он немного большой, потому что я сделал на странице.
import serial.tools.list_ports
ports = serial.tools.list_ports.comports()
try:
import Tkinter as tk
except ImportError:
import tkinter as tk
try:
import ttk
py3 = False
except ImportError:
import tkinter.ttk as ttk
py3 = True
class Toplevel1:
def __init__(self, top=None):
top.geometry("600x247+274+330")
top.title("Teste COM")
top.configure(background="#d9d9d9")
self.Btn_COM = tk.Button(top)
self.Btn_COM.place(x=70, y=30, height=24, width=47)
self.Btn_COM.configure(command=self.check_com)
self.Btn_COM.configure(text='''COM''')
self.Btn_COM.configure(width=47)
self.TCombobox1 = ttk.Combobox(top)
self.TCombobox1.place(x=140, y=35, height=21, width=143)
self.Listbox1 = tk.Listbox(top)
self.Listbox1.place(x=415, y=20, height=137, width=119)
self.Listbox1.configure(background="white")
self.Listbox1.configure(width=119)
def check_com(self):
# Clean list box before send a new command
self.Listbox1.delete(0,'end')
for port, desc, hwid in sorted(ports):
print (port)
self.TCombobox1['values']=[port]
self.Listbox1.insert("end", port)
if __name__ == '__main__':
global val, w, root
root = tk.Tk()
top = Toplevel1 (root)
root.mainloop()
Цените любую помощь, которую я использую Python 3.7, но я также тестировал в 2.7.
Спасибо!
2 ответа
Ваш выпадающий список показывал только одно значение, потому что вы переопределяли его значение для каждого порта в цикле, из-за чего он оставался одним [port]
, Вместо этого вы должны установить список всех ваших портов вне цикла следующим образом:
def check_com(self):
# Clean list box before send a new command
ports = [1,2,3] # created example ports for testing
self.Listbox1.delete(0,'end')
self.TCombobox1['values'] = ports
for port in sorted(ports):
print(port)
self.Listbox1.insert("end", port)
Основываясь на ответе Филипа, я пробовал второй тест, создавая список из порта и добавляя его в каждом случае. По ошибке я разместил self.TCombobox1['values']=(lst)
вместо self.TCombobox1['values']=[lst]
, Таким образом, изменяя [lst] на (lst). (паратезы х браслеты) Я понятия не имею, почему теперь стало иначе, но это сработало.
def check_com(self):
# Clean list box before send a new command
self.Listbox1.delete(0,'end')
lst = []
for port, desc, hwid in sorted(ports):
lst.append(port)
# if I use lst.append[port will not work
print (lst)
self.TCombobox1['values']=(lst)
self.Listbox1.insert("end", port)