0

我正在尝试使用 Tkinter 在 python 应用程序中实现一个组合框。主要目的是显示连接到计算机的 COM 设备(使用 Arduino 和 micro:bit 测试)。一些笔记本电脑也会显示很多 COM 端口。我还使用了一个列表框进行调试 - 在这部分看起来很好。

Tkinter 组合框和列表框示例

我的代码:(对不起,它有点大,因为我是在 PAGE 上制作的。

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 中进行了测试。

谢谢!

4

2 回答 2

1

您的组合框仅显示一个值,因为您在循环中的每个端口都覆盖了它的值,这使得它只有一个[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)
于 2018-12-07T19:22:41.220 回答
0

根据 Filip 的回答,我尝试了第二个测试,从端口创建一个列表并在每个交互中附加。我错误地放置self.TCombobox1['values']=(lst)了而不是self.TCombobox1['values']=[lst]. 因此将 [lst] 更改为 (lst)。(paratheses x bakets)我不知道为什么现在变得不同了,但它起作用了。

带有 [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)
于 2018-12-08T01:44:32.860 回答