2016-09-27 8 views
0

ここに質問をする前に、私はどこにでも見て、解決策を見つけるためにすべてを試しましたが、見つけられませんでした。選択に基づいてCSVファイルをロード

私はTkinterで簡単なGUIを構築しました。目標は、まずドロップダウンボックスでchoiseに基づいて選択を行うことです。 私の例では、主題は「テニス」です。

私の目標は、ユーザーが最初にテニス試合が行われる「表面」を選択できることです。 3つのチョイスがあります。ハードコート、クレイコートまたはグラスコート。

作成した選択に基づいて、別のCSVファイルをロードします。

  • ザ・ハードコートファイルは "match_stats_atp_.csv"
  • クレイコートファイルは "match_stats_atp_1.csv"
  • 草裁判所のファイルは、 "match_stats_atp_10.csv"
と呼ばれると呼ばれると呼ばれています

各CSVファイルは特定のテニスサーフェスに基づいてデータを保持します。

私の質問は今、どのようにして、CSVファイルを最初のドロップダウンボックスで選択した内容に基づいてロードするのですか? csvファイルはスクリプトと同じディレクトリにあります。

from Tkinter import * 
import ttk 
import csv 

master = Tk() 
master.option_add("*Font", "{Bodoni MT} 8") 

content = ttk.Frame(master, padding=(12, 12, 12, 12)) 
frame = ttk.Frame(content, borderwidth=5, relief="groove", width=300, height=100) 
content.grid(column=0, row=0, sticky=(N, S, E, W)) 
frame.grid(column=0, row=0, columnspan=4, rowspan=2, sticky=(N, S, E, W)) 
text = Text(content, height=8, width=13) 
text.grid(row=0, column=4, columnspan=2, rowspan=2, sticky=(N, S, E, W)) 

v1player1 = StringVar() 
v2player1 = StringVar() 

c_player1 = Label(frame, text="Service Points Win %:").grid(row=6, column=1, sticky='w') 
cc_player1 = Entry(frame, text="value", textvariable=v1player1, justify='center', width=10).grid(row=6, column=2) 
d_player1 = Label(frame, text="Return Points Win %: ").grid(row=7, column=1, sticky='w') 
dd_player1 = Entry(frame, text="value", textvariable=v2player1, justify='center', width=10).grid(row=7, column=2) 


def new_selection_surface(event): 
    return surface() 

surface_types = ['ATP Hard Court', 'ATP Clay Court', 'ATP Grass Court'] 

box_value_surface = StringVar() 
box = ttk.Combobox(frame, textvariable=box_value_surface, justify='center') 
box.bind("<<ComboboxSelected>>", new_selection_surface) 
box['values'] = surface_types 
box.current() 
box.grid(column=2, row=1, pady=10, padx=15) 


def surface(): 
    if 'ATP Hard Court' in box_value_surface.get(): 
     return 'match_stats_atp_.csv' 
    else: 
     if 'ATP Clay Court' in box_value_surface.get(): 
      return 'match_stats_atp_1.csv' 
     else: 
      if 'ATP Grass Court' in box_value_surface.get(): 
       return 'match_stats_atp_10.csv' 

f = open('CSV FILE BASED ON SELECTION 1st DROPDOWN BOX') 
csv_f = csv.reader(f) 
players_names = [] 
for row in csv_f: 
    players_names.append(row[2]) 

def new_selection_p1(event): 
    return player1() 

box_value_p1 = StringVar() 
box = ttk.Combobox(frame, textvariable=box_value_p1, justify='center') 
box.bind("<<ComboboxSelected>>", new_selection_p1) 
box['values'] = players_names 
box.current() 
box.grid(column=2, row=2, pady=10, padx=15) 


def player1(): 
    with open('CSV FILE BASED ON SELECTION 1st DROPDOWN BOX') as csvfile: 
     read_csv = csv.reader(csvfile, delimiter=',') 
     service_points_wins = [] 
     return_points_wins = [] 
     names = [] 
     for row in read_csv: 
      name = row[2] 
      services_point = row[10] 
      returns_point = row[4] 
      service_points_wins.append(services_point) 
      return_points_wins.append(returns_point) 
      names.append(name) 
     what_name = (box_value_p1.get()) 
     name_dex = names.index(what_name) 
     service_points_wins = service_points_wins[name_dex] 
     points_services_point = return_points_wins[name_dex] 
     v1player1.set(service_points_wins.replace("%", '')) 
     v2player1.set(points_services_point.replace("%", '')) 


run = ttk.Button(content, text='Run') 
run.grid(column=4, row=3) 
cancel = ttk.Button(content, text="Cancel", command=master.destroy) 
cancel.grid(column=5, row=3) 

master.columnconfigure(0, weight=1) 
master.rowconfigure(0, weight=1) 
content.columnconfigure(0, weight=3) 
content.columnconfigure(1, weight=3) 
content.columnconfigure(2, weight=3) 
content.columnconfigure(3, weight=1) 
content.columnconfigure(4, weight=1) 
content.rowconfigure(1, weight=1) 

master.geometry("1000x500+100+100") 
master.mainloop() 

答えて

0

コードの内容を理解することが重要です。あなたがしようとしていたのは、プログラムの開始時にファイルを開くことですが、ユーザがオプションを選択してからしばらくしてからしかファイル名を知ることができませんでした。 したがって、ファイル名がわかっているときにfile.open()が実行されるようにする必要があります。これは、コンボボックスにバインドする関数func内でのみ発生することを意味します。box1.bind("<<ComboboxSelected>>", func)

この機能では、現在のドロップダウンリストを取得してファイル名を決定することができます。これは辞書で効率的に行うことができます。

これはあなたのためにトリックを行う可能性のあるコードです:

from Tkinter import * 
import ttk 
import csv 



players_names = [] 
surface_types = ['ATP Hard Court', 'ATP Clay Court', 'ATP Grass Court'] 
choices = {'ATP Hard Court' : 'match_stats_atp_.csv' , 
      'ATP Clay Court' : 'match_stats_atp_1.csv' , 
      'ATP Grass Court' : 'match_stats_atp_10.csv'} 


master = Tk() 

content = ttk.Frame(master, padding=(12, 12, 12, 12)) 
frame = ttk.Frame(content, borderwidth=5, relief="groove", width=300, height=100) 
content.grid(column=0, row=0, sticky=(N, S, E, W)) 
frame.grid(column=0, row=0, columnspan=4, rowspan=2, sticky=(N, S, E, W)) 
text = Text(content, height=8, width=13) 
text.grid(row=0, column=4, columnspan=2, rowspan=2, sticky=(N, S, E, W)) 

v1player1 = StringVar() 
v2player1 = StringVar() 

c_player1 = Label(frame, text="Service Points Win %:").grid(row=6, column=1, sticky='w') 
cc_player1 = Entry(frame, text="value", textvariable=v1player1, justify='center', width=10).grid(row=6, column=2) 
d_player1 = Label(frame, text="Return Points Win %: ").grid(row=7, column=1, sticky='w') 
dd_player1 = Entry(frame, text="value", textvariable=v2player1, justify='center', width=10).grid(row=7, column=2) 


def surface(event): 
    players_names = [] 
    surface_selection = box_value_surface.get() 
    try: 
     f = open(choices[surface_selection]) 
     csv_f = csv.reader(f) 
     for row in csv_f: 
      players_names.append(row[2]) 
     f.close() 
    except: 
     #this except is only to make it work without having the csv files at hand 
     for name in ["Henry", "Donovan", "John"]: 
      players_names.append(name)   
    box2['values'] = players_names 

def player1(event): 
    surface_selection = box_value_surface.get() 
    with open(choices[surface_selection]) as csvfile: 
     read_csv = csv.reader(csvfile, delimiter=',') 
     service_points_wins = [] 
     return_points_wins = [] 
     names = [] 
     for row in read_csv: 
      name = row[2] 
      services_point = row[10] 
      returns_point = row[4] 
      service_points_wins.append(services_point) 
      return_points_wins.append(returns_point) 
      names.append(name) 
     what_name = (box_value_p1.get()) 
     name_dex = names.index(what_name) 
     service_points_wins = service_points_wins[name_dex] 
     points_services_point = return_points_wins[name_dex] 
     v1player1.set(service_points_wins.replace("%", '')) 
     v2player1.set(points_services_point.replace("%", '')) 


box_value_surface = StringVar() 
box1 = ttk.Combobox(frame, textvariable=box_value_surface, justify='center') 
box1['values'] = surface_types 
box1.bind("<<ComboboxSelected>>", surface) 
box1.grid(column=2, row=1, pady=10, padx=15) 

box_value_p1 = StringVar() 
box2 = ttk.Combobox(frame, textvariable=box_value_p1, justify='center') 
box2.bind("<<ComboboxSelected>>", player1) 
box2['values'] = players_names 
box2.grid(column=2, row=2, pady=10, padx=15) 


run = ttk.Button(content, text='Run') 
run.grid(column=4, row=3) 
cancel = ttk.Button(content, text="Cancel", command=master.destroy) 
cancel.grid(column=5, row=3) 

master.mainloop() 
関連する問題