<p>您不能以您正在尝试的方式执行此操作,因为<code>time.sleep</code>将阻止并锁定整个应用程序。ArcGIS中的Python插件是非常新的东西,还有很多功能还没有实现。其中之一是某种更新或计时器事件,就像在.NET和ArcObjects中遇到的一样。你可以考虑用线程。线程以及线程。事件在这样的情况下,但是与线程无关的内容在Python加载项环境中不起作用。至少我不能让它工作。所以我在这种情况下所做的就是使用wxPython和Timer类。如果加载项设置正确,下面的代码将有效。在</p>
<pre><code>import time
import os, sys
import wx
import arcpy
mp = os.path.dirname(__file__)
sys.path.append(mp)
WATCHER = None
class LibLoader1(object):
"""Extension Implementation"""
def __init__(self):
self.enabled = True
def startup(self):
global WATCHER
WATCHER = watcherDialog()
class ButtonClass5(object):
"""Button Implementation"""
def __init__(self):
self.enabled = True
self.checked = False
def onClick(self):
if not WATCHER.timer.IsRunning():
WATCHER.timer.Start(5000)
else:
WATCHER.timer.Stop()
class watcherDialog(wx.Frame):
'''Frame subclass, just used as a timer event.'''
def __init__(self):
wx.Frame.__init__(self, None, -1, "timer_event")
#set up timer
self.timer = wx.Timer(self)
self.Bind(wx.EVT_TIMER, self.onTimer, self.timer)
def onTimer(self, event):
localtime = time.asctime( time.localtime(time.time()) )
print "Refresh at :", localtime
arcpy.RefreshActiveView()
app = wx.App(False)
</code></pre>
<p>制作一个扩展插件,包含一个工具栏和一个button类。如上所示,重写扩展的<code>startup</code>方法。它将创建一个带有计时器的Frame子类的实例。然后,无论何时单击工具栏上的按钮,计时器都将打开或关闭。计时器参数以毫秒为单位,因此显示的代码将每5秒刷新一次。在</p>
<p>您可以阅读有关在addins<a href="http://forums.arcgis.com/threads/41809-wxPython-hooked-to-arcmap" rel="nofollow">here</a>中使用wxPython的更多信息。特别要注意MCederholm的帖子,比如说打印声明不起作用。在</p>
<h3>编辑</h3>
<p>代码使用addin扩展类的<code>startup</code>方法重写。这个方法应该在Arcmap启动时运行,但是从您的注释来看,这个启动方法在启动时无法运行。如果你不能正确地创建你的外接程序,这是可能的,但是在我的测试中,它对我很有效。如果继续获取“AttributeError:'NoneType'object没有属性'timer'”,请更改按钮类的<code>onClick</code>方法,如下所示:</p>
^{pr2}$
<p>前3行检查以确保WATCHER变量已设置为<code>watcherDialog</code>的实例,并且没有仍然设置为<code>None</code>。不知道为什么你的启动方法没有运行,但希望这能帮你解决问题。在</p>