2015-01-17 17 views
0

当我在IDLE shell中运行它时,它工作正常 (COM10是一个虚拟COM端口(VCP)USB存储棒)。'enumerate serial port'循环在Tkinter中过早停止 - 但不在IDLE shell中。

>>> from serial import * 
>>> import serial.tools.list_ports 
>>> PortVal = sorted(serial.tools.list_ports.comports()) 
>>> for n,(p1,p2,p3) in enumerate(PortVal): 
>>>   print p1 


COM1 
COM10 

但是,当它运行在一个Tkinter的'后的按键通话”功能...

def ShowPorts(): 
    PortVal = sorted(serial.tools.list_ports.comports()) 
    for n,(p1,p2,p3) in enumerate(PortVal): 
     print p1 

一次迭代后的循环停止,就像...

(Pressed the RUN button in Wing IDE) 
2.7 (r27:82525, Jul 4 2010, 09:01:59) [MSC v.1500 32 bit (Intel)] 
Python Type "help", "copyright", "credits" or "license" for more information. 
[evaluate SerPortTest.py] 

(我按`做它”按钮...)

COM1 

然后当我再次按下按钮...

COM10 
COM1 

任何想法,为什么 - 做什么? 这是否与某个地方的“Try”有关?

+0

我不认为有足够的代码知道是什么问题。你确定函数正在停止,还是可能是输出不是立即显示?也许是导致问题的“Wing IDE”。你有没有尝试从命令提示符运行你的代码? –

回答

0

嗯,我不再在意Wing IDE是否搞砸了我现在认为它做的 - 因为我似乎已经解决了我原来的'NoneType'对象没有属性'insert'“列表框问题。它似乎在'.pack'在一个单独的行上 - 不知道为什么。另外,我还有一个习惯,在把它们分配给我之前没有用过的小部件之前,先将它们打印到调试窗口 - 然后Wing-101 IDE问题就会出现。

工作代码...

from Tkinter import * 
from serial import * 
import serial.tools.list_ports 

root = Tk() 
root.wm_title("Port List") 

# ---------------------------------------------------------- 
# Widget-called functions 
# ---------------------------------------------------------- 
def ListPorts(): 
    PortVal = sorted(serial.tools.list_ports.comports()) 
    PortVal = enumerate(PortVal) 
    #print list(PortVal) 
    for n,(p1,p2,p3) in PortVal: 
     PortList.insert(END,p1) 

# ---------------------------------------------------------- 
# GUI Widgets 
# ---------------------------------------------------------- 
FrmPort= Frame(root, padx=10, pady=10, borderwidth=7, relief="raised") 

BtnLstPort=Button(FrmPort,text='List COM Ports',command=ListPorts) 
PortList=Listbox(FrmPort,height=4,width=8) 
BtnLstPort.pack() 
PortList.pack() 

FrmPort.pack() 

# ---------------------------------------------------------- 
# Let'er rip 
# ---------------------------------------------------------- 
root.mainloop() 

感谢您的帮助 - 在任何方向的小蹭经常鞭策我的成功。 (只是让我走出我的车辙!):-)

PS。如果您正在寻找串行端口,因为您只是插入了串行端口 - 可能性会列在最后。
要自动默认选择...

PortList.selection_set(END) 
PortList.see(END) 
PortList.activate(END) 
+0

回复:“_似乎在'.pack'上分开一行 - 不知道为什么._”。为什么在这个网站上被问及多次回答。 'pack()'返回None,所以如果你做'foo = Label(...)。pack(...)',foo将永远是None。但是,这是一个完全不同于问题中提出的问题。 –