Tkinter GUI 显然不适用于 Arc……ArcGIS 内的 GUI 是否还有其他选项?
Tkinter GUI apparently does not work with Arc… Any other options for GUIs inside of ArcGIS?
我创建了一个 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() function.Then 在这些函数被调用之后,我分配了全局变量 'x' 到属性,但由于 x 尚未定义,它就停止了。截图:imgur.com/psLlnUD
我最终遇到 "NameError: global name 'x' is not defined." 错误
这是实际决策矩阵中的第一步:
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)
工作正常。
让 window 消失又重新出现在视觉上让我很烦。我个人会提出一个 window -- 'Verifying data'(行号滚动 -- 并在需要操作时更改内容。
您可以在 ArcMap 中 运行 在 wxPython 中创建 GUI windows 并与地图文档交互,但您需要将它们放入 ArcMap 扩展中,该扩展在 ArcMap 启动时加载。这需要在扩展加载时创建一次 wx.App 对象,然后您可以在扩展内的工具栏上制作一个或多个操作按钮、工具或其他组件。任何由 wxPython 打开的 GUI windows 需要使用 wx.Show(False) 隐藏,而不是使用 wx.Close() 或 wx.Destroy 关闭。我在 Whosebug 上的这个论坛上有一个关于它的 post:
Repeated calls to ArcMap Python Add-In with wxPython fail after one successful call
在 ESRI 网站上有一个关于如何执行此操作的好视频:
https://www.esri.com/videos/watch?videoid=1229&isLegacy=true
这显示了如何构建 ArcMap 扩展、扩展中的工具栏和工具栏上的工具。在我的例子中,我在工具栏上放置了一个操作按钮而不是工具,但同样的方法有效。
我创建了一个 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() function.Then 在这些函数被调用之后,我分配了全局变量 'x' 到属性,但由于 x 尚未定义,它就停止了。截图:imgur.com/psLlnUD
我最终遇到 "NameError: global name 'x' is not defined." 错误
这是实际决策矩阵中的第一步:
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)
工作正常。
让 window 消失又重新出现在视觉上让我很烦。我个人会提出一个 window -- 'Verifying data'(行号滚动 -- 并在需要操作时更改内容。
您可以在 ArcMap 中 运行 在 wxPython 中创建 GUI windows 并与地图文档交互,但您需要将它们放入 ArcMap 扩展中,该扩展在 ArcMap 启动时加载。这需要在扩展加载时创建一次 wx.App 对象,然后您可以在扩展内的工具栏上制作一个或多个操作按钮、工具或其他组件。任何由 wxPython 打开的 GUI windows 需要使用 wx.Show(False) 隐藏,而不是使用 wx.Close() 或 wx.Destroy 关闭。我在 Whosebug 上的这个论坛上有一个关于它的 post:
Repeated calls to ArcMap Python Add-In with wxPython fail after one successful call
在 ESRI 网站上有一个关于如何执行此操作的好视频:
https://www.esri.com/videos/watch?videoid=1229&isLegacy=true
这显示了如何构建 ArcMap 扩展、扩展中的工具栏和工具栏上的工具。在我的例子中,我在工具栏上放置了一个操作按钮而不是工具,但同样的方法有效。