PythonnでGUI作成

久々の投稿です。
久々過ぎますね・・・

しばらくVBAを使いエクセル操作を自動化してました。
複雑なものは組めませんが、基礎的なことはネット情報や書籍を見ながらできるようになってきました。

Pythonでエクセルを操作できるライブラリ「openpyxl」がある事を知り簡単なPGを作ってみたところ
動くではありませんか!

openpyxl.xlskというエクセルファイルのセルに入力後保存するという簡単なもの
//////////////////////////////////////////////////////////////////////////////////
import openpyxl as px
wb = px.load_workbook("openpyxltest.xlsx")
ws = wb["Sheet"]
ws.cell(1,1).value ="int"
ws.cell(1,2).value =1234
ws.cell(1,3).value ="str"
ws.cell(1,4).value ="1234"
ws.cell(2,2).value = 4567
ws.cell(2,4).value ="4567"
for i in range(1,11):
    ws.cell(3,i).value = i
    ws.cell(i+3,1).value = "TEST" + str(i)
wb.save("openpyxltest.xlsx")
//////////////////////////////////////////////////////////////////////////////////
しかし、作ったPGは他の人も使うので、GUIにできないかと調べておりました。
標準ライブラリの「tkinter」を使えばできるのですが、素人にはとっつきにくく
理解し難いものでした。(いずれ勉強して覚えたいと思いますが。。。)
他に何かライブラリはないかとインターネットで検索していると「PySimplGUI」という
ライブラリを見つけ、簡単なサンプルコード見てどいう動きするのか何となく理解できました。
PythonのGUIでエクセルVBAやアクセスのようなメニュー画面からボタンを押すことで機能を選択するような画面の作成が目的です。

機能を関数化し、押されたボタンに応じて指定の関数を呼び出す事で、VBAのボタンにマクロを登録して実行するような画面ができるのではと思い、サンプルコードを修正して簡単なサンプル画面を作ってみます。

メインメニューで押されたボタンの名前をポップアップウィンドウに表示および、メニュー画面のテキストを更新するというような簡単なサンプルです。

/////////////////////////////////////////////////////////////////////////////////
# coding: utf -8
import PySimpleGUI as sg # ライブラリの読み込み
#ウィンドウテーマ
sg.theme('Default1')
#機能を関数化
def function1():
    sg.popup(event,"機能1")
    window["funcname"].update("機能1です")

def function2():
    sg.popup(event,"機能2")
    window["funcname"].update("機能2です")

def function3():
     sg.popup(event,"機能3")
     window["funcname"].update("機能3です")
# レイアウト
layout = [
[sg.Text("Main Menu",font=('Meiryo UI',30))],
[sg.Text("eventは",size=(6,2),justification='right'),
sg.Text("",size=(7,2),font=('Meiryo UI',10), justification='center',key='keys'),
sg.Text("が選択されました",size=(14,2),justification='left')],
[sg.Button('機能1' , size =(10,1) ,key='btn1'),
sg.Button('機能2' , size =(10,1) ,key='btn2'),
sg.Button('機能3' , size =(10,1) ,key='btn3')],
[sg.Text("",size=(12,2), key='funcname')],
[sg.Button('Close' , size =(10,2) ,key='btn4')]]
# ウィンドウ作成<
window = sg.Window('〇〇〇システム', layout, size=(600,400))
# イベントループ
while True:
    event , values = window.read () # イベントの読み取り( イベント待ち)
    #print('イベント:' , event ,'値:', values, ) # 確認表示(debugfix用)
    window["keys"].update(event) #TEXTで表示するkeyを更新
   if event=='btn1':
       function1()
       if event=="btn2":
           function2()
       if event=="btn3":
           function3()
   if event in (None,'btn4'): # 終了条件( None: クローズボタン)
       break
# 終了処理
window.close ()
///////////////////////////////////////////////////////////////////////////////////
実行するとこのようなメニュー画面できます。

「layout」でボタンやテキストボックス等を設定し「sg.window」で呼び出す。
非常にわかりやすいですね。

しかし、これだとボタン(機能)が増えるとifとそれに対応する関数が増えてしまう(汗)ので、考えます。。。

GUIのメインメニューとエクセル操作が可能だということでPythonの勉強を再開したいと思います。

pyinstallerを使うことでEXE化できることも分かったのでPythonがインストールされていない環境でも実行可能だということもわかりました。
EXE化は他にもpy2exeもありますが、公式にはPython3.4までしか対応していないので
Python3.8を使っているので諦めました。

editorは軽いのでVS CODEです。

さてさて、以前購入した書籍達の復活です。

コメント

このブログの人気の投稿

【備忘録】Microsoft SQL Sever Management Studio 2017 <設定>

【課題】C# 繰り返し処理(for文)

プログラミングにチャレンジ