Python:无法从空列表中弹出

时间:2014-03-22 13:36:19

标签: python

我正在创建一个python程序来检测并启用usb以在usb存储驱动器之间进行usb数据传输。但是,我在更新dev_label(驱动器的设备名称)并将其传递给Exchange时遇到问题。这是代码:

serial_list=[]
context = Context()
monitor = Monitor.from_netlink(context)
monitor.filter_by(subsystem='block',device_type='partition')
observer = GUDevMonitorObserver(monitor)


def device_connected(observer, device):
    Welcome.device_count+=1

    flag =False
    for iden in serial_list :
        if iden == device.__getitem__('ID_SERIAL_SHORT'):
            flag=True

    if flag ==False:
        serial_list.append(device.__getitem__('ID_SERIAL_SHORT'))
        Welcome.dev_label.append(str(device.__getitem__('ID_FS_LABEL')))
        size = len(Welcome.dev_label)
        label = gtk.Label('Device connected :: {0!r}'.format(Welcome.dev_label[size-1]))
        Welcome.vbox.pack_start(label)
        Welcome.window.show_all()

    if Welcome.device_count<2:
        label = gtk.Label('Connect the second device')
        Welcome.vbox.pack_start(label)
        Welcome.window.show_all()


    else :
        Exchange()

observer.connect("device-added",device_connected)
monitor.start()

class Welcome:
    device_count = 0    
    window = gtk.Window()
    vbox= gtk.VBox(False, 5)
    dev_label = []

    def __init__(self):

        self.window.set_default_size(300, 300)
        self.window.set_title("Welcome")

        label = gtk.Label("Connect the desired device")

        self.vbox.pack_start(label)
        self.window.add(self.vbox)

        self.window.connect("destroy", lambda q: gtk.main_quit())
        self.window.show_all()

class Exchange:
    window1 = gtk.Window(Welcome.dev_label.pop())
    window2 = gtk.Window(Welcome.dev_label.pop())
    def __init__(self):

        width = gtk.gdk.screen_get_default().get_width()
        height = gtk.gdk.screen_get_default().get_height()

        self.window1.resize(width/2,height)
        self.window2.resize(width/2,height)

        self.window2.move(self.window1.get_position()[0]+width/2, self.window1.get_position()[1])

        label = gtk.Label("Hello")
        self.window1.add(label)

        self.window1.connect("destroy" , lambda q : gtk.main_quit())
        self.window1.show_all()

        label = gtk.Label("World")
        self.window2.add(label)

        self.window2.connect("destroy",lambda q : gtk.main_quit())
        self.window2.show_all()        




Welcome()
gtk.main()

追溯中显示的错误是:

Traceback (most recent call last):
  File "project.py", line 70, in <module>
    class Exchange:
  File "project.py", line 71, in Exchange
    window1 = gtk.Window(Welcome.dev_label.pop())
IndexError: pop from empty list

我无法弄清楚如何同步所有这些事件,以便编译器不会抛出错误。只有在Welcome.dev_label更新后才会从device_connected弹出值,那么为什么编译器会出现问题?我是一个蟒蛇新手,所以请保持温柔。

1 个答案:

答案 0 :(得分:0)

这不是编译器的givin错误,而是程序。

您可以将课程更改为:

import time
class Exchange:
    while not Welcome.dev_label: time.sleep(0.001)
    window1 = gtk.Window(Welcome.dev_label.pop()) # line 4
    while not Welcome.dev_label: time.sleep(0.001)
    window2 = gtk.Window(Welcome.dev_label.pop())

这将是一种同步原语,只有第4行和第6行删除内容。 一般来说,你会使用一个队列。

import queue # Python3 # import Queue Python 2
Welcome.dev_label # = queue.Queue()
Welcome.dev_label.put(...) # instead of append
Welcome.dev_label.get(...) # instead of pop

但我不知道您的代码是否使用线程并且并行运行。如果time.sleep示例有效,则可以切换到队列。