今日も見に来てくださって、ありがとうございます。
Pythonを使ったGUIプログラミング、何を使ったらいいのでしょうね。ネットを調べてみると、いろいろとあって悩みます。標準搭載のGUIはTkinterなのですが、ビジネスでちょっと使ってみるGUIだと、これで充分ですね。ということで、helpに記載のあった以下の例題を実行してみます。
import tkinter from tkinter.constants import * tk = tkinter.Tk() frame = tkinter.Frame(tk, relief=RIDGE, borderwidth=2) frame.pack(fill=BOTH,expand=1) label = tkinter.Label(frame, text="Hello, World") label.pack(fill=X, expand=1) button = tkinter.Button(frame,text="Exit",command=tk.destroy) button.pack(side=BOTTOM) tk.mainloop()
でました!
定番の、Hello, Worldです♪
何から始めるのがいいか、ちょっと迷うところではありますが、チュートリアルとかはもう概ね経験済みなので、tkinterのソースを見てみようと思います。ぼくの環境だとインストールされているフォルダは「C:\ProgramData\Anaconda3\lib\tkinter」でした。このフォルダがモジュール名なので、最初に読み込まれる「__init__.py」をざっと見てみました。基本的には、何をやるにも「self.tk.call(…)」と、呼び出しているようです。self.tkの正体は、というと、最初に「_tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)」のように呼び出されています。「_tkinter」は何者かわかりませんが、最初に「import _tkinter」と読み込まれていました。今使っているのがAnaconda3の環境なので、このフォルダ以下を「_tkinter」で検索してみました。すると、 libsフォルダ、DLLsフォルダ から「_tkinter.lib」「_tkinter.pyd」が検索されました。これらのライブラリを使ってます、ということでしょうね。利用者側としてはひとまずこれくらいの理解でよいでしょうか。
ライブラリを使ってできることは、tkのライブラリがどうなっているのか知る必要がある、ということですね。ライブラリを参照しに行く前に、とりあえず、定義されているclassについて見ていくことにしましょう。っと、一行ずつコピペしましたが、多いなぁ。内部的なクラス(Internal class)、と、書いてあったのは、線を引いていきましょうか。む~、まだよくわかりませんねぇ。親子関係になっているものは、インデントを付けてみましょうか。
class EventType(str, enum.Enum):
class Event:
class Variable:
class StringVar(Variable):
class IntVar(Variable):
class DoubleVar(Variable):
class BooleanVar(Variable):class Misc:class CallWrapper:
class XView:
class YView:
class Wm:
class Tk(Misc, Wm):
class Pack:
class Place:
class Grid:
class BaseWidget(Misc):
class Widget(BaseWidget, Pack, Place, Grid):
class Toplevel(BaseWidget, Wm):
class Button(Widget):
class Canvas(Widget, XView, YView):
class Checkbutton(Widget):
class Entry(Widget, XView):
class Frame(Widget):
class Label(Widget):
class Listbox(Widget, XView, YView):
class Menu(Widget):
class Menubutton(Widget):
class Message(Widget):
class Radiobutton(Widget):
class Scale(Widget):
class Scrollbar(Widget):
class Text(Widget, XView, YView):class _setit:
class OptionMenu(Menubutton):
class Image:
class PhotoImage(Image):
class BitmapImage(Image):
class Spinbox(Widget, XView):
class LabelFrame(Widget):
class PanedWindow(Widget):
インデントを付けてみて、なんとなくわかってきました。画面の要素はWidgetを継承していて、→BaseWidget→Miscとなっているので、Miscが一番の先祖になっているのですね。他に、イベントを管理するためのEventクラスがあって、Variableを継承している何らかの値を保持するクラスがあって、Widegetの中でも見え方に特徴のあるものがXViewやYViewを多重継承して見せ方に特徴を持たせてそう。他のWmはウィンドウマネージャーかなぁ、何となくGUIの全体を管理しそうな、、、そして、Pack、Place、Gridは位置決めに使うクラス、あとは、メニュー用とイメージ用、と、ざっとこんな感じでしょうか。
それ以外にtkinterのフォルダを見てみました。
colorchooser.py ネイティブのカラーダイアログ(Chooserクラス)
commondialog.py 共通のダイアログ関連(Dialogクラス)
constants.py コンスタント値関連
dialog.py ダイアログ関連(Dialogクラス)
dnd.py ドラッグアンドドロップ関連
filedialog.py ファイル関連のダイアログ関連
font.py フォント関連
messagebox.py メッセージボックス関連
scrolledtext.py スクロールするテキスト関連
simpledialog.py 簡単なダイアログ関連
test テスト用かな
tix.py Tkの拡張ウィジェット(3.6から非推奨。使いません。ttkを使いましょう。)
ttk.py Tk8.5から新しく追加された、テーマ付きウィジェットに関するもの
__init.py
__main.py
__pycache
全体感は、これで何となくわかりました。あとは、個別の利用方法ですかね。
と、いうことで、最近gitLaboというサービスを触り始めたので、そちらの勉強もかねてもろもろが分かりやすくなるように簡単なサンプル集でもつくりますかねぇ。動くものがないと、理解できないですよね、きっと。
サンプルをつくっていく中で、いろいろと書きたいことが増えてくると思います。
2021年1月10日 追記
こちらに、クラス図を追記いたしました。概要を把握するのにどうぞ。
“PythonでGUI” への1件の返信