LoginSignup
2
3

More than 3 years have passed since last update.

pythonでのGUI作成 tkinter使用して その1

Last updated at Posted at 2020-02-02

概要

pythonで作ったツールを実行する際、自分で作ったものであればコマンドラインから呼び出すことでも問題はないのですが、開発に関係していない方が使うツールの場合画面から操作できた方が都合がよかったりします。pythonでアプリが作れないかいろいろ調べて作った内容をまとめてみました。まだ作りこみが甘いので徐々に調整していく予定です。

必要なもの

  • python 3.7.2
  • pandas
  • numpy

公開場所

githubで公開しています。
https://github.com/snowpff14/etcresource/tree/master/pythonGui

処理内容

以前作ったseleniumの練習サイト操作用のスクリプトこちら参照、エクセルファイルの列追加、行削除のスクリプトこちら参照を起動できるようにしました。

  • 画面上で可変のテキスト領域(ボタンの表示名やラベルなども含む)を使うときは以下のようにStringVar()を使います。

    inputFolder=StringVar()
    outputFolder=StringVar()

  • 以下はファイルダイアログを開いて選択したファイルパスをテキストボックスに格納します。
    def openFile(self):
        fTyp = [('','*.xlsx')]
        iDir = os.path.abspath(os.path.dirname(__file__))
        filename = filedialog.askopenfilename(filetypes = fTyp,initialdir = iDir)
        return filename

    def fileButton(self):
       filename= self.openFile()
       self.inputFileName.set(filename)
  • 以下は実際の処理を動かすところです。処理が終わるまで画面の方が固まってしまうので、threadを使ってます。ボタンに定義するのはdoExecuteとなります。

    def doExecute(self):
        # threading.Lock
        thread=threading.Thread(target=self.execute)
        thread.start()

    def execute(self):

        excelFile=pd.ExcelFile(self.inputFileName.get())
        reserveSheetTemp=excelFile.parse(sheet_name='予約シート',dtype='str',header=1)
        print(reserveSheetTemp.head())
        log=LoggerObj()
        driver=webdriver.Chrome('C:/webdrivers/chromedriver.exe')
        driver.get('http://example.selenium.jp/reserveApp/')

        reserveSheet=reserveSheetTemp.query('無効フラグ != "1"')
        testSideOrder=TestSiteOrder(driver,log,'test')
        # 勤務時間入力
        testSideOrder.inputOrder(reserveSheet)

        testSideOrder.createOkDialog('処理完了','登録処理完了')

  • 以下のようにtkinter.TK()を使って画面の定義を作っていきます。
    • titleでウィンドウのタイトルを設定
    • Frameで画面のサイズなどを定義します。
root= tkinter.Tk()

    def main(self):
        root.title("Python GUI")
        content = ttk.Frame(root)
        frame = ttk.Frame(content,  relief="sunken", width=400, height=500)
  • 以下のようにgridを使って画面にラベル、ボタンなどの部品を配置します。(一部抜粋しています)
    • gridを使うことで縦、横どこの位置に配置するかを調整することが可能です。
    • 可変する項目はtextvariableを使ってStringVarで宣言したものを指定すると項目の変更を反映させることができます。
    • commandで起動する関数を設定します。
    • 最後にmainloop()を呼び出すことで画面を表示させ続けることができます。
        content.grid(column=0, row=0)

        title.grid(column=0, row=0, columnspan=4)

        fileLabel=ttk.Label(content,text="予約情報")
        resultFolderLabel=ttk.Label(content,text="フォルダ指定")

        fileInput=ttk.Entry(content,textvariable=self.inputFileName,width=70)
        resultFolderInput=ttk.Entry(content,textvariable=self.outputFolder,width=70)

        self.progressMsgBox=ttk.Label(content,textvariable=self.progressMsg,width=70)

        self.progressBar=ttk.Progressbar(content,orient=HORIZONTAL,length=140,mode='indeterminate')
        self.progressBar.configure(maximum=10,value=0)

        fileInputButton=ttk.Button(content, text=BUTTON_LABEL_REFERENCE,command=self.fileButton)
        resultDirectoryInputButton=ttk.Button(content, text=BUTTON_LABEL_REFERENCE,command=self.inputResultFolderButton)

        executeButton=ttk.Button(content,text='実行',command=self.doExecute)
        fileExecuteButton1=ttk.Button(content,text='ファイル操作 挿入実行',command=self.fileInsert)
        fileExecuteButton2=ttk.Button(content,text='ファイル操作 デリート実行',command=self.fileDelete)
        root.mainloop()

起動すると以下のような画面が表示されます。

image.png

とりあえず今回はこのくらいで
続き作成しました

2
3
7

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
3