2012-05-03 98 views
0

我正在嘗試創建一個python腳本來計算圍繞一組學院的最短行程。我需要增加一個出發點,但是我卻將自己超越了信念,直到不歸路。誰能幫我找出從這裏到旅行銷售人員python

from Tkinter import * 
import tkMessageBox, tkFileDialog 
import json 
import re 
from urllib import urlopen 
import math 
class Application(Frame): 
    collegelist = [] 
    collegelist1 = [] 
    def __init__(self,master=None): 
     Frame.__init__(self,master) 
     self.pack() 
     self.createWidgets() 
    def createWidgets(self): 
     self.top_frame = Frame(self) 
     self.mid_frame = Frame(self) 
     self.bot_frame = Frame(self, bg = 'red') 
     self.top_frame.pack(side = 'top') 
     self.mid_frame.pack(side = 'top') 
     self.bot_frame.pack(side = 'top') 
     #top frame 

     self.label1 = Label(self.top_frame, text = "Your College Choices", bg ='red') 
     self.label1.pack(side = 'left', padx='40', pady='0') 
     self.label2 = Label(self.top_frame, text = "Your Tour Selections", bg ='green') 
     self.label2.pack(side = 'right', padx='40') 

     #mid frame 
     self.mylist = Listbox(self.mid_frame, 
           bg = 'black', 
           fg = 'gold') 
     self.mylist.pack(side='left') 
     self.my_button1 = Button(self.mid_frame, text = '>>>', command=self.getlist) 
     self.my_button2 = Button(self.mid_frame, text = '<<<', command=self.returnlist) 
     self.my_button1.pack(side="left") 
     self.my_button2.pack(side="left") 
     self.mylist1 = Listbox(self.mid_frame, 
           selectmode=DISABLED, 
           bg = 'black', 
           fg = 'gold') 
     self.mylist1.pack(side='right') 
     #bottom frame 
     self.openbutton = Button(self.bot_frame, text='Open File', command=self.openfile, fg ='green') 
     self.openbutton.pack(side='left') 
     self.my_button = Button(self.bot_frame, text = 'Route', fg ='green', command=self.collegeroute) 
     self.my_button.pack(side='left') 
     self.quit_button = Button(self.bot_frame, text = 'Quit', 
            command = self.quit, fg = 'green') 
     self.quit_button.pack(side='left') 

    def openfile(self): 
     filename = tkFileDialog.askopenfilename(title='Choose a file') 
     if filename: 
      clist = open(filename, "r") 
     for line in clist.readlines(): 
      for i in line.split(): 
       self.collegelist.append(i) 
     for college in self.collegelist: 
      self.mylist.insert(1,college) 
    def getlist(self): 
    # get selected line index 
     index = [int(x) for x in self.mylist.curselection()] 
     print index 
     for i in index: 
      seltext = self.mylist.get(i) 
      self.mylist.delete(i) 
      self.mylist1.insert(1,seltext) 
      self.collegelist1.append(seltext) 
      print seltext 
    def returnlist(self): 
    # get selected line index 
     index = [int(x) for x in self.mylist1.curselection()] 
     for i in index: 
      seltext = self.mylist1.get(i) 
      self.mylist1.delete(i) 
      seltext = seltext.strip() 
      seltext = seltext.replace(' ', '') 
      self.mylist.insert(0,seltext) 
      self.collegelist1.remove(seltext) 
    def collegeroute(self): 
    # get selected line index 
     global tuplist 
     self.tuplist =[] 
     for college in self.collegelist1: 
      f = urlopen('http://graph.facebook.com/%s' % college) #load in the events 
      d = json.load(f) 
      longitude = d["location"]["longitude"] 
      latitude = d["location"]["latitude"] 
      name = d['name'] 
      self.tuplist.append((latitude, longitude)) 
     cartesian_matrix(self.tuplist) 


def cartesian_matrix(coords): 
    '''create a distance matrix for the city coords 
     that uses straight line distance''' 
    matrix={} 
    for i,(x1,y1) in enumerate(coords): 
     for j,(x2,y2) in enumerate(coords): 
      dx,dy=x1-x2,y1-y2 
      dist=math.sqrt(dx*dx + dy*dy) 
      matrix[i,j]=dist 
     tour_length(matrix,collegelist1) 
     return matrix 
def tour_length(matrix,tour): 
    total=0 
    num_cities=len(tour) 
    print tour 
    print num_cities 
    for i in range(num_cities): 
     j=(i+1)%num_cities 
     city_i=tour[i] 
     city_j=tour[j] 
     total+=matrix[city_i,city_j] 
    print total 
def getRad(x): 
    return float(x) * (math.pi/180.0) 
def main(): 
    app = Application() 
    app.master.title("My Application") 
    app.mainloop() 

if __name__ == "__main__": 
    main() 

遇到麻煩tour_length上班

+1

那麼究竟是什麼,不工作?你會得到什麼錯誤或意想不到的輸出? –

+1

追蹤是在+ =矩陣總計keyerror – matture

+1

我經常發現它更容易編寫我的命令行的應用程序,然後*然後*添加一個GUI ... –

回答

0

遇到麻煩tour_length工作

唯一明顯的問題tour_length我看到的是你沒有返回結果。添加下面的結尾:

return total 

經仔細檢查,下面也看犯罪嫌疑人:

tour_length(matrix,collegelist1) 
    return matrix 

首先,它是誤縮進。其次,你忽略了tour_length的返回值。

錯誤縮進可能是導致異常的原因(您在完全初始化matrix之前調用了tour_length)。

+0

即時打印它只是爲了看到測試結果 即時得到一個keyerror當運行它 – matture

+0

@MatthewVitebsky:那麼到底什麼是困難? – NPE

0

您正在調用tour_length並從錯誤位置返回cartesian_matrix。你只做矩陣的一行,然後調用tour_length並返回。