我在pygame中编写了一个滚动列表窗口小部件(我知道,它很愚蠢,我承认它。但我很乐意这样做)无论如何,这个函数由一个文件查看器对象进行线程化,该对象传递一个实例本身连同一个绝对路径,addr,来显示内容。
首先收集文件名,然后将它们存储在2个成员数组中,文件名作为第一个实例,格式化消息作为第二个成员显示在屏幕上:
示例:["videos","[34]: D -- videos"]
忙碌的功能等待用户点击其中一个图块作为他/她的输入:obj.waitingForReply
。 obj.Answer
存储用户点击的面板的元组。如果它存储一个目录,该函数应该调用自己来查看目录的内容,如果它是一个文件,函数退出并且线程通过将obj.Quit
设置为true来结束。这也会杀死文件查看器的实例,因为它的目的是为用户提供一个GUI来选择要读入程序的文件。每当我进入另一个目录时它立即崩溃,但随后选择离开并返回上一个父目录,方法是选择:Back: [1]: D -- Desktop
当我选择另一个目录进行查看时显示。
我正在考虑使用队列作为信号量,但我不认为这是我的问题
代码:
def listdirectory(obj,addr,prev=False,type="D",error=0):
var=0
choose = 1
yesnext=False
yesprev=False
next=0
print "in listdirectory"
while(obj.Quit==False):
mylist = []
if(prev!=False):
yesprev=True
what = "F"
if(os.path.isdir(prev)):
what="D"
m = re.split("\/",prev)
mylist.append([prev, format1(choose,what,m[(len(m)-1)],1)])
choose+=1
if(yesnext):
what = "F"
if(os.path.isdir(next)):
what="D"
m = re.split("\/",next)
mylist.append([next, format1(choose,what,m[(len(m)-1)],0)])
choose+=1
for items in os.listdir(addr):
what = "F"
check = concat(concat(addr,"/"),items)
if(os.path.isdir(check)):
what="D"
m = re.split("\/",items)
mylist.append([items, format2(choose,what,m[(len(m)-1)])])
choose+=1
print "listdirectory, currDrawing spinlock"
while obj.currDrawing:
var = (var+1)%2
obj.currDrawing=True
obj.loaddir(mylist)
obj.currDrawing=False
obj.waitingForReply=True
while obj.waitingForReply:
var = (var+1)%2
if(obj.Answer!=False):
chkprev = re.split("\/",addr)
apath = concat(concat(addr,"/"),obj.Answer[0])
if(obj.Answer[0]==chkprev[(len(chkprev)-2)]):
return addr
elif(os.path.isdir(apath)):
yesnext=True
next = listdirectory(obj,apath,addr)
print "value of next: %r" % next
next = re.split("\/",next)
next = next[(len(next)-1)]
else:
obj.Quit=True
choose=1
崩溃时:
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/threading.py", line 486, in __bootstrap_inner
self.run()
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/threading.py", line 446, in run
self.__target(*self.__args, **self.__kwargs)
File "/Users/Jason/Desktop/cup-robot-project/cup-robot-3/src/fileopener.py", line 524, in listdirectory
next = re.split("\/",next)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/re.py", line 165, in split
return _compile(pattern, 0).split(string, maxsplit)
TypeError: expected string or buffer
只是为了澄清:return addr
用于调用前一个listdirectory函数。当它退出时,函数不应返回任何内容,因为所需的变量存储在self.Answer
中,可通过其中一个对象成员函数进行访问。整个函数在技术上是一个守护进程:while self.Quit==False
IDK,如果它改变任何东西
答案 0 :(得分:2)
函数中唯一的return
语句是:
if(obj.Answer[0]==chkprev[(len(chkprev)-2)]):
return addr
如果此条件不成立,并且以下语句os.path.isdir(apath)
不为True,它将到达行obj.Quit=True
,离开for循环,然后到达函数的末尾,其中有没有return
。此时它将返回None
。