2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

概要

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

必要なもの

  • 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)

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

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?