前回作ったアプリを題材にエラーをユーザーに知らせる処理を紹介
■はじめに
前回、GUIからCSVを選択して、データを抽出してExcelにまとめるアプリを作りました。
stjun.hatenablog.com
stjun.hatenablog.com
stjun.hatenablog.com
ただし、ユーザーが設定を間違えても特に何も表示されないためこのままでは不便です。
そこでユーザーが間違えた時(=エラーが発生した時)にユーザーに知らせる機能を追加したいと思います。
■コード
import tkinter as tk
import tkinter.filedialog as fl
import tkinter.messagebox as mb
import numpy as np
import openpyxl as px
from openpyxl.chart import ScatterChart,Reference,Series
root=tk.Tk()
root.title("CSVからExcelファイルに変換+散布図を自動作成")
frame1=tk.LabelFrame(root,text="実行タブ",foreground="green")
frame1.grid(row=0,columnspan=2,sticky="we")
frame2=tk.LabelFrame(root,text="詳細タブ",foreground="green")
frame2.grid(row=1,sticky="we")
message=tk.Label(frame1,text="ファイルを選択してください",width=30)
message.grid(row=0,column=0)
blank=tk.Label(frame1,width=3)
blank.grid(row=0,column=1)
text_title=tk.Label(frame2,text="Excelのファイル名",width=20)
text_title.grid(row=0,column=0,padx=5)
text_row=tk.Label(frame2,text="データは何行目からか",width=20)
text_row.grid(row=0,column=1,padx=5)
text_column=tk.Label(frame2,text="何列あるか",width=20)
text_column.grid(row=0,column=2,padx=5)
entry_title=tk.Entry(frame2,width=20)
entry_title.insert(tk.END,"テスト")
entry_title.grid(row=1,column=0,padx=5)
entry_row=tk.Entry(frame2,width=20)
entry_row.insert(tk.END,"2")
entry_row.grid(row=1,column=1,padx=5,pady=5)
entry_column=tk.Entry(frame2,width=20)
entry_column.insert(tk.END,"3")
entry_column.grid(row=1,column=2,padx=5,pady=5)
def get(*args):
filetype=[("all file","*")]
path=fl.askopenfilename(initialdir="C:/Users/ユーザー名/Desktop",filetypes=filetype,title="ファイルを選んで下さい")
title_name_str=entry_title.get()
skiprow_str=entry_row.get()
skiprow_int=int(skiprow_str)
variable_number_str=entry_column.get()
variable_number_int=int(variable_number_str)
try:
data= np.loadtxt(fname=path, skiprows=skiprow_int-1)
except:
mb.showinfo("エラー","エラー。設定を確認してください")
wb=px.Workbook()
ws=wb.active
ws.title="計算結果"
list_target=["x軸","物理量A(単位)","物理量B(単位)"]
for i in range(len(list_target)):
ws.cell(row=1,column=i+1,value=list_target[i])
data_all=[0]*variable_number_int
for i in range(variable_number_int):
data_all[i]=data[:,i]
for j in range(variable_number_int):
for i in range(len(data_all[0])):
ws.cell(row=i+2,column=j+1,value=data_all[j][i])
chart =ScatterChart()
chart.title = "散布図のテスト"
chart.x_axis.title = 'x軸'
chart.y_axis.title = 'y軸'
x_values = Reference(ws, min_col=1, min_row=2, max_row=len(data_all[0])+1)
for i in range(2, len(data)):
y_values = Reference(ws, min_col=i, min_row=1, max_row=len(data_all[0])+1)
con = Series(y_values, x_values, title_from_data=True)
con.marker.symbol = 'circle'
con.marker.graphicalProperties.solidFill ="FFFFFF"
con.marker.graphicalProperties.line.solidFill = "000000"
chart.series.append(con)
ws.add_chart(chart, "A10")
wb.save(r"/Users/ユーザー/Desktop/"+title_name_str+".xlsx")
message["text"]="Excelファイルを作成しました"
button=tk.Button(frame1,text="選ぶ",width=10,command=get)
button.grid(row=0,column=2)
root.mainloop()
実行すると前回と同じように次の画面が現れます。

今回、次のCSVを開いてみます。

すると、詳細タブの真ん中「データは何行目からか」が間違っているため次のようにエラー画面が現れます。

■説明
今回追加したのは次の文です。
try:
data= np.loadtxt(fname=path, skiprows=skiprow_int-1)
except:
mb.showinfo("エラー","エラー。設定を確認してください")
try:には行いたい処理、except:には上記処理中にエラーが発生した時に行いたい処理を書きます。
今回、try:にはこれまで紹介したようにCSVのデータの読み出しを書いています、except:にはCSVを読みだそうとした時にエラーが発生したら(=設定が間違っていたら)ユーザーにエラーを知らせる処理を書いています。
■買って良かったもの紹介
今日紹介するのはマウスです。
このマウスは通常のマウスと違い横向きなので手首に負担が掛かりません。安いしおすすめです。
■最後に
次回は、より様々なCSVに対応できるように改良したいと思います。