ロゴ ロゴ

電子計算機研究会ブログ作成ツール(初代)

はじめに

Markdownを導入してプログラムを含む記事が書きやすくなったということで、書いていきます。

Pythonのバージョンとか

今確認したので当時と違うかもしれませんが、コマンドプロントで確認したところ

Python 3.5.6 |Anaconda 4.2.0 (64-bit)

ということでした。

3.7を入れた記憶があったのですが、記憶違いですかね。パソコン修理で何度も初期化されてるのでもうわかりません。これを読んでる人はこんなことにならないようにしましょう。プログラミング初心者の典型例です。

Tkinter

とりあえず見た目はこんな感じです。

画質が悪いように見えるかもしれませんが、実際にこんな感じに見えてます。使ってる側も画質が悪いです。

それに入力も微妙な表示になって見にくいので基本コピペ前提で作ってます。

ということでさっそくどのように作られていくかをプログラムを見せながら解説していきます。大したものではないので、GUIの簡単なものが作りたいならPythonではじめてみるというのはありかもしれません。

これを作るにあたって、Tkinterというライブラリを使用しています。

import tkinter as Tk
from tkinter import messagebox

このようにimportします。メッセージボックスを使用しているのでプラスでimportしてます。

アプリケーションクラス

ここからは、どういう意味かあまり理解してない(テンプレに装飾しただけ)ということで、詳細は説明しません。

まずはTkinterのテンプレの部分

class Application(Tk.Frame):
    def __init__(self, master=None):
        Tk.Frame.__init__(self, master)
        self.pack(expand=1, fill=Tk.BOTH, anchor=Tk.NW)
        self.create_widgets()

こんな感じ。

実際に色々プログラムはこれ

class Application(Tk.Frame):
    def __init__(self, master=None):
        Tk.Frame.__init__(self, master)
        self.pack(expand=1, fill=Tk.BOTH, anchor=Tk.NW)
        self.create_widgets()

    def create_widgets(self):

        self.label = Tk.Label(self, text=u'記事のタイトル')
        self.label.grid(column=0, row=0, sticky=Tk.W)

        self.var_title = Tk.StringVar()
        self.title = Tk.Entry(self,  width = 60 ,textvariable=self.var_title)
        self.title.grid(column=0, row=0, sticky=Tk.W, padx = 100, pady = 5)

        self.description = Tk.Label(self, text=u'記事の概要(120文字程度の要約的な何か)')
        self.description.grid(column=0, row=1, sticky=Tk.W)

        self.description_text = Tk.Text(self, height=3, wrap=Tk.CHAR)
        self.description_text.grid(column=0, columnspan=2, row=2, sticky=Tk.W,  padx = 5)

        self.button = Tk.Button(self, text=u'出力', command=self.button_pushed)
        self.button.grid(column=0, row=4, sticky=Tk.W, pady = 5, padx = 5)

    def button_pushed(self):
        description_ = self.description_text.get('1.0', 'end -1c')
        title_ = self.var_title.get()
        messagebox.showinfo('info','出力されました')

        path_w = 'index.html'
        with open(path_w, mode='w',encoding="utf-8") as f:
            f.write(head_1 + title_ + head_2 + t_1 + title_ + t_2 + d_1 + description_ + d_2 + d_3 + description_ + d_4 + body)

create_widgetsの部分がいろいろなパーツに関しての部分、button_pushedの部分が出力ボタンが押された時の動作部分です。

出力ボタンが押されるとindex.htmlにあれこれ出力されます。そのとき、メッセージボックスが表示される問形になってます。

Tk.Labelというのが文字表示に関するウィジェット、Tk.Entryというのが1行のテキストボックス、Tk.Textというのが複数行のテキストボックス、Tk.Buttonというのがボタンです。全部最初にTkとついているのはimportしたときにas Tkという記述をしたためです。この部分がない場合はtkinterと全部書かなくてはなりません。Pythonの特徴的な奴です(多分)。

また、全部のウィジェットにgridというのが書いてある行がありますが、これが位置調整に使われてます。細かいことは忘れましたが、配置はマス目を用意してそこに当てはめるというような感じです。エクセルのマスに数字で座標を付けて配置するような感じです。ドット単位?か何かで配置もできるのでお好みです。作るものによってはそっちの方がいいと思います。これも結構無理やりの部分があったような記憶があるので。

実行部分

実行部分といっても内容はほぼ何もないのですが、こんな感じです。

root = Tk.Tk()
root.title(u"電子計算機研究会ブログ作成ツール")
app = Application(master=root)

with open('data/head_1.txt',encoding="utf-8") as head__1:
    head_1 = head__1.read()

with open('data/head_2.txt',encoding="utf-8") as head__2:
    head_2 = head__2.read()

with open('data/body.txt',encoding="utf-8") as body_:
    body = body_.read()


with open('data/property_title_1.txt',encoding="utf-8") as t__1:
    t_1 = t__1.read()

with open('data/property_title_2.txt',encoding="utf-8") as t__2:
    t_2 = t__2.read()

with open('data/description_1.txt',encoding="utf-8") as d__1:
    d_1 = d__1.read()

with open('data/description_2.txt',encoding="utf-8") as d__2:
    d_2 = d__2.read()

with open('data/description_3.txt',encoding="utf-8") as d__3:
    d_3 = d__3.read()

with open('data/description_4.txt',encoding="utf-8") as d__4:
    d_4 = d__4.read()

app.mainloop()

結構無駄に長くなっていますが、このTkinter自体は

root = Tk.Tk()
root.title(u"電子計算機研究会ブログ作成ツール")
app = Application(master=root)
app.mainloop()

だけで動いたはずです。この部分をまずは解説します。

といっても、テンプレなので説明するのはroot.titleの部分だけです。

お分かりの方も多いと思いますが、ウィンドウのタイトル部分ですね。それぞれ使うときに書き換えて終わりです。

ということで残りのテンプレ以外の部分に関してです。

app = Application(master=root)
app.mainloop()

この2行の間に記載していますが、この位置が正しいのかはよくわかりませんん。1度しか読み込む必要がないので、もしかしたら無駄な処理になっているかもしれません。

ここの間には複数の同じものが書いてあるので1つを抜粋して説明します。

with open('data/head_1.txt',encoding="utf-8") as head__1:
    head_1 = head__1.read()

これが1パーツです。UTF-8で読み込んでるだけです。dataフォルダ内のhead_1.txtというファイルを読み込んでます。これがいっぱいある理由は、入力されたものを間に挟むため、そのまえまでとそれ以降のファイルに分けたせいです。読み込み部分です。これ以上説明することがありません。

完成形

そんなこんなで完成形です。

import tkinter as Tk
from tkinter import messagebox

class Application(Tk.Frame):
    def __init__(self, master=None):
        Tk.Frame.__init__(self, master)
        self.pack(expand=1, fill=Tk.BOTH, anchor=Tk.NW)
        self.create_widgets()

    def create_widgets(self):

        self.label = Tk.Label(self, text=u'記事のタイトル')
        self.label.grid(column=0, row=0, sticky=Tk.W)

        self.var_title = Tk.StringVar()
        self.title = Tk.Entry(self,  width = 60 ,textvariable=self.var_title)
        self.title.grid(column=0, row=0, sticky=Tk.W, padx = 100, pady = 5)

        self.description = Tk.Label(self, text=u'記事の概要(120文字程度の要約的な何か)')
        self.description.grid(column=0, row=1, sticky=Tk.W)

        self.description_text = Tk.Text(self, height=3, wrap=Tk.CHAR)
        self.description_text.grid(column=0, columnspan=2, row=2, sticky=Tk.W,  padx = 5)

        self.button = Tk.Button(self, text=u'出力', command=self.button_pushed)
        self.button.grid(column=0, row=4, sticky=Tk.W, pady = 5, padx = 5)

    def button_pushed(self):
        description_ = self.description_text.get('1.0', 'end -1c')
        title_ = self.var_title.get()
        messagebox.showinfo('info','出力されました')

        path_w = 'index.html'
        with open(path_w, mode='w',encoding="utf-8") as f:
            f.write(head_1 + title_ + head_2 + t_1 + title_ + t_2 + d_1 + description_ + d_2 + d_3 + description_ + d_4 + body)

root = Tk.Tk()
root.title(u"電子計算機研究会ブログ作成ツール")
#root.geometry("400x300")
app = Application(master=root)

with open('data/head_1.txt',encoding="utf-8") as head__1:
    head_1 = head__1.read()

with open('data/head_2.txt',encoding="utf-8") as head__2:
    head_2 = head__2.read()

with open('data/body.txt',encoding="utf-8") as body_:
    body = body_.read()


with open('data/property_title_1.txt',encoding="utf-8") as t__1:
    t_1 = t__1.read()

with open('data/property_title_2.txt',encoding="utf-8") as t__2:
    t_2 = t__2.read()

with open('data/description_1.txt',encoding="utf-8") as d__1:
    d_1 = d__1.read()

with open('data/description_2.txt',encoding="utf-8") as d__2:
    d_2 = d__2.read()

with open('data/description_3.txt',encoding="utf-8") as d__3:
    d_3 = d__3.read()

with open('data/description_4.txt',encoding="utf-8") as d__4:
    d_4 = d__4.read()

app.mainloop()

おわりに

このツールはもう既に使ってないものですが、初めて作ったGUIのものという意味で非常に思い出深いです。とはいっても出来が悪いなぁと思ったりしてます。これを振り返るとやはりQtのほうがいい感じのものが作れるんだなっていうのがわかります。日本語どころか説明しているサイトもそう多くなく、結構大変でした。

ちなみに、Pythonをまともに使ったのもこれが初めてでした。言語なんて知らなくてもこの程度の物なら作れるんだぜっていう例としてみてもらえたらいいかなという感じです。誰が見てるかは知らないけど。

Pythonは非常に多くのライブラリなどがあり、人工知能やデータ分析などでも利用されているなど非常に可能性を秘めている言語だと思うので、これからも色々と試していきたいなと思います。

コメント入力

関連サイト