I'm using tkinter in my scripts to get field names of the user in case the hard coded field names were not found in the target feature.
it runs from python IDE, but when run from arcmaps toolbox the interface keeps refreshing making it impossible to focus on the input message box generated from the script.
Is there a way to keep focus on the generated dialog so the user can type in the information? I can post my script if needed. or is there less messy way to get a string value from the user?
I'm using something similar to this :
from Tkinter import *
import sys
class popupWindow(object):
def __init__(self,master):
top=self.top=Toplevel(master)
self.l=Label(top,text="Hello World")
self.l.pack()
self.e=Entry(top)
self.e.pack()
self.b=Button(top,text='Ok',command=self.cleanup)
self.b.pack()
def cleanup(self):
self.value=self.e.get()
self.top.destroy()
class mainWindow(object):
def __init__(self,master):
self.master=master
self.b=Button(master,text="click me!",command=self.popup)
self.b.pack()
self.b2=Button(master,text="print value",command=lambda: sys.stdout.write(self.entryValue()+'\n'))
self.b2.pack()
def popup(self):
self.w=popupWindow(self.master)
self.master.wait_window(self.w.top)
def entryValue(self):
return self.w.value
if __name__ == "__main__":
root=Tk()
m=mainWindow(root)
root.mainloop()
-
2I have never tested, but for what it's worth I read that Tkinter based widgets do not play nicely in ArcMap.crmackey– crmackey2015年06月11日 18:59:14 +00:00Commented Jun 11, 2015 at 18:59
-
as found here what youre saying is completely true, geonet.esri.com/thread/51876, however I really would love to have user input somehow, it doesn't have to be tkinterSolaire– Solaire2015年06月11日 19:02:50 +00:00Commented Jun 11, 2015 at 19:02
-
1After reading your post again, you could try introducing a bit more logic into your script tool. For example, you could have an optional parameter that allows the user to enter any extra field names not found in the target feature using a String data type as a multiple input parameter.crmackey– crmackey2015年06月11日 19:12:02 +00:00Commented Jun 11, 2015 at 19:12
-
Im using a tkinter listbox of all fields, which the user can pick from .and its working since double clicking is possible even if focus is lost right after, I think it's more user friendly as well, since typos aren't possible.Solaire– Solaire2015年06月12日 14:32:08 +00:00Commented Jun 12, 2015 at 14:32
1 Answer 1
There is a base widget method called focus_force (see here) that will force focus to the specified application - this should capture user input. There is also a toplevel attribute called topmost which can be set (see here). After creating the window widget, you will need to call the method and set the attribute
i.e.:
window.focus_force()
window.wm_attributes("-topmost", 1)
-
I havn't tried that one yet, so just to make sure I'm applying it correctly, in the example I posted I need to add the following line:
self.top.focus.force()
in function__init__()
Solaire– Solaire2015年06月11日 18:08:09 +00:00Commented Jun 11, 2015 at 18:08 -
in that case it doesn't work, I also tried
grab_set()
, andgrab_set_global()
Solaire– Solaire2015年06月11日 18:22:14 +00:00Commented Jun 11, 2015 at 18:22 -
1@Solaire Try doing it just after the line of code self.w=popupWindow(self.master)papadoo– papadoo2015年06月11日 19:52:33 +00:00Commented Jun 11, 2015 at 19:52
-
I added the line self.w.force_focus() where you suggested and it doesn't work.Solaire– Solaire2015年06月12日 12:32:11 +00:00Commented Jun 12, 2015 at 12:32