<?xml version="1.0" encoding="UTF-8" ?><rdf:RDF 
  xmlns="http://purl.org/rss/1.0/"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:atom="http://www.w3.org/2005/Atom"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xml:lang="ja">
  <channel rdf:about="http://w.atwiki.jp/ukyo_python/">
    <title>ukyo_python @ ウィキ</title>
    <link>http://w.atwiki.jp/ukyo_python/</link>
    <atom:link href="https://w.atwiki.jp/ukyo_python/rss10.xml" rel="self" type="application/rss+xml" />
    <atom:link rel="hub" href="https://pubsubhubbub.appspot.com" />
    <description>ukyo_python @ ウィキ</description>

    <dc:language>ja</dc:language>
    <dc:date>2018-03-01T16:22:49+09:00</dc:date>
    <utime>1519888969</utime>

    <items>
      <rdf:Seq>
                <rdf:li rdf:resource="https://w.atwiki.jp/ukyo_python/pages/2.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/ukyo_python/pages/13.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/ukyo_python/pages/12.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/ukyo_python/pages/1.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/ukyo_python/pages/3.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/ukyo_python/pages/4.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/ukyo_python/pages/5.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/ukyo_python/pages/6.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/ukyo_python/pages/7.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/ukyo_python/pages/8.html" />
              </rdf:Seq>
    </items>
	
		
    
  </channel>
    <item rdf:about="https://w.atwiki.jp/ukyo_python/pages/2.html">
    <title>メニュー</title>
    <link>https://w.atwiki.jp/ukyo_python/pages/2.html</link>
    <description>
      **メニュー
-[[トップページ]]
-[[プラグイン紹介&gt;プラグイン]]
-[[python - 電卓(説明)]]

----

**リンク
-[[@wiki&gt;&gt;http://atwiki.jp]]
-[[@wikiご利用ガイド&gt;&gt;http://atwiki.jp/guide/]]

// リンクを張るには &quot;[&quot; 2つで文字列を括ります。
// &quot;&gt;&quot; の左側に文字、右側にURLを記述するとリンクになります


//**更新履歴
//#recent(20)

&amp;link_editmenu(text=ここを編集)    </description>
    <dc:date>2018-03-01T16:22:49+09:00</dc:date>
    <utime>1519888969</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/ukyo_python/pages/13.html">
    <title>python - 電卓(説明)</title>
    <link>https://w.atwiki.jp/ukyo_python/pages/13.html</link>
    <description>
      *はじめに

pythonを用いて、電卓を作成した。初めてのGUIだったこと、また、オブジェク
ト指向プログラミングを勉強中という事で、見苦しいところがあるが、温かい目
で見て頂きたい。

コード全文 : [[python - 電卓]]

*classについて

今回のコードはclassオブジェクトを多用している。classオブジェクトを使用す
ることのメリットを正確には理解できていないが、私が感じたことを以下に述べ
ていく。

第一に、コードを使いまわすことが出来る。このプログラムで言うのならば、ボ
タンを作成するコードはボタンの分だけ必要になる。これをclassを使用するこ
とでコードを減らすことが出来る。ボタン1とボタン2があるとしよう。二つのボ
タンは押された時に表示する文字が異なるだけで、大きさや色などの仕様は同じ
である。この場合、共通する仕様を予めコード化し、異なる部分だけ、個別に追
加すれば良い。このようにすれば、共通部分のコードをボタンの分だけ書く必要
性がなくなる。

第二に、後からの修正が容易であることが挙げられる。ボタンの設定を変更した
い場合、それもすべてのボタンに対して行いたい場合、classではボタンを設定
している部分のコードのみを書き換えれば良い。各ボタンごとにコードを書いて
いる場合は、各ボタンの設定を書き換える必要が出てきてしまい、面倒だ。

第三にコードが読みやすい。これは、ボタンやラベルに関しての設定がまとまっ
て記述されているため、その部分を読めば、何が原因で不具合が生じたのか、ま
たどこを書き換えればより良くなるのかが分かる。

次に実際のclassを用いたコードを見てみる。

 class A:
     def __init__(self, A, B):
         self.a = A
         self.b = B
 
     def Display(self):
         print &quot;+ : {0}&quot;.format(self.a + self.b)
         print &quot;- : {0}&quot;.format(self.a - self.b)
 
 instance = A(1, 2)
 instance.Display()

1行目でクラスを宣言する。Aはクラスの名前で、基本的には、内容を表すような
名前にするべきだと考える。

2行目と6行目に記述されている、`def`はメソッドの作成である。クラスの内部
に存在する、関数のようなものである。メソッドはクラスの外部からも内部から
もアクセスすることが出来る。メッソドを実行すると、メソッド内に記述されて
いるコードが実行される。

特に、2行目に記述されている、`init`はクラスが呼び出された時に、特にメソ
ッドを実行するような記述なしに、実行される。初期化メソッドである。このコ
ードの場合、11行目でクラスAのインスタンスとして、instanceを作成している。
この時に、`init`内部のコードが実行される。3、4行目の&#039;self.a&#039;や&#039;self.b&#039;は
インスタンス変数と呼ばれるものである。クラス内部でインスタンス変数を参照す
る場合は&#039;self.a&#039;と書く。クラスの外部から参照する場合、`インスタンス名.a`
とする。つまりここでは&#039;instance.a&#039;とすれば、値を参照できる。インスタンス
変数はインスタンスごとに保持するため、仮にインスタンスが&#039;instance&#039;と
&#039;instancecopy&#039;がある場合、`instance.a`と&#039;instancecopy.a&#039;は別の変数を参
照することになる。

11行目のように記述することで、インスタンスを作成できる。また、`init`が引
数を取るのでそれを記述している。メソッドは、クラス内部でメソッドを使用す
る場合、`self.Display()`とする。外部から行う場合、`instance.Display()`と
する。

*電卓作成に関する各部分の説明

文中に行数を指定し、説明する箇所があるがそれはコード全文([[python - 電卓]])
の箇所を示すものである。

**import
 
 from Tkinter import *
 import Tkinter as tk

importするモジュールはTkinterである。このようにしないとうまくいかなかった。
明確な理由は不明だが、とりあえず、このようにimportした。

**frame

 class Use_Frame(ttk.Frame): 
     def __init__(self, master=None):
         ttk.Frame.__init__(self, master) 
         self.grid(column=0, row=0)

まず、GUIの基盤となるフレームクラスを作成する。このフレームの上に、ボタ
ンやラベルを配置する。8行目では、クラスの継承を行っている。ttk.Frameとい
うクラスを、自分の作成したクラスUse\_Frameに継承している。これで、
ttk.Frameに含まれているメソッドが使用できる。9行目以下の&#039;init&#039;部分で初期
化を行う。10行目で、フレームの作成、11行目でフレームの配置、13行目でフレー
ムの設定を行う。

9行目、10行目にある&#039;master&#039;は調べたが不明である。推測として、このオブジェ
クトの所属している場所を示していると考える。フレームの上にボタンやラベル
を乗せるが、この時、どのフレームに乗せるかを明示的にしなければならない。
フレームの場合も、どのGUIのフレームかということを明示的にする必要がある。
仮に、GUIの名前をdentakuだとすると、dentakuの中にフレーム(Frame1,Frame2...)
があり、フレームの中にボタン(Button1, Button2...)がある。Frame1に
Button1を乗せる場合、Button1のmasterはFrame1、Frame1のmasterはdentaku
ということになる。

11行目にある、gridメソッドは、フレームを格子状に配置する。columnが行、row
が列である。

**button

 class Use_Button(tk.Button):
     def __init__(self, master=None):
         tk.Button.__init__(self, master)
 
         self[&quot;height&quot;] = 3
         self[&quot;width&quot;] = 6
         self[&quot;font&quot;] = (&quot;Helvetica&quot;, 15)
         self[&quot;command&quot;] = self.input_exe
 
     def input_exe(self):
         Label.push_list.append(self[&quot;text&quot;])
 
         if self[&quot;text&quot;] == &quot;=&quot;:
             self.cal()
             Label.push_list = []
 
         elif self[&quot;text&quot;] == &quot;C&quot;:
             Label.push_list = []
             Label.Display()
             
         else:
             Label.Display()
 
     def cal(self):
             result = eval(Label.display_item)
             Label.push_list.append(str(result))
             Label.Display()        

ボタンクラスもフレームクラスと同じように、tk.Bottonを継承させる(16行目)。
17、18行目の&#039;init&#039;部分も同様に、ボタンの作成と、自ら設定する初期設定であ
る。20行目から23行目はボタンの性質を設定する。もちろん、フレームクラスと
同様に、configureを使用して設定を行うことも出来る。ここでは読みやすくす
るためにこのような書き方をする。

`self.[key]`とする事で、self(つまり、インスタンス)が持つディクショナリへ
アクセスする。`height`は高さ、`width`は幅、`font`はボタン上に書く文字の
フォント、`command`はボタンが押された時の処理を、それぞれ設定する。

25行目から37行目はボタンが押された時に実行されるメソッドである。

26行目の&#039;Label.push_list&#039;は次に説明を行う、ラベルクラスのインスタンスで
ある&#039;Label&#039;にアクセスしている。このような書き方が正しいのか不明である。
使用する際は気をつけるべきだと考える。この行が行っていることは「インスタ
ンス(Label)が持つインスタンス変数push_listにself[&#039;text&#039;]を追加する」であ
る。

self[&#039;text&#039;](ディクショナリ)はボタンに書かれた文字である。電卓では数字や
演算子のボタンを作るが、そのボタン上にかかれている文字列が代入されている。

28行目以下のif文は、押されたボタンに対して処理の分岐を行う。self[&#039;text&#039;]
の値によって処理を変える。特に、`=`と&#039;C&#039;は他のボタンとは別の処理を行いた
いので個別に設定を行う。

39行目以下は計算を行うメソッドである。40行目のevalは文字列を数式として処
理する関数である。例えば&#039;1 + 1&#039;はeval(`1 + 1`)で処理すると2になる。

**label

 class Use_Label(tk.Label):
     def __init__(self, master=None):
         tk.Label.__init__(self, master)
 
         self[&quot;font&quot;] = (&quot;Helvetica&quot;, 20)
         self[&quot;width&quot;] = 20
         self[&quot;anchor&quot;] = &quot;e&quot;
         self.push_list = []
 
     def Display(self):
         self.display_item = &quot;&quot;.join(self.push_list)
         self[&quot;text&quot;] = self.display_item

46行目から48行目はフレームクラスとボタンクラスと同様の処理である。
tk.Labelを継承している。

50行目から53行目は初期設定である。ボタンクラスでは出てこなかった&#039;anchor&#039;
はラベルの中にある文字をどのように配置するか、つまり、左からなのか右から
なのか、中央に置くのか等を設定する。`e`はeastで東の意味なので、右から文
字を置いていく。

53行目の&#039;self.push_list&#039;はインスタンス変数を作成している。ここに、他の
クラスからアクセスしていた。

55行目以降はメソッドである。自身の&#039;text&#039;、コード中ではself[&#039;text&#039;]を変
化させる。ボタンクラスからアクセスされていた。

57行目にある&quot;&quot;.join()は()にリストを置くことで、任意の文字(&quot;ここの文字列&quot;)を
使用し、リストの各要素を結合する。例えば、

 &gt;&gt;&gt; &quot;.&quot;.join([&quot;test&quot;, &quot;txt&quot;])
 &gt;&gt;&gt; &quot;test.txt&quot;

 &gt;&gt;&gt; &quot;/&quot;.join([&quot;desktop&quot;, &quot;test.txt&quot;])
 &gt;&gt;&gt; &quot;desktop/test.txt&quot;

このようになる。単に結合したい場合、&quot;&quot;.join()として&quot;&quot;の中に何も入れない。

 root = Tk()
 root.title(&quot;計算機&quot;)

62行目はウィンドウを作成する。これもTk()クラスのインスタンスを作成し、
その中のメソッドを63行目で使用する。63行目はウィンドウのタイトルを設定
するメソッドである。

71行目以下は、クラスを呼び出して、各オブジェクトを配置していく。    </description>
    <dc:date>2018-03-01T16:22:31+09:00</dc:date>
    <utime>1519888951</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/ukyo_python/pages/12.html">
    <title>python - 電卓</title>
    <link>https://w.atwiki.jp/ukyo_python/pages/12.html</link>
    <description>
      //python/linenumber

# -*- coding: utf-8 -*-
from Tkinter import *
import Tkinter as tk


##############################################################################
#フレーム
class Use_Frame(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)
        self.grid(column=0, row=0)

   
##############################################################################
#ボタン
class Use_Button(tk.Button):
    def __init__(self, master=None):
        tk.Button.__init__(self, master)

        self[&quot;height&quot;] = 3
        self[&quot;width&quot;] = 6
        self[&quot;font&quot;] = (&quot;Helvetica&quot;, 15)
        self[&quot;command&quot;] = self.input_exe

    def input_exe(self):
        Label.push_list.append(self[&quot;text&quot;])

        if self[&quot;text&quot;] == &quot;=&quot;:
            self.cal()
            Label.push_list = []

        elif self[&quot;text&quot;] == &quot;C&quot;:
            Label.push_list = []
            Label.Display()
            
        else:
            Label.Display()
            
    def cal(self):
        result = eval(Label.display_item)
        Label.push_list.append(str(result))
        Label.Display()        

##############################################################################
#ラベル
class Use_Label(tk.Label):
    def __init__(self, master=None):
        tk.Label.__init__(self, master)

        self[&quot;font&quot;] = (&quot;Helvetica&quot;, 20)
        self[&quot;width&quot;] = 20
        self[&quot;anchor&quot;] = &quot;e&quot;

        self.push_list = []

    def Display(self):
        self.display_item = &quot;&quot;.join(self.push_list)
        self[&quot;text&quot;] = self.display_item

##############################################################################

root = Tk()
root.title(&quot;計算機&quot;)


Main = Use_Frame(root)
Main.grid(column=0, row=1)

##############################################################################
#ボタンの作成、1から9まではfor文で、0と各種演算子は別に作成    
Button_number = 9

for Button_num in range(Button_number):
    Button = Use_Button(Main)

    yoko = Button_num % 3
    tate = Button_num // 3 + 1
    
    Button.grid(column=yoko, row=tate)
    Button[&quot;text&quot;] = &quot;{0}&quot;.format(Button_num + 1)

Button_0 = Use_Button(Main)
Button_0.grid(column=1, row=4)
Button_0[&quot;text&quot;] = &quot;0&quot;

Button_plus = Use_Button(Main)
Button_plus.grid(column=3, row=3)
Button_plus[&quot;text&quot;] = &quot;+&quot;

Button_minus = Use_Button(Main)
Button_minus.grid(column=4, row=3)
Button_minus[&quot;text&quot;] = &quot;-&quot;

Button_multi = Use_Button(Main)
Button_multi.grid(column=3, row=2)
Button_multi[&quot;text&quot;] = &quot;*&quot;

Button_div = Use_Button(Main)
Button_div.grid(column=4, row=2)
Button_div[&quot;text&quot;] = &quot;/&quot;

Button_eqa = Use_Button(Main)
Button_eqa.grid(column=4, row=4)
Button_eqa[&quot;text&quot;] = &quot;=&quot;

Button_point = Use_Button(Main)
Button_point.grid(column=2, row=4)
Button_point[&quot;text&quot;] = &quot;.&quot;

Button_clear = Use_Button(Main)
Button_clear.grid(column=4, row=1)
Button_clear[&quot;text&quot;] = &quot;C&quot;

Sub = Use_Frame(root)
Sub.grid(column=0, row=0)

Label = Use_Label(Sub)
Label.grid(column=0,row=0)

root.mainloop()    </description>
    <dc:date>2018-03-01T16:02:45+09:00</dc:date>
    <utime>1519887765</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/ukyo_python/pages/1.html">
    <title>トップページ</title>
    <link>https://w.atwiki.jp/ukyo_python/pages/1.html</link>
    <description>
      **@wikiへようこそ
-ウィキはみんなで気軽にホームページ編集できるツールです。
-このページは自由に編集することができます。
-メールで送られてきたパスワードを用いてログインすることで、各種変更（サイト名、トップページ、メンバー管理、サイドページ、デザイン、ページ管理、等）することができます

**まずはこちらをご覧ください。
-[[@wikiの基本操作&gt;&gt;http://www1.atwiki.jp/guide/pages/11.html]]
-[[編集モード・構文一覧表&gt;&gt;http://www1.atwiki.jp/guide/pages/137.html]]
-[[@wikiの設定・管理&gt;&gt;http://www1.atwiki.jp/guide/pages/36.html]]

**分からないことは？
-[[@wiki ご利用ガイド&gt;&gt;http://atwiki.jp/guide/]]
-[[よくある質問&gt;&gt;http://www1.atwiki.jp/guide/pages/21.html]]
-[[@wiki更新情報&gt;&gt;http://www1.atwiki.jp/guide/pages/143.html]]
-[[@wikiへのお問合せフォーム&gt;&gt;https://atwiki.zendesk.com/hc/ja]]
等をご活用ください

**[[アットウィキモードでの編集方法&gt;&gt;http://www1.atwiki.jp/guide/pages/226.html#id_6861418f]]
-[[文字入力&gt;&gt;http://www1.atwiki.jp/guide/pages/228.html]]
-[[画像入力&gt;&gt;http://www1.atwiki.jp/guide/pages/230.html]]
-[[表組み&gt;&gt;http://www1.atwiki.jp/guide/pages/914.html]]

**[[ワープロモードでの編集方法&gt;&gt;http://www1.atwiki.jp/guide/pages/226.html#id_a14c0938]]
-[[文字入力&gt;&gt;http://www1.atwiki.jp/guide/pages/2644.html]]
-[[画像入力&gt;&gt;http://www1.atwiki.jp/guide/pages/2645.html]]
-[[表組み&gt;&gt;http://www1.atwiki.jp/guide/pages/2646.html]]

**その他にもいろいろな機能満載！！
-[[@wikiプラグイン一覧&gt;&gt;http://www1.atwiki.jp/guide/pages/264.html]]
-[[@wikiかんたんプラグイン入力サポート&gt;&gt;http://www1.atwiki.jp/guide/pages/648.html]]

**他のWIKIが気になる方はこちら
-[[プログラミングに関する私的メモ&gt;&gt;https://www46.atwiki.jp/gen3/]]
-[[精霊回路ドライヴ@wiki&gt;&gt;https://www65.atwiki.jp/seireikairodrive/]]
-[[AcesHigh Wiki Plus!&gt;&gt;https://www43.atwiki.jp/aceshigh/]]
-[[エルプリ攻略wiki&gt;&gt;https://www65.atwiki.jp/erupri/]]
-[[ハートオブクラウン@wiki&gt;&gt;https://www49.atwiki.jp/hatokura/]]

**バグ・不具合を見つけたら？ 要望がある場合は？
お手数ですが、[[お問合せフォーム&gt;&gt;https://atwiki.zendesk.com/hc/ja]]からご連絡ください。
    </description>
    <dc:date>2018-03-01T14:59:21+09:00</dc:date>
    <utime>1519883961</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/ukyo_python/pages/3.html">
    <title>右メニュー</title>
    <link>https://w.atwiki.jp/ukyo_python/pages/3.html</link>
    <description>
      **更新履歴
#recent(20)


&amp;link_editmenu2(text=ここを編集)
    </description>
    <dc:date>2018-03-01T14:59:21+09:00</dc:date>
    <utime>1519883961</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/ukyo_python/pages/4.html">
    <title>プラグイン/ニュース</title>
    <link>https://w.atwiki.jp/ukyo_python/pages/4.html</link>
    <description>
      * ニュース
@wikiのwikiモードでは
 #news(興味のある単語)
と入力することで、あるキーワードに関連するニュース一覧を表示することができます
詳しくはこちらをご覧ください。
＝＞http://www1.atwiki.jp/guide/pages/266.html#id_542badf7


-----


たとえば、#news(ゲーム)と入力すると以下のように表示されます。


#news(ゲーム)
    </description>
    <dc:date>2018-03-01T14:59:21+09:00</dc:date>
    <utime>1519883961</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/ukyo_python/pages/5.html">
    <title>プラグイン/編集履歴</title>
    <link>https://w.atwiki.jp/ukyo_python/pages/5.html</link>
    <description>
      * 更新履歴
@wikiのwikiモードでは
 #recent(数字)
と入力することで、wikiのページ更新履歴を表示することができます。
詳しくはこちらをご覧ください。
＝＞http://www1.atwiki.jp/guide/pages/269.html#id_bf9eaeba


-----


たとえば、#recent(20)と入力すると以下のように表示されます。


#recent(20)
    </description>
    <dc:date>2018-03-01T14:59:21+09:00</dc:date>
    <utime>1519883961</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/ukyo_python/pages/6.html">
    <title>プラグイン/アーカイブ</title>
    <link>https://w.atwiki.jp/ukyo_python/pages/6.html</link>
    <description>
      * アーカイブ
@wikiのwikiモードでは
 #archive_log()
と入力することで、特定のウェブページを保存しておくことができます。
詳しくはこちらをご覧ください。
＝＞http://www1.atwiki.jp/guide/pages/921.html#id_2d967d6e


-----


たとえば、#archive_log()と入力すると以下のように表示されます。
保存したいURLとサイト名を入力して&quot;アーカイブログ&quot;をクリックしてみよう


#archive_log()
    </description>
    <dc:date>2018-03-01T14:59:21+09:00</dc:date>
    <utime>1519883961</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/ukyo_python/pages/7.html">
    <title>プラグイン/RSS</title>
    <link>https://w.atwiki.jp/ukyo_python/pages/7.html</link>
    <description>
      *RSSを取り込んで一覧表示(rss)
 #rss(ここにＲＳＳのＵＲＬ)
もしくは
 #rss(ここにＲＳＳのＵＲＬを入力)
と入力することで指定したＲＳＳを取り込んで一覧表示します。

詳しくはこちらをご覧ください。
＝＞http://www1.atwiki.jp/guide/pages/269.html#id_a0e79757

----
たとえば、#rss(http://www1.atwiki.jp/guide/rss10_new.xml) と入力すると以下のように表示されます。

#rss(http://www1.atwiki.jp/guide/rss10_new.xml)
    </description>
    <dc:date>2018-03-01T14:59:21+09:00</dc:date>
    <utime>1519883961</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/ukyo_python/pages/8.html">
    <title>プラグイン/動画(Youtube)</title>
    <link>https://w.atwiki.jp/ukyo_python/pages/8.html</link>
    <description>
      * 動画(youtube)
@wikiのwikiモードでは
 #video(動画のURL)
と入力することで、動画を貼り付けることが出来ます。
詳しくはこちらをご覧ください。
＝＞http://www1.atwiki.jp/guide/pages/801.html#id_30dcdc73

また動画のURLはYoutubeのURLをご利用ください。
＝＞http://www.youtube.com/

-----


たとえば、#video(http://youtube.com/watch?v=kTV1CcS53JQ)と入力すると以下のように表示されます。


#video(http://youtube.com/watch?v=kTV1CcS53JQ)

    </description>
    <dc:date>2018-03-01T14:59:21+09:00</dc:date>
    <utime>1519883961</utime>
  </item>
  </rdf:RDF>
