我创建了一个python脚本,该脚本基于一组复杂的While/If/Elif/Else循环来验证属性。出于我的目的,我创建了一个while循环,以确保目标行的属性是可接受的输入,然后它遵循矩阵。如果属性不被接受,它应该使用Tkinter创建一个具有接受选项的GUI,然后单击其中一个,它会将其分配给该属性,并沿着矩阵向下继续!!
我对此感到非常兴奋,并把它全部写出来,因为我对自己的编码有信心,并希望它能在第一次运行(多么愚蠢(。但现在是测试它的时候了,瞧,Tkinter在ArcGIS/arcpy中不起作用。。。所以我希望你能建议一条替代路线,使用以下代码:
def assign(value):
global x
x = value
mGui.destroy()
def gui3(CONVWGID, a, b, c):
global mGui
mGui = Tk()
mGui.geometry("600x50+500+300")
mGui.title("Attribute Selection Window")
labeltext = "Please select one of the following attributes to assign to the selected Convwks feature, CONVWGID: " + str(CONVWGID)
frame1 = Frame(mGui)
frame1.pack()
mLabel = Label(frame1, text = labeltext).grid(row=0, column=0)
frame2 = Frame(mGui)
frame2.pack()
mButton = Button(frame2, text = a, command = lambda: assign(a)).grid(row=0, column=0, padx=10)
mButton = Button(frame2, text = b, command = lambda: assign(b)).grid(row=0, column=1, padx=10)
mButton = Button(frame2, text = c, command = lambda: assign(c)).grid(row=0, column=2, padx=10)
mGui.Mainloop() #FOR WINDOWS ONLY
我想用raw_input((命令代替GUI,但我真的很喜欢GUI的外观和操作方式。。。你有什么建议吗?
我认为正在发生的事情是,它只是跳过了对我的Tkinter gui3((函数的调用,它跳过了assign((函数。然后,在调用完这些之后,我将全局变量"x"分配给属性,但由于x还没有定义,它就停止了。屏幕截图:imgur.com/psLlnUD
我最终得到一个"NameError:全局名称'x'没有定义。"错误
这是实际决策矩阵的第一步:
for row in ucursor:
while row[0] != "X" or row[0] != "Y" or row[0] != "Z":
gui3(row[8], "X", "Y", "Z")
row[0] = x
if row[0] == "X":
...
我一尝试运行您的代码,就在回溯中弹出了答案:AttributeError: '_tkinter.tkapp' object has no attribute 'Mainloop'
gui3中未捕获的异常会杀死调用它的代码,并且row[0] = x
永远不会执行,即使gui仍然显示,即使可能调用assign。降低'M',(索引8变为1(
for row in (('A', 1), ('X', 2), ('b', 3)):
if row[0] not in {"X", "Y", "Z"}:
gui3(row[1], "X", "Y", "Z")
print( x)
工作良好。
让窗口消失和重新出现在视觉上让我很烦恼。我个人会弹出一个窗口——"验证数据"(行号向上滚动(,并在需要操作时更改内容。
您可以在wxPython中创建GUI窗口,这些窗口在ArcMap中运行并与地图文档交互,但您需要将它们放入ArcMap扩展中,该扩展在ArcMap启动时加载。这需要创建一个wx。加载扩展时应用程序对象ONCE,然后您可以在扩展内的工具栏上制作一个或多个操作按钮、工具或其他组件。wxPython打开的任何GUI窗口都需要使用wx隐藏。使用wx显示(False(和不关闭。Close((或wx。摧毁我在这个论坛上有一篇关于StackOverflow的帖子:
一次成功调用后,使用wxPython重复调用ArcMap Python外接程序失败
https://stackoverflow.com/a/50377929/8766731
ESRI网站上有一个关于如何做到这一点的好视频:
https://www.esri.com/videos/watch?videoid=1229&isLegacy=真正的
这显示了如何构建ArcMap扩展插件、扩展插件中的工具栏和工具栏上的工具。在我的例子中,我在工具栏上放了一个动作按钮,而不是工具,但同样的方法也有效。