Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
2
Help us understand the problem. What is going on with this article?
@snowp

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

More than 1 year has passed since last update.

概要

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

必要なもの

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

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

2
Help us understand the problem. What is going on with this article?
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
snowp
東京のとある会社勤め javaがメインでしたが最近はいろいろとやっています。 FWはSpring,SAStruts,Strutsなどいろいろと経験済み 現在はpythonをメインに実施中 DBはMySQLが一番長いですがOracle、SLQServerなども使っていました。 現場で使ったニッチな知識をまとめていこうかとのんびりやっていきます 本業 ヒカセンかも・・・

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
2
Help us understand the problem. What is going on with this article?