У меня есть класс в отдельном скрипте python, который я хочу связать с внешней кнопкой на холсте с помощью Tkinter. В текущем классе теперь есть фреймы, метки и кнопки, и я могу заставить его всплывать при нажатии моей внешней кнопки, но ни одна из функций не работает, когда я помещал root = Tk()
до frame
в сценарий data.py.Вызов функций из другого класса в Tkinter
import Tkinter as ttk
from Tkinter import *
import tkMessageBox
import data
def XYevent():
data.makeXY()
top = ttk.Tk()
C = ttk.Canvas(top, bg="white", height=250, width=300)
C.pack()
B=ttk.Button(C, text="Create XY Feature", command=XYevent)
B.pack()
top.mainloop()
Это мой сценарий до сих пор, но ни одна из функций не работает во всплывающем окне после нажатия кнопки. Мне не хватает команды в скрипте canvas? данные при запуске сами по себе работают.
Вот сценарий data.py с командами, которые я хочу связать с окном холста, в конце концов я хочу, чтобы две кнопки открывали другое окно, относящееся к первой, но другой пользовательской опции.
import arcpy
import Tkinter as ttk
import tkFileDialog
from arcpy import env
from Tkinter import *
import tkMessageBox
class makeXY():
def __init__(self):
self.main()
def XY(self,*args):
arcpy.MakeXYEventLayer_management(self.dbtable.get(), self.easting.get(), self.northing.get(),
"Layers", self.prj.get())
arcpy.CopyFeatures_management("Layers", self.New_Shapefile.get())
tkMessageBox.showinfo("Create ArcGIS feature", arcpy.GetMessages())
def main(self):
frame = ttk.Frame(root, padx=3, relief=SUNKEN, borderwidth=3)
frame.grid(column=0, row=0, sticky=(N, W, E, S))
frame.columnconfigure(0, weight=1)
frame.rowconfigure(0, weight=1)
self.labelVariable = IntVar()
XYtitle = ttk.Label(frame, textvariable=self.labelVariable,
relief=GROOVE, fg="white", bg="#2C5E17", font=("Georgia", 12))
XYtitle.grid(column=0, row=0, columnspan=5, sticky='EW', pady=5)
self.labelVariable.set("Create A Feature For ArcGIS Using XY Data")
# Creates an XY event
self.dbtable = StringVar()
self.dbtable_entry = ttk.Entry(frame, width=50, textvariable=self.dbtable).grid(column=1, row=2, sticky='WE')
ttk.Button(frame, text="Input Table",command=lambda:self.dbtable.set
(tkFileDialog.askopenfilename(filetypes=[("All files",'*.*')]))).grid(row=2, column=2, sticky='WE')
self.easting = StringVar()
self.easting_entry = ttk.Entry(frame, width=20, textvariable=self.easting).grid(column=1, row=3, sticky=W)
self.northing = StringVar()
self.northing_entry = ttk.Entry(frame, width=20, textvariable=self.northing).grid(column=1, row=4, sticky=W)
self.prj = StringVar()
ttk.Button(frame, text="Projection File",command=lambda:self.prj.set
(tkFileDialog.askopenfilename(filetypes=[("Project File",'.prj')]))).grid(row=5, column=2, sticky='WE')
ttk.Entry(frame, width=50, textvariable=self.prj).grid(column=1, row=5, sticky='WE')
self.New_Shapefile = StringVar()
ttk.Entry(frame, width=50, textvariable=self.New_Shapefile).grid(column=1, row=6, sticky='WE')
ttk.Button(frame, text="Output Feature",
command=lambda:self.New_Shapefile.set
(tkFileDialog.asksaveasfilename(filetypes=[("Feature Datasets", {'.shp','.gdb','.mdb'})]))).grid(row=6, column=2, sticky='WE')
ttk.Button(frame, text="Create Feature", command=self.XY).grid(column=1, row=7, sticky=W)
ttk.Label(frame, text="Input table with XY data: ").grid(column=0,row=2, sticky=W)
ttk.Label(frame, text="Enter X (easting) field name: ").grid(column=0, row=3, sticky=W)
ttk.Label(frame, text="Enter Y (northing) field name: ").grid(column=0, row=4, sticky=W)
ttk.Label(frame, text="Enter projection file: ").grid(column=0, row=5, sticky=W)
ttk.Label(frame, text="Feature output (shapefile, geodatabase):").grid(column=0, row=6, sticky=W)
root.bind('<Return>', self.XY)
if __name__== "__main__":
root = Tk()
root.option_add("*Background", "#EBF1E8")
root.option_add("*Entry.Background", "white")
root.option_add("*Button.Background", "#afc8a4")
root.option_add("*Label.Font", "helvetica 10")
root.option_add("*Button.Font", "helvetica 9")
root.title("XY Data to ArcGIS")
client = makeXY()
root.mainloop()
я добавил оригинальный сценарий на мой вопрос о разъяснении и изменил XY_Tk.py на data.py , Я также пробовал совет в вашем сообщении, но все же не мог заставить кнопку вызывать класс 'makeXY()'. – marion
Я получил его для работы. – marion