Help us understand the problem. What is going on with this article?

pythonでのGUI作成 tkinter使用して 2

概要

前回の続きです
前回とりあえずアプリが起動するところまでは確認できましたが、二重起動の防止などいろいろ足りていない部分を追加してみました

必要なもの

  • 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で停止します python 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)

とりあえず今回はここまで。
もうちょっと何か出来たら続きを作成します。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした