概要
前回の続きです
前回とりあえずアプリが起動するところまでは確認できましたが、二重起動の防止などいろいろ足りていない部分を追加してみました
必要なもの
- python 3.7.2
- pandas
- numpy
公開場所
githubで公開しています。
https://github.com/snowpff14/etcresource/tree/master/pythonGui
処理内容
大まかな部分は前回を参照。
- 処理を動かすところをthreadで呼び出していましたが、ロックがなかったので何度でも呼び出せてしまう状態でした。そこで今回はロックを取得して取れなければメッセージを出す形にしています。
def doExecute(self):
if self.lock.acquire(blocking=FALSE):
if messagebox.askokcancel('実行前確認','処理を実行しますか?'):
self.progressValue=0
self.progressStatusBar.configure(value=self.progressValue)
self.progressBar.configure(maximum=10,value=0)
self.progressBar.start(100)
th = threading.Thread(target=self._executer)
th.start()
else:
self.lock.release()
else:
messagebox.showwarning('エラー','処理実行中です')
- 処理の状況をラベル表示する際目立つように太字かつ白背景に赤字に設定しています。
PL.TLabel
というところは任意に設定できる項目です。こちらを後段のラベルを定義するときに指定しています。
labelStyle=ttk.Style()
labelStyle.configure('PL.TLabel',font=('Helvetica',10,'bold'),background='white',foreground='red')
self.progressMsgBox=ttk.Label(content,textvariable=self.progressMsg,width=70,style='PL.TLabel')
self.progressMsg.set('処理待機中')
- 処理の進捗状況を示すように途中でメッセージを変更してプログレスバーを進めるようにしています。今回は画面の操作起動前と後なのであまり変化はありませんが、複数ステップある場合は都度都度更新を行うことで画面の様子を見ることができます。
以下は呼び出し元から表示するメッセージと進捗状況を受け取っています。
def progressSequence(self,msg,sequenceValue=0):
self.progressMsg.set(msg)
self.progressValue=self.progressValue+sequenceValue
self.progressStatusBar.configure(value=self.progressValue)
- 以下のように画面の要素の
after
メソッドを呼ぶことで処理を呼び出すことができます。処理実行後画面に変化を与えるために表示領域の更新をroot.update_idletasks()
で行っています。
self.progressMsgBox.after(10,self.progressSequence('処理実行中',sequenceValue=50))
root.update_idletasks()
- プログレスバーは画面の要素を作成するところで指定を行います
-
indeterminate
は処理が動いていることを示すため常に動いているバー -
determinate
は全体の進捗のうちどこまで進んだかを示すのに使用します。
-
self.progressBar=ttk.Progressbar(content,orient=HORIZONTAL,length=140,mode='indeterminate')
self.progressBar.configure(maximum=10,value=0)
self.progressStatusBar=ttk.Progressbar(content,orient=HORIZONTAL,length=140,mode='determinate')
-
determinate
のプログレスバーの場合はvalue
に値を設定すればその分進みます(最大値100として状況に合わせて設定します) -
indeterminate
のプログレスバーはstart
で起動、stop
で停止します
self.progressValue=0
self.progressStatusBar.configure(value=self.progressValue)
self.progressBar.configure(maximum=10,value=0)
self.progressBar.start(100)
- ボタンに設定する関数は引数を渡したいときはlambdaで渡すか、partialを使用します。
以下は起動前に引数を渡せるようにpartialを使っています。
def preparation(self,logfilename):
self._executer=partial(self.execute,logfilename)
とりあえず今回はここまで。
もうちょっと何か出来たら続きを作成します。