crossframe » Python http://crossframe.iiv.jp Windows Dev. Site Tue, 07 Nov 2023 06:31:52 +0000 ja hourly 1 https://wordpress.org/?v=3.8.41 wxPython ../../../202311051283/ ../../../202311051283/#comments Sun, 05 Nov 2023 06:21:21 +0000 ../../../?p=1283 GUIの表示方法はいろいろありますが、今回はwxPythonを試してみました。

参考)https://zetcode.com/wxpython/widgets/
環境)wxpython v4.2.1 / python v3.10.13 / Anaconda Navigator 2.4.0 / Windows 11

wxhello.py

import wx

class Example(wx.Frame):
    def __init__(self, *args, **kwargs):
        super(Example, self).__init__(*args, **kwargs)
        self.InitUI()

    def InitUI(self):
        wx.CallLater(3000, self.ShowMessage)

        pnl = wx.Panel(self)
        btn1 = wx.Button(pnl, label='Close', pos=(20, 20))
        btn1.Bind(wx.EVT_BUTTON, self.OnClose)

        btn2 = wx.Button(pnl, label='Message', pos=(20, 60))
        btn2.Bind(wx.EVT_BUTTON, self.ShowMessage2)

        self.SetSize(550, 250)
        self.SetTitle('Message box')
        self.Centre()

    def ShowMessage(self):
        wx.MessageBox('Hello!', 'Info',
            wx.OK | wx.ICON_INFORMATION)

    def ShowMessage2(self, e):
        wx.MessageBox('Hi!', 'Info',
            wx.OK | wx.ICON_INFORMATION)

    def OnClose(self, e):
        self.Close(True)

def main():
    app = wx.App()
    ex = Example(None)
    ex.Show()
    app.MainLoop()

if __name__ == '__main__':
    main()

実行

python wxhello.py

py03

py04

メッセージ表示関数を二つ用意したのは、呼び出し方によって、引数が違うからです。
メモでした。

]]>
../../../202311051283/feed/ 0
Python.NET ../../../202311051276/ ../../../202311051276/#comments Sun, 05 Nov 2023 05:12:13 +0000 ../../../?p=1276 今回は、.NET のコードをIronPythonでなくPythonから呼び出しライブラリを使用したサンプルをためしてみました。

参考)https://github.com/pythonnet/pythonnet

環境)pythonnet v3.0.3 / python v3.10.13 / Anaconda Navigator 2.4.0 / Windows 11
hello.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import clr

clr.AddReference("System.Windows.Forms")
import System.Windows.Forms as WinForms
from System.Drawing import Size, Point


class HelloApp(WinForms.Form):

    def __init__(self):
        super().__init__()
        self.Text = "Hello! From Python"
        self.AutoScaleBaseSize = Size(5, 13)
        self.ClientSize = Size(392, 217)
        h = WinForms.SystemInformation.CaptionHeight
        self.MinimumSize = Size(392, (117 + h))

        self.button = WinForms.Button()
        self.button.Location = Point(160, 64)
        self.button.Size = Size(82, 20)
        self.button.TabIndex = 2
        self.button.Text = "Click Me!"

        self.button.Click += self.button_Click

        self.textbox = WinForms.TextBox()
        self.textbox.Text = "Hello!"
        self.textbox.TabIndex = 1
        self.textbox.Size = Size(82, 40)
        self.textbox.Location = Point(160, 24)

        self.AcceptButton = self.button
        self.Controls.Add(self.button)
        self.Controls.Add(self.textbox)

    def button_Click(self, sender, args):
        WinForms.MessageBox.Show(self.textbox.Text)

    def run(self):
        WinForms.Application.Run(self)

def main():
    form = HelloApp()
    app = WinForms.Application
    app.Run(form)

if __name__ == '__main__':
    main()

実行

python hello.py

py02

Windows Form の表示とマウスクリックを確認できました。

]]>
../../../202311051276/feed/ 0
IronPython 3.4 ../../../202311051269/ ../../../202311051269/#comments Sun, 05 Nov 2023 01:33:44 +0000 ../../../?p=1269 このブログは7年ぶりの投稿になります。その間他のブログで書いていましたが、Windowsに関連した内容をふたたびこのブログで書くことにしました。
そのきっかけとなったのは、IronPythonがまだメンテされていることからです。このブログで過去Python関連を多く扱っていることからここに書いた方が良いと思いました。

py00

早速インスツールしてLINQのプログラムを動かしてみました。

py01

ファイルに保存した .pyファイルからのipyコマンド実行でも確認しました。
Ironシリーズの他の言語は、メンテがされていないものもありますが、さすがPythonは用途があるのでしょうね。

参考)https://stackoverflow.com/questions/628482/can-you-use-linq-types-and-extension-methods-in-ironpython

]]>
../../../202311051269/feed/ 0
SPARQL in Excel ../../../20140126687/ ../../../20140126687/#comments Sun, 26 Jan 2014 13:20:02 +0000 http://xfra.me/?p=687 今年はじめての投稿になります。
このBlogは初めてちょうど、一年になります。自分の技術向上の目的もこめて最低でも月一回はそのとき興味のあるプログラムネタを投稿しようと決めていましたが、一年なんとかやりきることができました。また今年もがんばりたいと思います。

本年もよろしくお願いいたします。

昨年からOpenDataに興味を持ち、O’Reilly「セマンティックWebプログラミング」等の書籍を読んで部分的なテストはしていましたが、実際に動くものが手元に欲しくなったので、この本のサンプルを参考にSPARQLというクエリー言語を使って試してみました。
取得したデータをExcelに読み込みたかったので、以前の投稿「Excel Add-Ins in Python, PyXLL」でテストしたPyXLLを使いました。

from pyxll import xl_func
import rdflib
from rdflib.graph import ConjunctiveGraph, Namespace

@xl_func("int n: var[]")
def testFunc1(n):
	ret = []
	FBNS = Namespace("http://rdf.freebase.com/ns/")
	g = ConjunctiveGraph()
	g.parse("C:\data\sample.n3", format="n3")
	res = g.query("""SELECT ?name ?year WHERE{
		?movie fb:film.film.initial_release_date ?year .
		?movie fb:film.film.starring ?actor .
		?actor fb:type.object.name ?name . }
		order by ?year ?name""", initNs={'fb':FBNS})
	for t in res:
		ls = list(t)
		ret.append(ls)

pyxll.xllファイルを空のシートにドラッグ&ドロップします。
name,yearの2列、検索結果数の6行以上の範囲を指定して、関数を呼びます。
引数は必要ないですが、”1″を指定しています。

sparql1
(注:範囲指定して決定するとき、Ctl-Shift-Enterを忘れずに)

PyXllの環境にrdflibを導入する必要があります。pyxll.cfgにpythonpath=.を指定して、pyxll.xllと同じフォルダにrdflibのフォルダをコピーしました。
(インストールしてからかなりたっているため、具体的なインストール手順は割愛しました。スミマセン。logsフォルダに出力されるエラーを参考にして環境を構築するとうまくできると思います。)

以下が使用したデータです。
書籍にあったものを、抜粋して作りました。
sample.n3

@prefix fb: <http://rdf.freebase.com/ns/> .

<http://rdf.freebase.com/ns/en.hollywood_homicide> 
    <http://rdf.freebase.com/ns/film.film.directed_by> 
    <http://rdf.freebase.com/ns/en.ron_shelton> ;
<http://rdf.freebase.com/ns/film.film.starring> 
    <http://rdf.freebase.com/ns/en.harrison_ford> , 
    <http://rdf.freebase.com/ns/en.kurupt> , 
    <http://rdf.freebase.com/ns/en.robert_wagner> ;
<http://rdf.freebase.com/ns/film.film.initial_release_date> "2003" .

<http://rdf.freebase.com/ns/en.k_19_the_widowmaker> 
    <http://rdf.freebase.com/ns/film.film.directed_by> 
    <http://rdf.freebase.com/ns/en.kathryn_bigelow> ;
<http://rdf.freebase.com/ns/film.film.starring> 
    <http://rdf.freebase.com/ns/en.harrison_ford> , 
    <http://rdf.freebase.com/ns/en.joss_ackland> ;
<http://rdf.freebase.com/ns/film.film.initial_release_date> "2002" .

<http://rdf.freebase.com/ns/en.becoming_dick> 
    <http://rdf.freebase.com/ns/film.film.directed_by> 
    <http://rdf.freebase.com/ns/en.bob_saget> ;
<http://rdf.freebase.com/ns/film.film.starring> 
    <http://rdf.freebase.com/ns/en.robert_wagner> , 
    <http://rdf.freebase.com/ns/en.bob_saget> ;
<http://rdf.freebase.com/ns/film.film.initial_release_date> "2000" .

<http://rdf.freebase.com/ns/en.kurt_russell> 
    <http://rdf.freebase.com/ns/type.object.name> "Kurt Russell" .
<http://rdf.freebase.com/ns/en.bob_saget> 
    <http://rdf.freebase.com/ns/type.object.name> "Bob Saget" .
<http://rdf.freebase.com/ns/en.harrison_ford> 
    <http://rdf.freebase.com/ns/type.object.name> "Harrison Ford" .
<http://rdf.freebase.com/ns/en.robert_wagner> 
    <http://rdf.freebase.com/ns/type.object.name> "Robert Wagner" .
<http://rdf.freebase.com/ns/en.kurupt> 
    <http://rdf.freebase.com/ns/type.object.name> "Kurupt" .

OpenDataはいろんなデータフォーマットがあるので、目的のサンプルデータをつくるのにもう少し調査が必要と感じました。
まずは第一歩としてここまでにしたいと思います。

]]>
../../../20140126687/feed/ 0
C# – IronPython データ連携 ../../../20131020567/ ../../../20131020567/#comments Sun, 20 Oct 2013 08:20:16 +0000 http://xfra.me/?p=567 C#とIronPythonを連携させようと思ったのは、Pythonの数値計算ライブラリNumPyがIronPythonでもインストールできるというサイトを見つけたからです。(また、VSTOでExcelのデータ処理にも使えればと)

https://www.enthought.com/repo/.iron/

これを使って、C#、IronPython間のデータの受け渡しテストをしてみました。

環境 : IronPython 2.7.3 (2.7.0.40) on .NET 4.0.30319.296 (32-bit), Visual Studio 2010 / Windows 7

インストール
1)ironpkg-1.0.0.pyをダウンロード
2)以下コマンド実行

ipy ironpkg-1.0.0.py –install
ironpkg scipy
ipy -X:Frames -c “import scipy”

いろいろと調べてトライしましたが、残念ながらSciPyは使えないようです。しかしNumPyは使えるので、こちらだけ使いました。
(NumPyだけできるものにしました)

csTest.py

import sys
sys.path.append(r'C:\Program Files (x86)\IronPython 2.7')
sys.path.append(r'C:\Program Files (x86)\IronPython 2.7\DLLs')
sys.path.append(r'C:\Program Files (x86)\IronPython 2.7\Lib')
sys.path.append(r'C:\Program Files (x86)\IronPython 2.7\Lib\site-packages')

import clr
clr.AddReference('mtrand.dll')

import numpy as np

na = np.zeros(shape=(2,2))

for i in range(2):
	for j in range(2):		
		na[i, j] = mx[i, j]

mr = np.linalg.inv(na)
print '- Iron Python -'
print mr
print np.dot(na, mr)

for i in range(2):
	for j in range(2):
		mx[i, j] = float(mr[i, j])

C#で設定した2次元配列のデータをNumPyを使って逆行列の計算をして戻すというものです。
しかしC#の配列からのNumPy配列に渡す(その逆も)やり方ついていろいろと悩みました。
mxのままだと逆行列を求める関数でエラーをだしました。(np.array(mx)とやるときは、mxはジャグ配列([][])でないといけないみたいだし・・)
結果代入という形にしてしまいましたが、もっといい方法がないかまた調べたいと思います。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using IronPython.Hosting;
using Microsoft.Scripting.Hosting;
using System.Collections;
using IronPython.Runtime;

namespace csPyTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var pe = Python.CreateEngine();           
            ScriptSource src = pe.CreateScriptSourceFromFile(@"C:\csTest.py");
            ScriptScope scope = pe.CreateScope();

            double[,] mx = new double[,] {{0,1},{2,3}};
            scope.SetVariable("mx", mx);

            src.Execute(scope);

            var m = scope.GetVariable<double[,]>("mx");

            Console.WriteLine(" - C# - ");
            for (int i = 0; i < 2; i++)
            {
                for (int j = 0; j < 2; j++)
                {
                    Console.Write(m[i, j] + " ");
                }
                Console.WriteLine();
            }
            Console.ReadLine();
        }
    }
}

C#からダイナミック言語のPythonの変数に直接アクセスできるのも、強力な機能ですね。しかしもうすこしCPythonのライブラリが使えるようになってほしいところです。

以下は実行結果です。逆行列の確認として、単位行列を出力しています。
NumPy

]]>
../../../20131020567/feed/ 0
Pyvot / Excel ../../../20131019546/ ../../../20131019546/#comments Fri, 18 Oct 2013 16:30:34 +0000 http://xfra.me/?p=546 Excelネタが続きますが、今回はPythonを使ったExcel操作です。Excel「ファイル」への読み書きを目的にしたものではなく、開いたままのシートに対してリアルタイムに読み書きするものです。Pythonはソースを見やすいようにパッケージの形にしましたが、コンソールでの操作を想定しています。
コンソール画面でプログラムのテストしたりするときに、標準入力や標準出力をセルでやると面白いかもということで試してみました。WindowsやLinuxなどのコマンドラインでデータの入出力をするときなど、ファイルでもいいのですが、データを部分的に変更したりするとき、この方法は便利です。視覚的にもわかりやすいです。(こんな用途かぎられるかもしれませんが・・)

環境 : Python 2.7.3, Excel 2010 / Windows 7
インストール :

http://pytools.codeplex.com/wikipage?title=Pyvot

PTVSからもできるようですが、よくわかりませんでしたので、

https://pypi.python.org/pypi/Pyvot

こちらのサイトから
Pyvot-0.1.2-py2.7.egg
をダウンロードして、easy_install コマンドを使いました。
あとwin32comも必要です。

使い方に関しては、以下の動画がわかりやすかったです。

基本的な機能を使ってみました。
pyvot_1
Pythonから書き込んだあと、Excelシートをエディトして(1 -> 10)、Excelから読みこみます。(w.get())
Pyvot_2
これを踏まえて、ちょっと変わった使い方ですが連続してデータをExcelに送り、グラフを表示してみました。

import xl
import threading
import time
import random

def main():
	xl.Workbook('xlTest.xlsx')
	
	r = range(1,11)
	for i in range(10):
		xl.get("A1:A10").set(r)
		random.shuffle(r)
		time.sleep(1)

if __name__ == '__main__':
	main()


初期値は以下で、
PYvot_3
あとは1秒ごとにランダムに並び順が変化します。
Pyvot_4
実は、マルチスレッドでデータを変化させ、リアルタイム解析みたいなことができないか、ということをしたかったのですが、Pythonのスレッドの中からxl関数を呼び出すと、エラーになってしまいました。また前提条件として、プログラム動作中、セルをクリックすると停止します。あと変更対象のセルにはあらかじめデータを入れておく必要があります。
自分が個人的にやりたかったことができないものもありましたが、十分使えるツールだと思います。

また、いろいろと試していきたいと思います。

]]>
../../../20131019546/feed/ 0
Azure Table Storage / LINQPad ../../../20130927438/ ../../../20130927438/#comments Fri, 27 Sep 2013 14:58:50 +0000 http://xfra.me/?p=438 LINQPadAzure

LINQPadを使う機会があったので、ついでに以前、WindowsAzure Storage Python ライブラリの投稿でテストした、Azure Table StorageをLINQPadからアクセスしてみました。

http://blog.madd0.com/2012/01/09/linqpad-driver-for-azure-table-storage/

このサイトにある、TableStorageのドライバーのcompiled and packaged を入手して、LINQPadにDriver(Madd0.AzureStorageDriver-v1.0.0-beta.lpx)をインポートします。
(Add connection -> View more drivers -> Browse..)

ドライバーのおかげで簡単にアクセスできるようになりました。

環境: LINQPad Free Edition 4.45.05 / Windows 7

このようなちょっとしたテストをBlogに残すって結構便利なんですよね。Pythonで以前やったテストも、Blogを参考にして再テストしたりしましたし、日付や前後の記事からいつごろどういった背景でやったテストかがわかったりと、自分自身に役立ちます。ツールのバージョンやインターフェイスが変わって現在では同様のテストができなくても(とくにサービスからみとか)、エビデンスとして残っていると、どこまでできたかがよくわかります。

と、つくづく思ったテストでした。

]]>
../../../20130927438/feed/ 0
Python / Django / WindowsAzure ../../../20130801385/ ../../../20130801385/#comments Thu, 01 Aug 2013 13:46:51 +0000 http://xfra.me/?p=385 Pythonの代表的なWebアプリケーションフレームワークであるDjangoをWindowsAzureにデプロイしてみました。
各ツールのバージョンか変わるとセットアップの方法も変わったりしますので、最新のものでテストしてみました。

環境 : VisualStudio 2013 Preview / Windows 8.1 Preview / VirtualBox 4.2.16 / Mac OS X 10.7.5

参考サイト : One of Microsoft’s Best-Kept Secrets – Python Tools for Visual Studio (PTVS) http://www.hanselman.com/blog/OneOfMicrosoftsBestKeptSecretsPythonToolsForVisualStudioPTVS.aspx

プロジェクトの新規作成からPython -> Django Application を選択
ソリューションエクスプローラから、PythonEnvironments右クリック -> Add Virtual Environment

pyvenv

env(Pyton3.3)右クリック->Install Python Package

dangoInst

インストールが無事終了したら、まずはローカルサーバで確認するためInternet Explorer で実行
以下のような画面が表示されます。

djangoApp

WindowsAzureへのデプロイは、前回のSignalRの記事と同様に発行プロファイルをダウンロードしてVisualStudioにインポートします。

http://(作成したWEBサイト).azurewebsites.net/

で、ローカルで確認した同じページが表示されます。

以前違う方法でトライして失敗したためそのままにしていましたが、バージョンが上がって、かなり簡単にDjangoのインストールができるようになりました。

とりあえずここまでメモということで。

]]>
../../../20130801385/feed/ 0
C#, Python で R.NET ../../../20130630322/ ../../../20130630322/#comments Sun, 30 Jun 2013 06:28:29 +0000 http://xfra.me/?p=322 最近の統計ブームにのって私もいろいろと興味があったので、「R」という統計ソフトを使ってみました。制御系の仕事をしていたときMatlabというシミュレーションソフトを使っていましたが、行列とかが簡単に扱えるインタープリタにとても驚かされました。とても魅力的なソフトなのですがとても高価なため個人では手軽に使えるものではありませんでした。Rのインタプリタを使っていると、そのときの感動がよみがえってきました。
調べてみるとRDotNet(http://rdotnet.codeplex.com/)を使うと、C#からRの機能が使えるということなので、いろいろとテストをしてみました。

環境: R 3.0.0, VisualStudio 2010/ Windows 7

using System;
using System.IO;
using System.Linq;
using RDotNet;
using System.Text;

class Program
{
    static void Main(string[] args)
    {
        var envPath = Environment.GetEnvironmentVariable("PATH");
        var rBinPath = @"C:\Program Files\R\R-3.0.0\bin\i386";
        Environment.SetEnvironmentVariable("PATH", envPath + Path.PathSeparator + rBinPath);
        using (REngine engine = REngine.CreateInstance("RDotNet"))
        {
            engine.Initialize();

            StringBuilder command = new StringBuilder();
            commmand.Append(@"x <- 1:10;");
            commmand.Append(@"plot(x);");
            engine.Evaluate(commmand.ToString());
            Console.ReadLine();
        }
    }
}

まず、Rのコマンドラインで試した簡単なプロットをC#からやってみました。しかしこのやり方だと、単にリモート実行しているだけなのであまり意味がないと思い、以下のように修正しました。

class Program
{
    static void Main(string[] args)
    {
        var envPath = Environment.GetEnvironmentVariable("PATH");
        var rBinPath = @"C:\Program Files\R\R-3.0.0\bin\i386";
        Environment.SetEnvironmentVariable("PATH", envPath + Path.PathSeparator + rBinPath);
        using (REngine engine = REngine.CreateInstance("RDotNet"))
        {
            engine.Initialize();

            NumericVector nn = engine.CreateNumericVector(new double[] {1,2,3,4,5,6,7,8,9,10});
            engine.SetSymbol("nn", nn);
            engine.Evaluate("plot(nn)");

            Console.ReadLine();
        }
    }
}

こういったのは、スクリプト言語からの方が使い勝手がいいと思い、.NETでもあるのでIronPythonから呼び出してみようとトライしました。しかしモジュールをうまく読み込んでくれなかったので、普通のPythonに変更しました。しかしこれも、rpy2モジュールが64bitの環境でうまくインストールできなかったので、最終的にMacでテストしました。

sudo pip install rpy2

で簡単にインストールできました。

環境 : R 3.0.1, Python 2.7.1 / MacOSX 10.7.5

import rpy2.robjects as ro
import time

r = ro.r
q = r.seq(0,10);
r.plot(q);

time.sleep(3);

実行結果は以下のプロット画面です。この画面の実行はWindowsのRで行ったものです。

R

IronPythonでやる方法はまた調べたいと思います。

]]>
../../../20130630322/feed/ 0
QtWebKit.QWebView を使ったPython、JavaScript連携 ../../../20130420194/ ../../../20130420194/#comments Sat, 20 Apr 2013 14:07:57 +0000 http://xfra.me/?p=194 前々回、WebViewでのC#、JavaSCript間の連携の話題、そして前回IronPythonを使ったWebページの話題という流れて、どうしてもテストしておきたかったのが、Qtを使ったWebViewのPython、JavaScript間相互呼び出しです。
Qtは、LinuxZaurusの開発で経験がありますが(組み込みLinux用なのでQtopiaと呼ばれていましたが)、C++でクロスプラットフォームのGUIアプリケーションを開発できます。歴史は古いのですが、まだまだ現役のようです。最近また触れる機会があり、いろいろと調べてみたところ、WebKitを使ったプログラムが面白そうだということで、ちょっとはまっています。PySideというライブリを使って、Pythonからダイレクトに操作できる点も魅力です。
次の例は、起動するとPythonのプログラムからJavaScript関数を呼び出し、表示されたボタンをクリックすると、Python関数を呼び出すというものです。これはコンソールにメッセージを出力します。

環境: Python 2.7.3 + PySide 1.1.2 / Windows7


import sys
from PySide import QtWebKit,QtGui,QtCore

html = """
<html>
<script>
function pyMsg(str){
	pyObj.console(str);
}
function jsFunc(str){
	alert(str);
}
</script>
<body>
<input type="button" value="btn" onClick="pyMsg('js String')">
</body>
</html>
"""
 
class jsTest(QtCore.QObject):
	def __init__(self, parent=None):
		super(jsTest, self).__init__(parent)
	@QtCore.Slot(str)
	def console(self, msg):
		print msg

app = QtGui.QApplication(sys.argv)
view = QtWebKit.QWebView()
frame = view.page().mainFrame()
js = jsTest()
view.setHtml(html)
frame.addToJavaScriptWindowObject('pyObj', js)
frame.evaluateJavaScript("jsFunc('from py Function');")
view.show()
sys.exit(app.exec_())

他にも、クリックイベント等をフックできるので、デバッグやその他いろいろと楽しいことができます。
自分ブラウザみたいなものを作ってみたくなりますね。

]]>
../../../20130420194/feed/ 0