ブログ移行を完結させる:計画

2018-06-01 :  その他
ブログ移行を完結させる(予定)」を書いたのは、
かれこれ6年前の、2012-08-16 だった。

今まで放置していたが、
ブログ開設10周年を目前にして、
一念発起”して、完結させる計画を立てた。


手順の概要:

(1)全563件の記事について、
  FC2ブログの「記事の編集」画面から、
  1件1ファイルとして取り込む。

(2)各ファイルの記事について、
  過去記事参照先がgooブログのものを
  FC2ブログに変換する。

(3)変換した各記事について、
  FC2ブログの「記事の編集」画面から、
  書き戻す。
  (変換不要のものはパスする)

以上の3手順で、
それぞれ GSL Shell でコード化して実行する。


各手順の具体化:

(1)FC2ブログの「記事の編集」画面は、
  ログインが必要なので、
  手操作で Web ブラウザを立ち上げておき、
  「afxLua / winman」を使って操作する。
  ・URL 入力フィールドに入力し、
  ・編集領域をクリックして、
   「Ctrl+A」「Ctrl+V」で読み取り、
  ・「メモ帳」を立ち上げておいて、貼り付け、
   ファイル名を指定して保存する。
 以上を 563 回、繰り返す

(2)参照リンクが gooブログのものは、
  対応テーブルを用意しておいて、
  FC2ブログ用に変換する。

(3)記事の書き戻しは、
  大筋で、(1)の逆処理。


以上の処理方式だと、

処理時間は、
(1)が約30分
(2)は微々たるモノ
(3)も約30分
でしょうか?


今回こそ、
頑張って移行を完結させよう。



本日はここまで。


GSL Shell コーディングに続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


180523

Anaconda 学習:with 構文

2018-05-30 :  PCクリニック
Python のサンプルコードを見ていると、・・・・・

時には、
with open( 'foo.txt', 'w' ) as f:
f.write( 'sample statement:' )
と云った様なコードを目にする。

遅ればせながら、
この with について学習した。

「Python with」で検索 ・・・

with構文”で多数みつかる。


1つ:
“Qiita”の
with構文(Python)

   with構文を使うとついつい忘れてしまうclose()を省略することができる上に
  可読性も上がるので便利。
#with文使用
with open("text.txt", 'w') as text:
text.write("Hello, world!")
  の様に、
    text.close()
  を書かなくて良い。


もう1つ:
“blog.PanicBlanket.com”の
Pythonのwith構文を覚えた!

  基本的な使い方

  ファイルを開いて読み込む処理が典型的かな。
  今まではこうしていた:
f = open('data.txt', 'r')
print f.read()
f.close()
  with 構文を使うとこう書ける:
with open('data.txt', 'r') as f:
print f.read()
  開いたファイルは、
  ブロックを抜けるときに自動で閉じてくれる。

withに対応したクラス

  with 構文に書けるクラスはファイルだけじゃない。
  __enter__ と __exit__ の2つのメソッドを持ったクラス
  (のインスタンス)なら何でもいい。
  __enter__ はブロックに入るときに、__exit__ はブロックを
  抜けるときに呼ばれる。
  ちょっと試してみよう。

  ・・・・・
  ・・・・・

  ブロックの中を実行する前に __enter__ が、
  あとに __exit__ が呼ばれているのがわかる。
  as t: の部分の t には、__enter__ の返り値が代入されるので、
  self を返している。

  ともあれ、1行短くなって見やすくなる。
  これからはこうやって書くようにしよう。


と云うことでした。



本日はここまで。


Anaconda ( Python ) 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


180417

“.xlsx”ファイルとは ZIP 書庫のこと

2018-05-28 :  PCクリニック
先日(2018-05-09)の記事:
Anaconda 学習:Excel ファイル・アクセス」では、

「openpyxl」を学習した。

  ・・・・・
  ・・・・・

  Openpyxlは、Excel 2010 xlsx / xlsm / xltx / xltmファイルを
  読み書きするためのPythonライブラリです。

  これは、PythonからOffice Open XMLフォーマットをネイティブに
  ・・・・・

  ・・・・・
  ・・・・・


これでは、.xlsx は、
  “Office Open XMLフォーマット”である。
とあった。


<紙>の知識では、
“.xlsx”は、XML 即ち eXtensible Markup Language
だが、これって、HTML と同じテキストだと思っていた。

でも、
.xlsx はバイナリファイル?

つまり、“Office Open XMLフォーマット”はバイナリ形式?



バイナリモードの XML について探してみたが、・・・・・

見つからない。

無いものが見つからないのは当然?


こんな記事が見つかった:

OpenBook Excel and Software development and more...
の、
Excel ブック (*.xlsx) 形式概要

  ◆Office Open XML

  Office 2007 から採用されているファイル形式「Office Open XML」は、
  XML をベースとしたオフィスソフトウェア用のファイルフォーマット形式です。
  2006 年 12 月に Ecma International により ECMA-376 として標準化され、
  2008 年 4 月には ISO と IEC の合同技術委員会 ISO/IEC JTC 1 の副委員会
  SC 34 において、ISO/IEC 29500 として標準化されました(Wiki ペディアより)。
  詳細な仕様については、Ecma International のホームページから
  約 5500 ページに渡る仕様書をダウンロードすることができます。

  ◆Excel ファイル構造

  Office 2007 からは XML で記述された文書と画像やプリンタ情報などの
  バイナリ情報を ZIP でパッケージングして格納するようになりました。
  Excel の場合、拡張子を「.xlsx」から「.zip」に変更してエクスプローラで
  構造を確認することができます。

  ・・・・・
  ・・・・・


詰まるところ、
.xlsx”ファイルは ZIP 書庫である。


確かめてみた:

  拡張子を「.xlsx」から「.zip」に変更して、

開くと、Explzh で中身が見られた。

「xl」フォルダの「worksheets」フォルダに、
「sheet1.xml」ファイルがあり、

これが、
「シート情報(Sheet1)」ダ。



本日はここまで。


Anaconda ( Python ) 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


180414

Anaconda 学習:imageio パッケージ

2018-05-25 :  PCクリニック
Anaconda 5.0.1 : Windows 版 Python 2.7.14 ( 64bit 版 )
に、
含まれるパッケージ:「Packages for 64-bit Windows with Python 2.7
から、
デフォルトで入っているものを見ていた。

その中で気になったものに、

imageio 2.2.0 a Python library for reading and writing image data

があった。


リンク先を見ると、

   Imageio is a Python library that provides an easy interface to
  read and write a wide range of image data, including animated images,
  video, volumetric data, and scientific formats.
   It is cross-platform, runs on Python 2.7 and 3.4+,
  and is easy to install.
===
   Imageioはアニメーション画像、ビデオ、体積データ、科学的フォーマットを
  含む幅広い画像データを読み書きするための簡単なインターフェイスを提供する
  Pythonライブラリです。
   これはクロスプラットフォームで、Python 2.7と3.4+で動作し、
  インストールが簡単です。

  Example

  Here's a minimal example of how to use imageio. ・・・・・
  
>>> import imageio
>>> im = imageio.imread('imageio:chelsea.png') # read a standard image
>>> im.shape # im is a numpy array
(300, 451, 3)
>>> imageio.imwrite('~/chelsea-gray.jpg', im[:, :, 0])
  ・・・・・
  ・・・・・


それで、
ドキュメントは、“imageio 2.3.0 documentation”の、
Welcome to imageio's documentation!
ですね。

“Getting started”の、
Usage examples

には、

  Some of these examples use Visvis to visualize the image data,
  but one can also use Matplotlib to show the images.
===
  これらの例ではVisvisを使用して画像データを視覚化していますが、
  Matplotlibを使用して画像を表示することもできます。

とある。

visvisについては、
先々月(2018-03-26)の記事「Anaconda 学習:visvis 導入
の如くです。


そして、

  Read medical data (DICOM)

に、
# -----------------
import imageio

# Read as loose images
ims = imageio.mimread( 'x.dcm' )
とすることで、

  len(ims) == 1

の list で、

  Image( [[ , ], [ , ]], dtype=int16 )

  len(ims[0]) == 行数
  len(ims[0][0]) == 列数

が得られる。

このパッケージは、なかなかのもの?

もっと、学習しよう!



本日はここまで。


Anaconda ( Python ) 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


180409

Anaconda 学習:日本語文字コードの扱い

2018-05-23 :  PCクリニック
先日(2018-05-11)の記事:
Anaconda 学習:pandas で、Excel ファイル・アクセス」等の、
pandasと、

前回(2018-05-21)の記事「Anaconda 学習:PyAutoGUI 補足事項」等の
PyAutoGUIとを使って、

Excel ファイルにある“タイトル”一覧を、
個別 Excel ファイルに埋め込んでいく処理プログラムを作っている。

主な処理は、

入力 Excel ファイルは、pandas で読み込んで、データフレームにする。
このデータフレームの行単位で、
出力 Excel ファイルに、PyAutoGUI で書き出す。

ここで、全てが1バイト文字(ANK文字)では問題ないが、
2バイト文字(日本語文字)を扱うとき、
文字バケが発生する。

pyautogui.typewrite(~) は、日本語文字には使えないので、
クリップボード経由で send することにした。


原因を究明する為に、

「python string encode」検索を行った。

“Qiita”の
Python2のstr/unicodeとencode/decode

  はじめに
  Python2の文字列はややこしい。

  用語
  そもそもPythonに限らず、文字コード関連の話はややこしい。
  これはたぶん用語の使い方が人によって違うから。
  ここではまつもとゆきひろ コードの世界に載ってる次の定義に従う。

  ・・・・・
  ・・・・・

  2種類の文字列
  Python2には文字列が2種類ある。
  ここではその2つを str文字列 および unicode文字列 と呼び、
  これらをまとめて 文字列 と呼ぶ。
  公式ドキュメントでも用語があまり統一されていないので、
  とりあえずこう呼ぶことにする。

  先に言っておくと、基本的にunicode文字列を使うべき。

  str文字列
  ・'...' リテラルで生成されるオブジェクト
  ・UTF-8, Shift-JISなどの符号化方式によって各文字を符号化して得られる
   バイトを並べたもの
  ・1文字が複数バイトで表現されることもある
  ・str文字列そのものは、符号化に使われた符号化方式の情報をもたない
  ・符号化方式を知るには基本的に片っ端から試すらしい
  ・対話環境で 'あいう' と入力すると、 \x で1バイトずつ区切られたバイト列が返る

  ・・・・・
  ・・・・・

  unicode文字列
  ・u'...' リテラルで生成されるオブジェクト
  ・文字コードUCS-2上で各文字に対応する整数を並べたもの
  ・文字に対応する整数はUCS-2によって決められるため、
   符号化方式の違いを意識する必要がない
  ・対話環境で u'あいう' と入力すると、\u で1文字ずつ区切られた整数列が返る

  ・・・・・
  ・・・・・


とか、
“Cassiopeiaの日記”の
Pythonと日本語表示と文字コード、unicode 、str 、utf-8 、shift-jis

   Pythonは使いやすい覚えやすい気持ちいいとまで言う人もいる。
  たしかにその通りだと思った。
  しかし、日本語を使おうとした時に急に気持ち良くなくなる。
  そう感じたのは僕だけではないはずだ。

   ということで今日の日記のネタはPythonと日本語となりました。

  (WindowsXPにココから“Python 2.5.1 Windows installer”を
  インストールした環境でテストしています。)

  ・まずは、あなたが書いたコードはutf-8で保存する。
   そして、そのコードの先頭には以下を記入する。
# -*- coding: utf-8 -*-
  ・・・・・
  ・・・・・


とかが見つかったので、
これらで学習した。

そこで、
encodeを使ったテストプログラムで確認した。
# -*- coding: utf-8 -*-
# ======================
import win32clipboard
import pandas as pd
import pyautogui as pa

def set_clipboard( text ):
win32clipboard.OpenClipboard()
win32clipboard.EmptyClipboard()
win32clipboard.SetClipboardText( text )
win32clipboard.CloseClipboard()

def send_C_keys( text ): # clipboard 経由 Send
set_clipboard( text )
pa.hotkey( 'ctrl', 'v' )

# ----------------------

Mxls = u'hoge.xls' # 入力 Excel ファイル
Txls = u'boge.xls' # 出力 Excel ファイル

# ----------------------

df = pd.read_excel( Mxls, header=None )
MT = df.dropna(subset=[1]).reset_index(drop=True) # B列がNaNの行
nn = len(MT)

# ----------------------

pa.moveTo( 1600, 300 ); pa.click()

pa.keyDown( 'shift' ); pa.click( button='right' )
pa.keyUp( 'shift' ); pa.press( 'w' )

pa.typewrite( 'start '+Txls ); pa.press( 'enter' )
xls = False
while not xls:
xls = pa.getWindow( 'Microsoft Excel' )
xls.set_foreground()

ID = MT.iloc[0,1] # これでループ予定
id = ID[0:13] # 出力する文字列

pa.moveTo( 350, 600 ); pa.click( clicks=2 )
send_C_keys( id.encode('shift_jis') )
pa.press( 'enter' )
これで、いけそうだ。


  honyarara.encode('utf-8')
とか、
  konyarara.encode('shift_jis')

を適切に
使わないと文字バケを起こすのダった。


大変勉強になった。


本日はここまで。


Anaconda ( Python ) 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


180408,12

Anaconda 学習:PyAutoGUI 補足事項

2018-05-21 :  PCクリニック
前回(2018-05-18)の記事「Anaconda 学習:PyAutoGUI 導入」の最後に書いた、

  なお、
  この記事の最後に、

    更に複雑な自動化を試みるとpyautoguiだけでは物足りません。

     pyautoguiのみを使ったプログラムの一番のネックは、
    条件分岐ができないことにあります。
     今回の例では、ブラウザが起動して有効になるまでの時間が読めないため、
    長めにsleepせざるを得ないなどの不具合があります。
     イレギュラーが発生するとたちまち失敗してしまします。
    処理が成功したか、失敗したかのアンサーを受けることができないのです。

    それらに対応するためにはさらに本質的な自動化に踏み込まざるを得ません。
    WindowsAPIと組み合わせることで、より本質的な自動化ができそうなので、
    今度試してみます。

  とある。
  これは些か気になる事項ダ。


この内、
  ブラウザが起動して有効になるまでの時間が読めない
事に対処する方法が見つかった。

つまり、

  Cookbook example:start an app and get its window on Windows #139

を見つけた。

このコードでは、
###################

# wait for the window
while True:
window = pyautogui.getWindow("our window's title")
if window:
window.set_foreground()
break

# ...interact with the window using PyAutoGUI...

###################
といった処理がある。

つまり、
  pyautogui.getWindow
と云ったような関数がある。
と云うこと。

そこで、
「_window_win.py」の中を覗いてみた。

  def set_position(self, x, y, width, height):

  def move(self, x, y):

  def resize(self, width, height):

  def maximize(self):

  def set_foreground(self):

  def minimize(self):

  def restore(self):

  def close(self):

  def get_position(self):

  def getWindows():

  def getWindow(title, exact=False):

と云ったような関数が定義されている。


この内の getWindows 関数は、
2年前(2016-06-25)の記事「ウィンドウ・ハンドルの取得
に載せている、LuaJITのコードに相当する。

そして、
この関数を使っている getWindow 関数を使えば、
対象アプリの立ち上げを捕捉できる。

これで、
 ・Mouse Control Functions
 ・Keyboard Control Functions
に並ぶ、
 ・Window Control Functions(と云って良いのかな)
が揃っている。
と云うことになる。


PyAutoGUI 学習は続く。


本日はここまで。


Anaconda ( Python ) 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


180410

Anaconda 学習:PyAutoGUI 導入

2018-05-18 :  PCクリニック
前(2018-05-16)の記事「Anaconda 学習:PyAutoGUI パッケージ」に従って?
PyAutoGUIを導入することにした。

“Anaconda Cloud”では、
conda-forge / packages / pyautogui 0.9.36」から、

  conda install -c conda-forge pyautogui

でインストール。


初めに、
    conda は、4.4.9 だが、4.5.0 有るヨ。
と出たが、
取り敢えず先に進めた。


6ヶダウンロードして、

新規6ヶインストール。
そして、conda は、4.4.9 から、4.3.34 にDOWNGRADE

更に、インストールの終段で、
  「バッチアイルが見つかりません。」
と出たが、終わらせた。

結果、8ヶ追加されて、256 パッケージとなった:
  pip が2つ入っている。追加されたのは、9.0.3
  そして、tinycc も追加されている。


しかし、
先日(2018-05-02)の記事「Tiny C compiler:64-bit 版」の時、
tinycc を、pip でインストールしていた。
この時、リストを出力していなかった。

と云うことで、当時2ヶ追加されて 250 パッケージとなっていた?

今回は、6ヶ追加され、その結果 256 パッケージとなった。



ここで、

  conda update conda

で、4.5.0 にアップデートした。


テスト=動作確認は、・・・・・

前回記事の最後に載せた:
  PyAutoGui 使い方まとめ - サラリーマンがハッカーを真剣に目指す
の、最後に載っている、
  【関連記事】
  PyAutoGUIの具体的な使用例
にある、
PyAutoGUIでgoogle検索を自動化
に依ると、

対象アプリの起動は、
pyautogui.press('win') #windowsキーを押す。
time.sleep(1)
pyautogui.typewrite('microsoft edge')
pyautogui.press('enter') #ブラウザ起動
time.sleep(4)

pyautogui.moveTo(420, 420) #検索のテキストボックスにカーソル移動
pyautogui.click()
time.sleep(4)
pyautogui.typewrite('pyautogui')
pyautogui.press('enter')
と云った感じ?

そこで、<紙>流に1本作った:
# -*- coding: utf-8 -*-

import time as tm
import pyautogui as pa

pa.press( 'win' ) # windowsキーを押す。
pa.press( 'kanji' ) # 半角/全角キーを押す。
pa.typewrite( 'ichitarou' )
pa.press( 'space' ) # 全角に変換

tm.sleep(1)
pa.press( 'enter' ) # 変換確定
pa.press( 'enter' ) # 実行

tm.sleep(5) # 一太郎立ち上がり待ち

tm.sleep(3) # 一太郎に対する処理:ダミー

pa.hotkey( 'alt', 'F4' ) # 一太郎終了
と云うことで、
実行OK


なお、
(参照した)記事の最後に、

  更に複雑な自動化を試みるとpyautoguiだけでは物足りません。

   pyautoguiのみを使ったプログラムの一番のネックは、
  条件分岐ができないことにあります。
   今回の例では、ブラウザが起動して有効になるまでの時間が読めないため、
  長めにsleepせざるを得ないなどの不具合があります。
   イレギュラーが発生するとたちまち失敗してしまします。
  処理が成功したか、失敗したかのアンサーを受けることができないのです。

  それらに対応するためにはさらに本質的な自動化に踏み込まざるを得ません。
  WindowsAPIと組み合わせることで、より本質的な自動化ができそうなので、
  今度試してみます。

とある。
これは些か気になる事項ダ。


本格的な PyAutoGUI の学習ダ!


本日はここまで。


Anaconda ( Python ) 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


180407

Anaconda 学習:PyAutoGUI パッケージ

2018-05-16 :  PCクリニック
当ブログ内、「sendkey」で検索すると、
 ・2016/11/06 : afxLua / winman は、Python の win32com に匹敵
 ・2016/08/30 : NYAOS:Execメソッド使用
 ・2016/08/28 : マウス・カーソルの制御(2)
 ・2016/08/26 : NYAOS で“メモ帳”操作(改)
 ・2016/08/24 : NYAOS で“メモ帳”操作
 ・2016/07/11 : ウィンドウ・ハンドル関連関数群定義
 ・2016/07/10 : キー入力エミュレーション関数群定義
 ・2016/06/25 : ウィンドウ・ハンドルの取得
 ・2016/06/20 : “SendKeys”もどき
 ・2016/06/17 : LuaCOM 代替:VBScript 利用
 ・2015/05/29 : Python 学習:pywinauto パッケージ
 ・2015/05/11 : Python 学習:win32com 関連サイト
 ・2015/05/09 : Python 学習:win32com で、notepad 操作
等々が見つかる。

改めて、Web検索を行ってみると、・・・・・


How to send SendKeys to Windows form in python script?
が見つかる。
使用するツールは、
pywinauto”ですか。


次に、「Python code to automate desktop activities in windows
が見つかった。

回答[14]では「Sikuli」で、“linux-64”版のみ。

回答[6]では「ctypes」ですか。

回答[5]では「Automa」と云う有償ソフト。

回答[0]は、
  You can use PyAutoGUI which provide a cross-platform
  Python way to perform GUI automation.

  Mouse Control
  Here is a simple code to move the mouse to the middle of the screen:
import pyautogui
screenWidth, screenHeight = pyautogui.size()
pyautogui.moveTo(screenWidth / 2, screenHeight / 2)
   Related question: Controlling mouse with Python.

  Keyboard Control
  Example:
pyautogui.typewrite('Hello world!')                 # prints out "Hello world!" instantly
pyautogui.typewrite('Hello world!', interval=0.25) # prints out "Hello world!" with a quarter second delay after each character
  Message Box Functions
  It provides JavaScript-style message boxes.

  And other.

  For other suggestions, check: Python GUI automation library ・・・


この“PyAutoGUI”は、「conda」に“win-64”版がある。


それで、
ドキュメントサイトにある:
  The source is available on: https://github.com/asweigart/pyautogui
を見てみた。


取り敢えず、
  pyautogui フォルダにある9つのファイルの中から、
  ~_java.py、 ~_osx.py、 ~_x11.py の3ファイルを除く、
  6ファイルをコピー&ペースト
して、・・・・・

ドキュメントサイトの、
  Introduction / Purpose
にある、3行:
import pyautogui
screenWidth, screenHeight = pyautogui.size()
pyautogui.moveTo(screenWidth / 2, screenHeight / 2)
で実行したら、
上記6ファイルの内3つについて ~.pyc が出来た。


ドキュメントには、
 ・Keyboard Control Functions
 ・KEYBOARD_KEYS
等々が載っており、

  pyautogui.press( 'kanji' )

としたら、ひらがな入力モードになった。


日本語の利用例記事を捜した:

PyAutoGUIでマウス操作などのGUI操作する方法 - 白猫学生のブログ

GUI自動化ライブラリの使い方のまとめと利用例[Python] - もりとにーのブログ

PyAutoGui 使い方まとめ - サラリーマンがハッカーを真剣に目指す

と云った処かな?


PyAutoGUI の学習ダ! 頑張ろう?


本日はここまで。


Anaconda ( Python ) 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


180406

Anaconda 学習:XML ファイル・アクセス

2018-05-14 :  PCクリニック
ふとしたことから、
XML ( eXtensible Markup Language ) 文書を扱うには?
と思い付き、

検索してみた。

“DrunkBoarder / yuki_B's web site”の、
pythonでxml処理(lxml使い方まとめ)
を見つけた。

  Pythonでxmlを取り扱う際には「lxml」を使うのが便利です.
  ただ使い方になれるまでは何かと引っかかる事も多くやっかいなので,
  ここで簡単にまとめておこうと思います.

  xmlを読み込む
  まず,xmlを読み込むには
from lxml import etree
root = etree.XML(string) #stringは文字列
  によりstringからXMLElementクラスのインスタンスを生成します.
  ・・・・・
  ・・・・・


なになに、lxmlを使う。

これ、Anaconda では、標準で入っていた。


早速使ってみようと、
何かサンプルデータを探した。

サンプル XML ファイル (books.xml)

  次の XML ファイルは、さまざまなサンプル全体で、・・・で使用されます。
  ・・・・・
  ・・・・・

これが良いかな?


そして、
Python 2.7.14 ドキュメント”の、
19.7. xml.etree.ElementTree - ElementTree XML API
と、“DrunkBoarder”を参考にして、
1本作ってみた:
# -*- coding: utf-8 -*-

f = open( 'books.xml' )
data1 = f.read() # ファイル全てを読んだデータ
f.close()

from lxml import etree
root = etree.XML( data1 ) # XMLElementクラスのインスタンス

for children in root:
print( children.tag )

print
for child in root[0]:
print( child.tag )
では?


実行結果:

最初の print ループでは、12ヶとも「book」

2番目の print ループでは、
 「author」
 「title」
 「genre」
 「price」
 「publish_date」
 「description」
とでた。


もっと、lxml を学習しよう。


本日はここまで。


Anaconda ( Python ) 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


180405

Anaconda 学習:pandas で、Excel ファイル・アクセス

2018-05-11 :  PCクリニック
前(2018-05-09)の記事「Anaconda 学習:Excel ファイル・アクセス」の後で、
更なる、日本語の記事を見つけた:
“Qiita”の、
pythonでexcelファイル処理まとめ

  はじめに

  pandasを使ってインデックスとカラムが整理されていない
  excelファイルの処理をする機会があったので、その方法をまとめます。
  excelを処理する方法としてopenpyxlなんてのもありますが、
  .xlsファイルを読み込めなかったり、
  結局DataFrameの方が処理しやすいのでpandasを使用しています。

  ・・・・・
  ・・・・・

とある。

つまり、
前回記事の openpyxl よりも、pandasを使用する方が良い?


“ねこゆきのメモ”の、
データフレーム/dataframeの要素へのアクセス方法。いくつか。

  要素へのアクセス方法いろいろ。
df[col]          #columnsで選択
df.loc[label] #index/columns(名)で選択
df.iloc[loc] #index/columns(番号)で選択
df[5: 10] #スライス(行のスライス)
df[bool_vec] #boolean vectorで選択
import pandas as pd
df = pd.read_csv(args[0]).fillna('').astype(str)
  ・・・・・
  ・・・・・

とか、

“pandas 0.22.0 documentation”の、
API Reference

  This page gives an overview of all public pandas objects,
  functions and methods.
  In general, all classes and functions exposed in the top-level
  pandas.* namespace are regarded as public.

===

  このページでは、すべてのパブリック pandas オブジェクト、
  機能、メソッドの概要を示します。
   一般に、トップレベルの pandas.* 名前空間に公開されている
  すべてのクラスと関数は public とみなされます。

とかを参考にして、

“Qiita”の“ファイル読み込み”のコードを流用。

# -*- coding: utf-8 -*-
# test_pandas_xls.py
import pandas as pd

file = pd.ExcelFile( u'テスト.xls' )
df = file.parse( 'Sheet1', header=None )
で、(旧?).xlsファイルが読み込めた。

空のセルはNanとなっており、
矩形(長方形)のデータフレーム(行列)ですね。

要素のアクセスは、

  A1 = df.iloc[ 0, 0 ]

とか、

  C11 = df.iloc[ 10, 2 ]

ですね。


それで、ファイル出力は?
# -*- coding: utf-8 -*-
# test_pd_out_xls.py
import pandas as pd

file2 = pd.ExcelFile( u'テスト.xls' )
df2 = file.parse( 'Sheet1', header=None )

df2.iloc[2,2] = u'追加:' + C11
df2.to_excel( u'テスト2.xls' )
としてみた。

此では駄目ダ。

   A列と、0(ゼロ)行に、
   余計なモノが付加される!!!

“これはイラナイ”よ、と指定するには???



本日はここまで。


Anaconda ( Python ) 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


180404

Anaconda 学習:Excel ファイル・アクセス

2018-05-09 :  PCクリニック
当ブログ内、「Python Excel アクセス」で検索すると、
以下の5件が見つかる。
 ・2016/11/07 : Lua 学習: xls ファイル・アクセス
 ・2015/05/06 : Python 学習:win32com モジュール
 ・2014/06/19 : Python 学習:CSV ファイル・アクセス
 ・2014/06/17 : EXCEL で Python
 ・2014/06/16 : Python 学習: xls ファイル・アクセス

だが、
実質、一番古い、
4年前(2014-06-16)の記事「Python 学習: xls ファイル・アクセス」の、
1件だけ。

現在の“Anaconda”ではどうか?

Anaconda 5.0.1Windows 版 Python 2.7.14 ( 64bit 版 )
に含まれるパッケージ:
Packages for 64-bit Windows with Python 2.7
を見ると、

  openpyxl、xlsxwriter、xlrd/xlwt

などが、デフォルトでインストールされている。

「xlrd/xlwt」については、上記4年前の記事の如し。
「xlsxwriter」は、“xlsx”の書き出しモジュール?
「openpyxl」については、上記4年前の記事ではパスしていた。

そこで、「openpyxl」を学習した。

“openpyxl 2.5.0 documentation”の、
openpyxl - A Python library to read/write Excel 2010 xlsx/xlsm files

  Introduction

  Openpyxl is a Python library for reading and writing Excel 2010
  xlsx/xlsm/xltx/xltm files.

  It was born from lack of existing library to read/write natively
  from Python the Office Open XML format.

  All kudos to the PHPExcel team as openpyxl was
  initially based on PHPExcel.

===

  前書き

  Openpyxlは、Excel 2010 xlsx / xlsm / xltx / xltmファイルを
  読み書きするためのPythonライブラリです。

  これは、PythonからOffice Open XMLフォーマットをネイティブに
  読み書きする既存のライブラリがないことから生まれました。

  openpyxlとしてのPHPExcelチームへの功績は、
  当初はPHPExcelに基づいていました。


このサイトのSample code:を、(1箇所変更して)
「test_openpyxl.py」と云う名前で作った。
# -*- coding: utf-8 -*-

from openpyxl import Workbook
wb = Workbook()

# grab the active worksheet
ws = wb.active

# Data can be assigned directly to cells
ws['A1'] = '紙'

# Rows can also be appended
ws.append([1, 2, 3])

# Python types will automatically be converted
import datetime
ws['A2'] = datetime.datetime.now()

# Save the file
wb.save("sample.xlsx")
これで?
チャント、“sample.xlsx”ファイルが出来た。


日本語のサイトとしては、
“Qiita”の、
pythonのopenpyxlの使い方メモ
かな?


本日はここまで。


Anaconda ( Python ) 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


180403

Anaconda 学習:tcc(libtcc)利用雛形

2018-05-07 :  PCクリニック
前回(2018-05-04)の記事:
tcc 学習:libtcc 利用法」で書いたコードを、
1月(2018-01-24)の記事「Anaconda 学習:見た目の前方参照(素直に)?
で書いた方式で書き直してみた。


# -*- coding: utf-8 -*-
# use_libtcc.py
import sys
import ctypes as ct

# ========== 処理本体 ==============
def main(): # =======
init_tcc()
tcc_comp( ST ) # ==== ST の定義は下記
Add = ct.CFUNCTYPE( ct.c_double, ct.c_int, ct.c_int ) \
( tcc.tcc_get_symbol( TCC, 'Add' ) )

z = Add( 2, 5 )
print z + Add( 10, 20 )

_=raw_input() # 開発期間中
end_tcc() # これ無くても良いかナ?
sys.exit() # 無くてもイイでしょう

#===== TCC サブ定義 =====
ST='''
double Add( int x, int y ){
return x + y;
}
'''

# =============================
def init_tcc():
global tcc, TCC
tcc = ct.CDLL( '../tcc/libtcc' ) # 開発期間中
TCC = tcc.tcc_new()
tcc.tcc_set_output_type( TCC, 1 )

def tcc_comp( CC ):
tcc.tcc_compile_string( TCC, CC )
tcc.tcc_relocate( TCC, ct.c_void_p(1) )

def end_tcc():
tcc.tcc_delete(TCC)

main() # if __name__ == '__main__': main() の代わり
こうでしょうか



本日はここまで。


Anaconda ( Python ) 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


180403

tcc 学習:libtcc 利用法

2018-05-04 :  PCクリニック
libtcc 利用法の前に、

前回(2018-05-02)の記事「Tiny C compiler:64-bit 版」で原因が分からなかった、
64ビットモードコンパイルの件

原因が判明した。


環境変数pathのみに気を取られていた。
つまり、システム環境変数しか頭になかった。

実は、もう一つの方のkami のユーザー環境変数もあった。

現在のメインPCの初期設定時で、
「C_INCLUDE_PATH」「CPLUS_INCLUDE_PATH」「LIBRARY_PATH」
の3つの変数を定義していた。
これらは、“MinGW”用だった。


従って、今となっては、この3つを削除した。

これで、“tcc.exe”への Path を追加定義するだけで、
( 64ビットコンパイラを使っているので )
キチンと、64ビットモードの「.exe」や「.dll」が作られた。



さて、本題のlibtcc 利用

昨年(2017-05-24)の記事「Python & tcc 学習:libtcc 直接使用」で書いたコード:
# -*- coding: utf-8 -*-
# ---------- use_libtcc.py -----
import ctypes as ct
tcc = ct.CDLL( 'libtcc' )

ST=''' int Add( int x, int y ){
return x + y;
}
'''
relocate_auto = ct.c_void_p(1)

TCL = tcc.tcc_new();
z = tcc.tcc_set_output_type( TCL, 0 );

z = tcc.tcc_compile_string( TCL, ST );
tcc.tcc_relocate( TCL, relocate_auto )

Add_proto = ct.CFUNCTYPE( ct.c_int, ct.c_int, ct.c_int )
Add = Add_proto( tcc.tcc_get_symbol( TCL, 'Add' ) )
# ------------------

z = Add( 2, 5 )
print( z )

# ------------------
tcc.tcc_delete(TCL)
_=raw_input()
でOK?


ダメ???

“libtcc”フォルダにある、「libtcc.h」を見ると、
/*    ・・・・・
・・・・・ */
/* set output type. MUST BE CALLED before any compilation */
LIBTCCAPI int tcc_set_output_type(TCCState *s, int output_type);
#define TCC_OUTPUT_MEMORY 1 /* output will be run in memory (default) */
#define TCC_OUTPUT_EXE 2 /* executable file */
#define TCC_OUTPUT_DLL 3 /* dynamic library */
#define TCC_OUTPUT_OBJ 4 /* object file */
#define TCC_OUTPUT_PREPROCESS 5 /* only preprocess (used internally) */
/* ・・・・・
・・・・・ */
となっていた。

と云うことは、
上記コードの赤文字の行は、
z = tcc.tcc_set_output_type( TCL, 1 );
とすべきですネ。


これで、
64ビットモードでも、libtccが使える。


本日はここまで。


Anaconda ( Python ) 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


180329

Tiny C compiler:64-bit 版

2018-05-02 :  PCクリニック
ふと思いついた:
64ビット版の tcc( Tiny C compiler )は無いのか?

そこで、
「tcc x64」と検索してみた。

The MASM Forum”の、
Tiny C compiler」が見つかった。


1番目は、June 01, 2013, 08:59:31 PM の、
  New release V0.9.26 on Feb 15, 2013 :

  http://bellard.org/tcc/


2番目は、June 02, 2013, 09:10:56 AM の、
  Thank you.
  I don't know how I missed it.
  I've been playing with .9.25 for ages. And 64bit too?

  Have you done any work with either the 32 or 64 bit??


そして、
3番目は、June 02, 2013, 05:05:55 PM の、
  Hi James,

  The 64-bit version is available :

  ・・・/releases/tinycc/tcc-0.9.26-win64-bin.zip

  I didn't play much with this compiler but ・・・


等とある。


3番目のリンク先では、
クリック即ダウンロードですネ。

だが、
1番目(のアナウンス)のリンク先を見たが、・・・
それらしいことが書いてない。

しかし、
この(本家サイト?)の、
Download”リンク先には、

 「tcc-0.9.27-win64-bin.zip」 478K  17-Dec-2017 08:27

もあった。


早速、
「tcc-0.9.27-win64-bin.zip」をダウンロードして、

作業場所(X)を作り、
そこに展開した:(X/tcc/ 以下5Dirと3ファイル)


テストで、1本作ってコンパイルしてみた。
昨年(2017-05-05)の記事「tcc 学習:同梱例題その他」にある、
「fib.c」に対して、

DOS窓で、
set path="./tcc"
tcc fib.c
として、fib.exe を作った。

だが、
fib  50
として、実行中の“プロセス”を見ると
何故???だか 32 ビットモードで動いている???


-----


原因究明の過程で、
tinycc 1.1」を見つけた。

  TinyCC compiler bundle for windows

   TinyCC (or tcc) is a small, fast C compiler capable of compiling
  python extensions that can be loaded as python modules or
  producing DLLs that can be loaded via ctypes.
   This version includes compilers for 32-bit and 64-bit Windows.
  MacOS and Linux are not supported in this release.

  Compiler version: 0.9.26 2013-02-16

  ・・・・・
  ・・・・・

===

  ウィンドウ用のTinyCCコンパイラバンドル

   TinyCC(またはtcc)は、pythonモジュールとしてロードするか、
  ctypes経由でロード可能なDLLを生成するPython拡張モジュールを
  コンパイルすることができる小型で高速なCコンパイラです。
   このバージョンには、32ビットおよび64ビットWindows用の
  コンパイラが含まれています。
  MacOSとLinuxはこのリリースではサポートされていません。

  コンパイラのバージョン:0.9.26 2013-02-16

  ・・・・・
  ・・・・・


こちらは、バージョン 0.9.26 と古いものだが、
取り敢えずダウンロードした。
「tinycc-1.1.tar.gz」 533KB  2017/11/22 付

で、conda では見つからないので、
pipでインストール:

  pip install tinycc

これで、1つ、Package が追加された。

ここで、
  pip は、9.0.1 を使っているが、pip 9.0.3 があるヨ。
とでた。

序でにアップグレードした:

  python -m pip install --upgrade pip

そして、
サンプル:fib.c
に対して、
import subprocess
from tinycc import TCC

subprocess.call( 'TCC fib.c' )
subprocess.call( 'fib 30' )
とやってみた。

でも、この .exe も、32bitモード!?


原因究明は続く。


本日はここまで。


Anaconda ( Python ) 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


180328

Anaconda 学習:Python 2.7.14 日本語ドキュメント

2018-04-30 :  PCクリニック

Python のドキュメントについては、
例えば、
今年1月22日の記事「Anaconda 学習:leap year ( 閏年 ) 判定」では、

  ・・・・・
  ・・・・・
  Python > Python 2.7.14 documentation
   The Python Standard Library > 8. Data Types >
    8.2. calendar - General calendar-related functions

  または、

  Python > Japanese 3.6.5 > ドキュメント >
   ドキュメント > 8. データ型 >
    8.2. calendar - 一般的なカレンダーに関する関数群
  ・・・・・
  ・・・・・

の様に参照していた。

つまり、
正確を期すために、Python 2.7.14 ドキュメントは英語版(原本)を参照し、
一方、
理解し易い様に、Python 3.6.5 日本語(訳)ドキュメントを参照していた。

これは、日本語ドキュメントは、Python 3 の方にはあったが、
Python 2.7 には無かったから。


しかし、
偶然に、Python 2.7.14 日本語ドキュメントを見つけた。

これですね:
Python 2.7.14 ドキュメント



これからは、枕を高くして寝ることができる。
つまり、参照するドキュメントは1つダケで良い。


本日はここまで。


Anaconda ( Python ) 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


180321

Python4PLY:Python parser for the Python language

2018-04-27 :  PCクリニック
前(2018-04-25)の記事:
Anaconda 学習:PLY ( Python Lex-Yacc )」に関連して、
python4ply tutorial」なるページを見つけた。

  What is it python4ply?

  python4ply is a Python parser for the Python language.
  The grammar definition uses PLY,
   a parser system for Python modelled on yacc/lex.
  The parser rules use the "compiler" module from the standard library
   to build a Python AST and to generate byte code for .pyc file.

  You might use python4ply to experiment with variations
   in the Python language.
  The PLY-based lexer and parser are much easier to change than
   the C implementation Python itself uses or even the ones written
   in Python which are part of the standard library.
  This tutorial walks through examples of how to make changes
   in different levels of the system.

  If you only want access to Python's normal AST, which includes
   line numbers and byte position for the code fragements,
   you should use the _ast module.

===

  python4ply とは?

  python4plyは、Python言語用のPythonパーサーです。
  文法の定義では、yacc / lexをモデルにしたPythonの
   パーサーシステムPLYを使用します。
  パーサー規則では、標準ライブラリの "compiler"モジュールを使用して
   Python ASTを構築し、.pycファイル用のバイトコードを生成します。

  python4plyを使用して、Python言語のバリエーションを
   試すことができます。
  PLYベースのレクサーとパーサは、Python自体のC実装よりも
   はるかに簡単です。標準ライブラリの一部であるPythonで
   書かれたものでもあります。
  このチュートリアルでは、システムのさまざまなレベルを変更する
   方法の例を説明します。

  Pythonの通常のAST(コードの断片の行番号とバイト位置を含む)
   にのみアクセスしたい場合は、_astモジュールを
   使用する必要があります。

  ・・・・・
  ・・・・・


これは面白い。

即行、python4ply に飛んだ。


  Perlの様な、
  アンダーバーで桁区切り表現が出来るようにする。

  それができることのアイデアを得るために、
  チュートリアルのいくつかの例を以下に示します。


とあった。


何はともあれ、ダウンロードした。

  Links
   ・Download python4ply-1.0.tar.gz

リンクから、
「python4ply-1.0.tar.gz」 250KB 2008/03/09 付

何処かに、
テストフォルダ hoge を作り、
そこに、python4ply-1.0 フォルダを作り
その中に展開した12ファイルを格納した。

それから、
hoge で、最初の tutorial ページの Getting started
owe_me.py:2行だけのファイルを作った。

DOS窓で、

  set path=%path%;./python4ply-1.0
  compile.py owe_me.py

とコンパイルして「owe_me.pyc」を作り、

  python -c "import owe_me"

で、実行。

これはOK。


続けて、
アンダーバーを追記した2行だけのファイル:owe_me.py を作り、

“python_lex.py”を2箇所変更して、置き換え、

DOS窓で、

  set path=%path%;./python4ply-1.0
  compile.py -e owe_me.py

で、コンパイル&実行 ( .pyc を残さない )

これもOK.



10年前の代物:python4ply だが、

もう少し学習してみよう。



本日はここまで。


Anaconda ( Python ) 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


180318

Anaconda 学習:PLY ( Python Lex-Yacc )

2018-04-25 :  PCクリニック
ふと、Python でマクロ処理が出来ないのか?

と云うことで、

「Python macro statement」と検索してみた。

“stackoverflow”の
Implementation of a C pre-processor in Python or JavaScript?
が見つかった。これ、そのものズバリの質問。

で、
[13]の最終段では、

 The PLY (Python Lex and Yacc) tools include a cpp implemented in Python.

また、
回答[6]では、

 Check out PLY, an implementation of Lex and Yacc on Python which ・・・


面白そうなので、見に行ってみた。

GitHub の、
dabeaz/ply
  Python Lex-Yacc http://www.dabeaz.com/ply/index.html

で、このリンク先は:
PLY (Python Lex-Yacc)
ですね。


Anaconda では、どうなっているのか?

  ply 3.10 がデフォルトで入っている。

ドキュメントサイトは、

  PLY (Python Lex-Yacc)


そして、
最初のdabeaz/plyの example / calc フォルダにある、
「calc.py」プログラムをコピー&ペーストして、テスト実行。

動きますね。

変数が使え、括弧の処理もある、計算機(言語仕様)を自作する。


そこで、Lex、Yacc について学習。


元々は?
プログラミング言語を作る/yaccとlex

  Cでプログラミング言語の処理系を実装するのであれば、
  多くの場合、yaccとlexというツールを使います。

  実のところ、Cとyacc/lexで簡単なプログラミング言語を作る、
  というのは、以前、「C言語ヨタ話 」で書いた「 電卓を作ってみよう」
  の焼き直しになります。yaccとlexの説明もそちらに簡単に書いたので、
  そちらを見てください――と言いたいところですが、まあここでも軽く
  説明します。 内容的には重複、というかコピペしている部分もありますが。
   プログラミング言語の処理系は、通常、以下のような手順を取ります。

  字句解析
    ソースプログラムを、「字句(トークン)」の並びに分割する処理です。
  構文解析
    トークンの並びから、解析木を構築する処理です。

  この後、Cなどの機械語を吐くコンパイラや Javaのようなバイトコードを
  吐くコンパイラなら、 「コード生成」という処理が入りますが、
  今回は、解析木を作ったらそのまま実行しますから、
  コード生成の処理は入りません。
   たとえば、前述の以下のようなソースについて、

    ・・・・・
    ・・・・・

  字句解析を行なうと、以下のようなトークンに分割されます
  (この箱ひとつひとつがトークンです)。

    ・・・・・
    ・・・・・

  これを構文解析して解析木を構築すると、以下のようになります。

    ・・・・・
    ・・・・・

  字句解析を行なうプログラムのことを、
  レキシカルアナライザ(lexical analyzer) と呼びますが、
  これを自動生成してくれるのがlexです。

  また、前述のように、構文解析を行なうプログラムのことを
  パーサ(parser)と呼びます。
  yaccはこれを自動生成してくれるプログラムです。

  yacc, lexともに、それ専用の定義ファイルを入力とし、
  Cのソースを出力します。

  ・・・・・
  ・・・・・



Python のPLY については、

Python PLY - MyMemoWiki

  Pure Pythonによる、lex および yacc の実装

  PLYは、lex.py および yacc.py の 2つのモジュールを
   ply パッケージに含んでいる。

  2つのツールは協調して作業を行う

  lex.py
  モジュールは入力されたテキストを 正規表現により定義された
   字句のコレクションに分解する。
  次の有効なトークンを入力ストリームから返す、token()関数を、
   外部にインターフェースとして提供する。

  yacc.py
  自由文法として定義された言語の構文を評価する。
  LR で解析を行い、LALR(1) (デフォルト) もしくは
   SLR アルゴリズムでパースする。
  lex.py の token()を繰り返し呼び出し、トークンを参照し、
   文法ルールを呼び出す。
  出力は、大抵、抽象構文木(AST)となる。



本日はここまで。


Anaconda ( Python ) 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


180316

Anaconda 学習:PyQt5 版コードできた

2018-04-23 :  PCクリニック
前(2018-04-20)の記事「Anaconda 学習:GUI アプリ開発は PyQt5 で」で、
PyQt4 から、PyQt5 へのコンバージョンポイントが見えてきたので、

3年前(2015-03-15)の記事「Python 学習:GUI アプリ は PyQt4 に決め」で書いた、

出力ファイル=変換結果 を書き直してみた。

以下再掲(要変更部分は赤文字):
# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtGui, QtCore
class MainW( QtGui.QWidget ):
s=''; f=''
def __init__( self ):
super( MainW, self ).__init__()
self.initUI()
def initUI( self ):
self.Lbl1=QtGui.QLabel( 'File_Name:', self )
self.Lbl1.move( 10, 10 )
self.Lbl2=QtGui.QLabel( '?', self )
self.Lbl2.move( 75, 10 )
self.Ent1=QtGui.QLineEdit( '', self )
self.Ent1.move( 10, 40 )
self.Ent1.textChanged[str].connect( self.Ent1Changed )
self.Lbl3=QtGui.QLabel( '', self )
self.Lbl3.move( 10, 70 )
self.Btn1=QtGui.QPushButton( 'Go?', self )
self.Btn1.move( 40, 110 )
QtCore.QObject.connect( self.Btn1, QtCore.SIGNAL("clicked()"), self.Btn1Clicked )
self.setWindowTitle( <窓のタイトル> )
self.setGeometry( 200, 200, 600, 400 )
self.setAcceptDrops( True )
def dragEnterEvent( self, e ):
if e.mimeData().hasUrls(): e.accept()
else: e.ignore()
def dropEvent( self, e ):
files = [ unicode( u.toLocalFile() ) for u in e.mimeData().urls() ]
for ff in files:
self.f = ff
self.Lbl2.setText( ff )
self.Lbl2.adjustSize()

def Ent1Changed( self, text ):
self.s = text

def Btn1Clicked( self ):
self.Lbl3.setText( self.s + self.f )
self.Lbl3.adjustSize()

app=QtGui.QApplication( sys.argv )
w=MainW(); w.show()
sys.exit( app.exec_() )
これに対して、赤文字部分を以下の様に変更:
# -*- coding: utf-8 -*-
import sys
from PyQt5 import QtWidgets
class MainW( QtWidgets.QWidget ):
sss=''; f=''
def __init__( self ):
super( MainW, self ).__init__()
self.initUI()
def initUI( self ):
self.Lbl1=QtWidgets.QLabel( 'File_Name:', self )
self.Lbl1.move( 10, 10 )
self.Lbl2=QtWidgets.QLabel( '?', self )
self.Lbl2.move( 75, 10 )
self.Ent1=QtWidgets.QLineEdit( '', self )
self.Ent1.move( 10, 40 )
self.Ent1.textChanged[str].connect( self.Ent1Changed )
self.Lbl3=QtWidgets.QLabel( '', self )
self.Lbl3.move( 10, 70 )
self.Btn1=QtWidgets.QPushButton( 'Go?', self )
self.Btn1.move( 40, 110 )
self.Btn1.clicked.connect( self.Btn1Clicked )
self.setWindowTitle( <窓のタイトル> )
self.setGeometry( 200, 200, 600, 400 )
self.setAcceptDrops( True )
def dragEnterEvent( self, e ):
if e.mimeData().hasUrls(): e.accept()
else: e.ignore()
def dropEvent( self, e ):
files = [ unicode( u.toLocalFile() ) for u in e.mimeData().urls() ]
for ff in files:
self.f = ff
self.Lbl2.setText( ff ) ### ; print ff
self.Lbl2.adjustSize()

def Ent1Changed( self, text ):
self.sss = text

def Btn1Clicked( self ):
self.Lbl3.setText( self.sss + self.f )
self.Lbl3.adjustSize()

app=QtWidgets.QApplication( sys.argv )
w=MainW(); w.show()
sys.exit( app.exec_() )
と云うことで、移植できた。



本日はここまで。


Anaconda ( Python ) 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


180314

Anaconda 学習:GUI アプリ開発は PyQt5 で

2018-04-20 :  PCクリニック
前(2018-04-18)の記事「Anaconda 学習:GUI アプリ開発は Tkinter で?」で、
一旦は、決めていた。

がやはり、温故知新で、・・・・・

過去記事:
Python 学習:wxPython で GUI アプリ」2015-03-09 付

Python 学習:PyQt4 で GUI アプリ」2015-03-12 付

Python 学習:GUI アプリ は PyQt4 に決め」2015-03-15 付

の後追い。

取り敢えず、
3年前(2015-07-09)の記事「Python 学習:PyQt4 で GUI アプリ(2)」で
  ・・・・・
  ・・・・・
  以下のようなテキスト・ファイルを入力として、
  “PyQt4”のプロフラムを出力する。
  コンバータを作った。
  /Lbl  Lbl1, 'File_Name:', ( 10, 10 )
/Lbl Lbl2, '?', ( 75, 10 )

/Ent Ent1, '', ( 10, 40 ), Ent1Changed
/Lbl Lbl3, '', ( 10, 70 )
/Btn Btn1, 'Go?', ( 40, 110 ), Btn1Clicked
  ・・・・・
  ・・・・・
と書いているコンバータを引っ張り出してきた。


だが、当時は「PyQt4」だったが、
今の Anaconda に含まれている“pyqt”は「PyQt5」ダ。

「Differences Between PyQt4 and PyQt5」の抄訳 - 明日から本気だす
  PyQt使ってみたかったけど、ver.4とver.5で違いが結構あるぽいので
  Differences Between PyQt4 and PyQt5 - PyQt 5.2.1 Reference Guide
  を抄訳してみた。

  なにか変なところがあったら教えてくだちい。

  PyQt4とPyQt5の違い
  PyQt5とPyQt4は、互換性がありません(が、PyQt4からPyQt5へのアプリ
  ケーションの移植は難しいことではないと言えます)。
  このセクションでは、PyQt5とPyQt4の間の主要な違いについて説明します。

  ・・・・・
  ・・・・・

ということで、若干修正が必要ダ。


それで、
【PythonでGUI】PyQt5 -ドラッグ&ドロップ- - Qiita
のコードで学習した。
(修正点が分かった?)

####################
# QPushButtonを継承
class Button(QPushButton):

def __init__(self, title, parent):
super().__init__(title, parent)
の「super().__init・・・」の部分を、
####################
# QPushButtonを継承
class Button(QPushButton):

def __init__(self, title, parent):
super(Button, self).__init__(title, parent)
の様に変更。
そして、
####################
class Example(QWidget):

def __init__(self):
super().__init__()
の「super().__init__()」の部分を、
####################
class Example(QWidget):

def __init__(self, parent=None ):
super(Example, self).__init__(parent)
の様に変更。

これで、動いた。


そうすると、
昔のコンバータは、この様なソースを生成できるように修正する。

最初の
from PyQt5.QtWidgets import (QPushButton, QWidget, 
QLineEdit, QApplication)
の部分も修正が必要だナ。


更なる学習が必要ダ。


本日はここまで。


Anaconda ( Python ) 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


180312

Anaconda 学習:GUI アプリ開発は Tkinter で?

2018-04-18 :  PCクリニック
先日(2018-04-11)の記事「kivy 学習:Kv ファイルを別途用意しない方法」で、

更なる、学習をしていたが、・・・・・


どうも、「kivy」についてはまだまだ学習が必要ダ。

なので、
昔の「Tkinter」に戻ってみた。
参照記事:「Tkinter:ドラッグ&ドロップ対応法


しかし、問題が1つあった。

今後使う Python は、Anaconda で しかも 64bit 版


これは簡単に、行けるのか?

「Python GUI ドラッグ&ドロップ」検索で、
1つ見つけた:
TkinterでDnDを実装するには(64bit Window版)

  TkinterでエクスプローラからDnDでファイルを受け取るアプリを作成
  してみようと思いました。

  参考サイトの内容を元にコードを作成してみましたが、残念なことに
  64bit Windows 10 ではうまく動作しません。

  Python+TkでD&D -MasaHeroの日記より
  http://d.hatena.ne.jp/MasaHero/20111201/p1

  ctypesを使って、WindowsのDDLを直接操作しています。
  32bit Windows7 にて、python 2.7 と 3.4で動作を確認しています。

  これを64bit Windowsでも動作させるにはどのように修正すればよいでしょうか?


これで学習して、
<紙>流コードを作った:
# -*- coding: utf-8 -*-

import Tkinter as tk
import ctypes, sys
from ctypes import c_long, WINFUNCTYPE
from ctypes.wintypes import HWND, UINT, WPARAM, LPARAM

WM_DROPFILES = 0x0233
GWL_WNDPROC = -4
FS_ENCODING = sys.getfilesystemencoding()
DragAcceptFiles = ctypes.windll.shell32.DragAcceptFiles
DragQueryFile = ctypes.windll.shell32.DragQueryFile
DragQueryFile.argtypes = [ ctypes.c_void_p, UINT, ctypes.c_void_p, UINT ]
DragFinish = ctypes.windll.shell32.DragFinish
DragFinish.argtypes = [ ctypes.c_void_p ]
CallWindowProc = ctypes.windll.user32.CallWindowProcW
CallWindowProc.argtypes = [ ctypes.c_void_p, HWND , UINT, WPARAM, LPARAM ]
try: SetWindowLong = ctypes.windll.user32.SetWindowLongPtrW
except AttributeError: SetWindowLong = ctypes.windll.user32.SetWindowLongW

class TkApp(tk.Frame):
dnd_interval = 600

def __init__(self, *args, **kargs):
tk.Frame.__init__(self, *args, **kargs)
self.createwidget()
self.dropnames = []
win = args[0] if args else self._root()
win = self.tw

def drop_check():
if self.dropnames:
fns = self.dropnames
self.dropnames = []
self.dnd_notify(fns)
win.after(self.dnd_interval, drop_check)

@WINFUNCTYPE(c_long, HWND, UINT, WPARAM, LPARAM)
def replace_win_proc(hwnd, msg, wp, lp):
u"""D&D用のコールバック
ファイルのドラッグアンドドロップイベント(WM_DROPFILES)を検出して、
ドロップされたファイル名を保持する。
ここでウィンドウ(tk)を使用するとハングアップするのでデータ保存だけ行う。
"""
if msg == WM_DROPFILES:
nf = DragQueryFile(wp, -1, None, 0)
buf = ctypes.c_buffer(260)
fns = [ buf.value.decode(FS_ENCODING) for nn in range(nf) \
if DragQueryFile(wp, nn , buf, ctypes.sizeof(buf)) ]
DragFinish(wp)
self.dropnames.extend(fns)
print("%s dnd_notify: %s" % (self, hwnd))
return CallWindowProc(self.org_proc, hwnd, msg, wp, lp)

def dnd_setup():
"Windowsのイベント処理のフックを定義する"
hwnd = win.winfo_id()
DragAcceptFiles(hwnd, True)

self.win_proc = replace_win_proc
self.org_proc = SetWindowLong(hwnd, GWL_WNDPROC, self.win_proc)

win.after_idle(drop_check)
print("%s dnd_setup: %s,%s" % (self, hwnd, self.org_proc))

self.pack(fill='both', expand=1)
win.after_idle(dnd_setup)

def createwidget(self):
tw = tk.Text(self, width=30,height=16)
tw.pack(fill='both', expand=1)
self.tw = tw

def dnd_notify(self, filenames):
for nn in filenames:
self.tw.insert('end',"%s\n" % nn)

if __name__ == "__main__":
a = TkApp()
if 0: TkApp(tk.Toplevel()) # 複数ウィンドウに対応
a.mainloop()
これで動いた。


よく分からないが、
これで行こうかナ?



本日はここまで。


Anaconda ( Python ) 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


180311
おきてがみ/blogram
blogram投票ボタン



おきてがみ

最新記事
カレンダー
06 | 2018/07 | 08
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
リンク
プロフィール

<紙>

Author:<紙>
ようこそ。
「パソコンヲタクの雑記帳」
もろもろなことを綴っています。
パソコン ヲタクってねくら?
画像は kami でなく kani です。

カウンター(fc2、i2i) /Google Analytics


i2i(from 2010-08-24)
Total =
Today  =  
Yesterday=
アンチエイジング

Google Analytics
ブックマーク