2014-11-19 4 views
0

У меня есть класс в отдельном скрипте 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() 

ответ

1

Мы понятия не имеем, что XY_Tk содержит, так что не знаю, что он должен делать, я просто отвечал на подобный вопрос на Adding or deleting tkinter widgets from within other modules, которые могли бы помочь.

+0

я добавил оригинальный сценарий на мой вопрос о разъяснении и изменил XY_Tk.py на data.py , Я также пробовал совет в вашем сообщении, но все же не мог заставить кнопку вызывать класс 'makeXY()'. – marion

+0

Я получил его для работы. – marion

0

я получил эту работу, вынимая

root.bind() 

и

if __name__ == "__main__" 

из класса и используется

ttk.mainloop() 

в сценарии, который вызывает класс.

Вот мой работает основной сценарий с помощью кнопок, которые требуют два класса XYdata.py и selectfeature.py:

import Tkinter as ttk 
import tkFileDialog 
from Tkinter import * 
import tkMessageBox 
import XYdata 
from XYdata import * 
import selectfeature 
from selectfeature import * 


def XYevent(): 
    XY.main() 

def select(): 
    s.main() 

root = ttk.Tk() 
root.geometry("650x275+500+100") 
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("Create Point Features for ArcGIS") 

myframe = ttk.Frame(root,relief="groove",bd=1) 
myframe.place(x=7, y=5, width=635, height=175) 

canvas = ttk.Canvas(myframe) 
frame = ttk.Frame(canvas) 
canvas.pack(side="left", fill=BOTH) 


canvaslbl= Label(canvas,text=' Create features for ArcGIS using two button options'), 
      font=("Georgia", 12), justify=LEFT) 
canvaslbl.pack() 
canvas.create_window((0,0), window=frame, anchor='nw') 
frame.bind("<Return>", XYevent) 

b1 = ttk.Button(root, command=XYevent, text="XY Feature Class",fg="white",bg="#39442C", font=("helvetica", 10)) 
b1.place(x = 125, y = 210, width=180, height=40) 
b2 = ttk.Button(root, command=select, text="Selection Feature Class",fg="white", bg="#39442C", font=("helvetica", 10)) 
b2.place(x = 350, y = 210, width=180, height=40) 

XY = XYdata.makeXY(ttk, root) 
s = selectfeature.selection(ttk, root) 
ttk.mainloop() 
Смежные вопросы