pygameを使ったプログラムをcx_freezeでexeファイルにする時の注意
環境:windows7 64bit, python3.3, pygame1.9.2, cx_freeze4.3.1
pythonで書いたプログラムを実行ファイル(exeファイル)に変換することができる。
py2exeが有名みたいだけど、python3には対応していないようだ。
python3対応しているのではcx_freezeというのが使えそうだったので、試してみた。
cx_freezeの使い方はyou tubeのPython: compiling using cx_freeze tutorialの通りにやったらうまくいった。日本語の解説ブログだと色々めんどくさそうな感じがしたが、意外と簡単で拍子抜けした。
しかし、pygameをimportしたプログラムに対してはうまくいかなかったので調べたら、
import pygame._view import re
をソースに付け足す必要がある場合があるとのこと。reが必要になる理由はよく分かってないらしい。
参考:cx_Freeze won't work with pygame (already tried “import pygame._view”)
tkinterで画像のタグに数字のみは使えない?
(python3.3)
tkinterはpythonに標準で入ってるからとりあえず使ってみるにはいいのだが、どうもよく分からないことが多い。
>>> canvas.create_image(0,0,image=im, tags = '99') 1 # create_imageは戻り値として数値のidを発行して返す >>> canvas.gettags(1) ('99',) # id = 1のitemに貼ってあるtagをすべて取得 >>> canvas.find_withtag('99') () # しかしtagで検索しても存在しないといわれる >>> canvas.find_all() (1,) # 全部表示させると、存在が確認できる >>> canvas.delete('99') # tag指定でdelete >>> canvas.find_all() (1,) # delete できていない >>> canvas.delete('1') # id指定でdelete >>> canvas.find_all() () # delete できた
ようするに、数字のタグはうまく機能しないということなんだけど、エラーが出るわけではない。
きちんとid(ここでは'1')が発行されるし、tagを取得すればちゃんと登録されている。
idを指定すれば問題なく振舞う。
find_allでも存在が確かめられる。だけど、tagで指定しようとすると、たぶんid指定と勘違いされてしまうのか何も起きない。でもfind_withtagでも引っかからないってどういうこと?
そもそもcreateしたのに、オブジェクトが渡されるわけじゃなくて数字のidが渡されるだけでそれで操作しろっていう、実体がない感じがすごく違和感ある。
もちろんtags = 'tag99'と数字以外を含めれば、問題なく扱える。
これも気付くまでかなりはまってしまったし、今でも腑に落ちない。
python:正規表現のグループ化
正規表現のグルーピングで少し分かりにいところがあったからメモ
コード
import re text = '12cd efg12121 bc121212d efg1212' terget_1 = r'(12)+\w*' result = re.findall(terget_1, text) print(result_1) terget = r'(?:12)+\w*' result_2 = re.findall(terget_2, text) print(result_2)
出力
['12', '12', '12', '12'] ['12cd', '1212', '121212d', '1212']
括弧の主な役割は、(12)+
で12
の一回以上の繰り返しに一致する、とか
括弧( )
は正規表現をまとめて構造化できるけど、そのままだと一致結果を抜き出すときに括弧内の文字だけを集めてきてしまう(一つ目の結果)。検索したい文字列のさらに特定の部分だけ取り出したいときは便利だけど、そうじゃなくて単に正規表現を書くときにグループを作りたいだけなら(?:12)
などのよう?:
をつける。これで出力するときに括弧が影響を与えない。
本文中にコードの一部を表示 MarkDown記法
はてな記法でプログラムのソースコードが埋め込める!って思って喜んでいたら、次のように
print("改行する")
改行してソースを書くことはできるのだけど、本文中にprint('本文中')
という風に書く方法が分からなかった。
調べてみると、MarkDown記法だとかけるらしい。 設定からマークダウンモードにしておいて、記事の編集のときに三つバッククォート(`)で囲めば上の一つ目のように表示されるし、ひとつバッククォートで囲めば改行されずに本文中に表示される。シンタックスハイライト(色付け)できるのかはよくわかってない。
問題は、今まではてな記法で書いた(下書き)記事をそのままMarkDown記法で編集できないっぽいこと。すごく面倒。 あとは、ちょっとシンタックスハイライトの色が好きになれないとか。
というか、はてな記法も本文中にコードを簡単に書けるようにしてもらえないかな・・・何か方法があるんだろうか。
追記:htmlソースで見てみたら、<code>print()<\code>
と直接書けばそれで十分みたい。多少面倒だが。ブログとか初めてだけど、htmlぐらい勉強してからやれってことなのかな。
pythonを始めるまで
要点をまとめておくと、
背景:
- テキストファイルをいじってデータを収集したりエクセル形式にして出力したりするのに興味があった。仕事などで必要とかではなく、個人的趣味のレベル。
- 大学での経験では、デバッグ大嫌い、自分でプログラムを書くなんて時間の浪費にしか思えない、という印象。
pythonを選んだ経緯:
- Rubyの書いてて楽しいというのには興味を持ったが
まさかPythonに大きな落とし穴があるとも思わずに・・・
以下は詳しい目に個人的体験を書き出しているだけなので、あしからず。
上に書いたような経緯で2010年ごろ、とりあえずpythonに手を出してみることにした。
pythonを調べてみると、困ったことに2.x系と3.x系があって、互換性がないことが判明。しかも3.x系はまだあんまり使っている人がいないみたい。やるならこれからメジャーになっていくはずの3系だろうと思ってインストールしたのだが・・・
3.x系のやさしい日本語チュートリアルがネット上にほぼなかった(見つけられなかった)。公式ドキュメントの和訳があったが、初めから小難しい話で専門用語がちりばめられていて、全くよく分からない。なぜHello Worldからはじめてくれないのだろうと思いつつ、これは入門者向けの解説でないと挫折。ソースを見れば何か分かるかもと思ったのだが、
x = "text"
x.method()
というようなのをみて、xは変数っぽいのに次の行で関数になってる??これがうわさのオブジェクト指向とかいうやつか?独習C++が宇宙人語にしか見えなかった僕にどうしろと。絶望。
まあテキスト買えよって話かもしれないが、僕はちょろっと勉強して自分にやりたいことだけちゃちゃっとプログラムするようなのをイメージしてたから、ちょっと敷居が高すぎた。
ここまでで体力のほとんどを使い果たしてしまった結果、一行もコードを書くことなく放置、そのままなんとなくやる気も起きずに数ヵ月後にアンインストール。
よくある?典型的ダメパターンですね。
数年後(というか今から一ヶ月前)。またもやhtmlソースから自分のほしいデータだけを抜き出して整形したいという強い欲求に直面した。時間がたてば過去の苦労なんて忘れてるもので、前回はなんとなく流してしまったけど、またやってみようという気になって、インストールする前にとりあえずチュートリアルを探した。で、なんとなく英語で検索したら、Non programmers tutorial for python 3ってのを発見。ちゃんとHello Worldからコードを用いて解説してくれてる!
はじめは
print('Hello World')
という一文だけでプログラムとして成立しているとは思っていなかったから戸惑ったけど笑。
英語だけど、コードを見ながらよめば普通に理解できるぞって感動して、早速python3.3を入れて、コードを書いていくことになった。
その後は、またおいおい。とりあえず今はpythonでプログラム書くのが楽しくて仕方ない。まだ一ヶ月だからかもしれないけど。
とりあえずためし書き
最近pythonの勉強を始めた。プログラミングは5年以上前にC言語を大学の授業で触って、連立方程式を解いたり定積分を求めたりしたことがある程度。ポインタが分からなくて、特にそれ以上何か自分で勉強したいとも思わず、必要性もなく今まで来たのだが、なんかプログラミングができたらいろいろ楽しそうだなと最近思うようになって、再入門することにした。
pythonはあまり日本語情報がないのではまることも多く(特にver. 3.xは!)、そういうことを少し書いていくのも自分のモチベーションアップに悪くないと思ったので、とりあえずはてなブログでもやってみることにする。
とりあえず、プログラムのコードを貼りけるのはどうするのだろう。stack overflowみたいにデフォルトの編集にあれば楽なんだけど、さすがにないか
追記:普通にあった。
>| python|
for i in range(20):
print('Hello World!')
| |<
反映されない。。。