[ツール] PythonのGUI~リストボックス~

ListBox

GUIは、リサイズできることが最低条件だと思っているため、リストボックスとスクロールバーとを組み合わせた画面の配置ができるサンプルコードはないものかといろいろ探してみました。できれば、ツールバーとかステータスバーが付いたものが良いと思い、探しました。

しかし、意外とそんな単純なサンプルは、見つけることができず、いろいろ試しながら自作することにしました。備忘録のため残しておきます。

欲しいもの

私が欲しかったものは、こんな感じのものです。

ListBox Before
リサイズ前
ListBox After
リサイズ後

コード

以下にソースコードを付けます。単なるレイアウトだけのコードで、特に大した内容はありません。当初、Gridによるレイアウトを試してみたのですが、等間隔で、サイズが大きくなるため断念しました。pack()でFILL=BOTHなのかFILL=Xなのかが鍵となりました。

"""
 リサイズできるコマンドと、リストボックスと、ステータスバーとの単純な組み合わせ画面
 """
 import tkinter as tk
 import tkinter.ttk as ttk
 import tkinter.filedialog as filedialog
 import os
 import subprocess

""" メイン画面 """
 class App:
     def init(self,master):
         main_frame = ttk.Frame(master)
         top_frame = ttk.Frame(main_frame)
         center_frame = ttk.Frame(main_frame)

         # コマンド(ツールバー)
         btn_add = ttk.Button(top_frame, text="追加...",     command=self.open_file_dialog)
         btn_conv = ttk.Button(top_frame, text="変換",     command=self.convert_files)
         btn_clr = ttk.Button(top_frame, text="クリア", command=self.lb_contents_clear)
         btn_hlp = ttk.Button(top_frame, text="ヘルプ", command=self.convert_files)
         btn_exit = ttk.Button(top_frame, text="終了", command=quit)
         btn_add.pack(side=tk.LEFT, anchor=tk.W)
         btn_conv.pack(side=tk.LEFT, anchor=tk.W)
         btn_clr.pack(side=tk.LEFT, anchor=tk.W)
         btn_exit.pack(side=tk.RIGHT, anchor=tk.E)
         btn_hlp.pack(side=tk.RIGHT, anchor=tk.E)

         # Listbox
         self.listb = tk.Listbox(center_frame, height=5)
         self.listb.pack(side=tk.LEFT, anchor=tk.N, fill=tk.BOTH, expand=True)


         # Scrollbar
         scrollbar = ttk.Scrollbar(center_frame, 
             orient=tk.VERTICAL, 
             command=self.listb.yview)
         self.listb['yscrollcommand'] = scrollbar.set
         scrollbar.pack(side=tk.RIGHT, anchor=tk.E, fill=tk.Y, expand=False)

         # ツールバー・リストボックス
         top_frame.pack(side=tk.TOP, fill=tk.X)
         center_frame.pack(side=tk.TOP, fill=tk.BOTH, expand=True)
         main_frame.pack(side=tk.TOP, expand=True, fill=tk.BOTH)


     # ファイルダイアログを開いてfilenameEntryに反映させる
     def open_file_dialog(self):
         file_  = filedialog.askopenfilename()
         if os.path.isfile(file_):
             self.listb.insert(tk.END, file_)

     # リストボックスの中身をクリアする
     def lb_contents_clear(self):
         self.listb.delete(0, tk.END)

     # リストボックスの中身をクリアする
     def convert_files(self):
         print("Convert Files")

if name == "main": 
     root = tk.Tk() 
     app = App(root) 
     icon_file = 'coco.ico'
     root.iconbitmap(default=icon_file)
     root.mainloop()

まとめ

これをdocx2html.pyとを組み合わせて、Word文書をHTML文書に変換できるGUI付のツールを作れればと思っております。

Translate »