Python」タグアーカイブ

GtkAspectFrame shadow_type

最近 PyGtk ネタを書いていないことに気がつく。
てかセ CULV セレロンの検索で何人も来ているという始末。

culva

やっぱり需要の高そうなネタに終始したほうが…とか思ってしまいます。

ということで Y901x の現状。
Mandriva で Y901x を使うと GtkAspectFrame に枠が入ってしまう件はなんとか解決。

gtk.Frame

GtkAspectFrame の set_shadow_type メソッドで gtk.SHADOW_NONE にするだけ。
つまり Ubuntu で使っているテーマでは影が元々まっ黒だっただけということかな?
後はとにかく Compiz 有効にできる HDD インストールを行って試してから更新の予定。
2010.0 は 15 日だったような覚えがあるんだけど…気のせいだったか。

DistroWatch.com: Put the fun back into computing. Use Linux, BSD.

それとずっと解らないこと。
Compiz 無効の 2D 描写時はリストグリップのラインが再描写で上手く描写されない。
expose-event ってどうも Windows の WM_PAINT のように完璧にはいかないようだ。

ダブルバッファリングを無効にすると少しマシだがダメな場合もある。
そういえば Windows では DC に線を書くより画像を表示したほうが負荷が軽い。
ならば画像でやってみよう、self.grip_pix という変数に GtkPixbuf を格納し

def __on_expose_event(self, widget, event):
    # GetDC()(Windows)
    gc = widget.style.fg_gc[gtk.STATE_NORMAL]
    # Draw Vertical Line
    area = widget.window
    area.draw_pixbuf(gc,
                    self.grip_pix.scale_simple(event.area.width, event.area.height, gtk.gdk.INTERP_NEAREST),
                    0, 0, 0, 0)

もっと負荷が大きくなった…
てか pixbuf を引き伸ばして描写するにはこういう方法しか無いのだろうか?
Win32API の BitBlt みたいな転送方法があると思うんだけど今は解らない。

いっそ GtkImage で…こいつは GtkEventBox が必要になるので嫌だし引き延ばしが無理そう。
おまけにやっぱり上手くいかない、3D で使えば何も問題無いので放置のままかな。

しかしちっとも需要が無い GStreamer Player の更新を続けてどうする…
だが Windows でソレをやり続けたから Linux でもアプリが作れるようになったのだからね。

ネタとして MonoDevelop で WindowsForm を作ってみる。

WindowsForm を散々バカにしてきた私だが。
ネタとして MonoDevelop で WindowsForm を作ってみる。

空の新規ソリューションを作成する。
ソリューションエクスプリーラの参照の所を右クリックして下記メニューを選択。
こんなところまで Visual Studio のパクリかよ。

migimenu

出てきたダイアログから以下をチェック。
System.Windows.Forms
System.Drawing

02

次にプロジェクト部分を右クリックして「追加」「新しいファイル」
空のクラスを選択し OK でコードが書けるようになる。

main_class

コードを書いてみる

using System;
using System.IO;
using System.Drawing;
using System.Windows;
using System.Windows.Forms;

namespace winform_test
{
	/// <summary>
	/// WindowsForm 継承クラス
	/// </summary>
	public class MainWindow: Form
	{
		TextBox textBox;

		public MainWindow()
		{
			this.Size = new Size(320, 320);
			this.Text = "WindowsForm はこんなに酷い";
			// 第一ボタン
			Button button = new Button();
			button.Text = "ポチッと押してちょ!";
			button.Location = new Point(10, 10);
			this.Controls.Add(button);
			button.Click += delegate {
				MessageBox.Show("クリックしたね!", "タイトル");
			};
			// 第二ボタン
			Button button2 = new Button();
			button2.Text = "Dialog";
			button2.Location = new Point(10, 30);
			this.Controls.Add(button2);
			button2.Click += HandleClick;
			// テキストボックス
			textBox = new TextBox();
			textBox.Multiline = true;
			textBox.AcceptsReturn = true;
			textBox.AcceptsTab = true;
			// サイズ変更追従にこんな面倒なことをやる必要がある
			textBox.Location = new Point(0, 40);
			textBox.Size = new Size(320, 280);
			textBox.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | 
				AnchorStyles.Left | AnchorStyles.Right;
			this.Controls.Add(textBox);
		}

		void HandleClick(object sender, EventArgs e)
		{
			OpenFileDialog dlg = new OpenFileDialog();
			if (dlg.ShowDialog() == DialogResult.OK)
			{
				StreamReader sr = null;
				try
				{
					sr = new StreamReader(dlg.FileName);
					string s = sr.ReadToEnd();
					textBox.Text = s;
				}
				finally
				{
					if (sr != null)
						sr.Close();
				}
			}
		}
	}
	
	public class main_class
	{
		/// <summary>
		/// エントリポイント
		/// </summary>
		public static void Main(string[] args)
		{
			MainWindow win = new MainWindow ();
			Application.Run (win);
		}
	}
}

winform

たったこれだけでも死ぬほど遅い。
Windows は最終的に Win32API だが mono の WindowsForm は全部ソフトウエア描写だから。
Gtk# なら最終的に GTK+ がやってくれるので少しマシ、それにダイアログに違和感バリバリ。

何より絶対位置配置しかできないので重なったりはみ出したりする。
これは意図的にそう書いたけど GTK+ や WPF ではこんなことはおこらないんだよ。
GTK+ でも GtkFixed レイアウタを使うと同じようになるけど。
自分の目で確かめればいいと思うならテーマを色々変えてみれば何を言いたいのかが解る。

同じものを PyGtk で作る。
もちろん GtkHBox, GtkVBox レイアウタを使う。

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

import gtk

class GtkForm(gtk.Window):
    """
        GtkWindow 継承クラス
    """
    def __init__(self):
        gtk.Window.__init__(self)
        self.resize(320, 320)
        # 第一ボタン
        button = gtk.Button()
        button.set_label("ポチッと押してちょ!")
        button.connect("clicked", self.messagebox)
        # 第一ボタン
        button2 = gtk.Button()
        button2.set_label("Dialog")
        button2.connect("clicked", self.opendlg)
        # テキストビュー
        self.textbox = gtk.TextView()
        # パッキング
        vbox = gtk.VBox()
        vbox.pack_start(button, False)
        vbox.pack_start(button2, False)
        vbox.pack_start(self.textbox)
        self.add(vbox)
        self.set_title("画像ビューア")
        self.connect("delete-event", self.on_quit)
        self.show_all()

    def on_quit(self, widget, event=None):
        gtk.main_quit()

    def messagebox(self, widget, event=None):
        dlg = gtk.MessageDialog(self, gtk.DIALOG_MODAL, gtk.MESSAGE_WARNING, 
                                gtk.BUTTONS_OK, "クリックしたね!")
        dlg.set_title("タイトル")  
        r = dlg.run()  
        dlg.destroy()

    def opendlg(self, widget, event=None):
        dlg = gtk.FileChooserDialog(
            buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK))
        r = dlg.run()
        try:
            if r == gtk.RESPONSE_OK:
                f = open(dlg.get_filename())
                self.textbox.get_buffer().set_text(f.read())
                f.close()
        finally:
            dlg.destroy()

if __name__ == "__main__":
    """
        エントリポイント
    """
    w = GtkForm()
    gtk.main()

桁違いに早いし絶対に重なったりはみ出したりしない。
手抜きでスクロールバーを入れていないので小さいテキストファイルで試すのを勧める。

ネタが無いのでちょっと MonoDevelop を使ってみた。
9.04 にしてすぐ入れたのに結局使わなかったもの…

checkinstall

Linux のスクリーンショットが沢山見られるサイトを見つけた。

Linux, BSD, Solaris & Other OS Screenshots | The Leader in Linux, BSD, Solaris & Other OS Screenshots | Screen Shots of Linux Distributions, BSD, Solaris & Other OSes | Linux, BSD, Solaris & Other OS Screenshot Gallery

GNOME と KDE ばかりとはいえ、なんだかんだで見た目は大事ですから。
最新版の見た目を見てどんな感じになったのか確かめたりする他
そういえば昔の Fedora はスタートメニューが赤い帽子だったなぁとか楽しめます。

Linux標準にPerlとPythonが追加 ? @IT

古い記事だが、だから今の Linux には Perl と Python が必ず入っているのか。

Linux Standard Base – Wikipedia

Debian 系がいつまでも deb に拘っているほうがどうかと思うのだが。
Opera とかも Debian 系のためだけに deb パッケージを用意するのは大変だろうに。
こういう点が面倒だから Desktop Linux ではアプリが偏る結果になるのに。
と思っていたけど…

3種類のパッケージを手軽に作成 checkinstall – 特選フリーソフト:ITpro

Ubuntu から apt-get で手に入るのでやってみた。

checkinstall

Y901x のインストールスクリプトを install.sh にして実効パーミッションを付加。
cd コマンドでインストールスクリプトのあるディレクトリに移動。

$ sudo checkinstall ./install.sh

y901x_dev

あらら、簡単に作れちゃった。
でも何故 root 所有になるの?もう少し調べると面白いかも。

SeeMe for Linux v1.0.2

SeeMe をまだ Delphi 5 という化石で作っていた頃の v2 画像が何故か出てきた。

seeme200

ナンジャコリャ…今になって見ると我ながら UI が古すぎる!
よくこんなのを恥ずかしげもなく公開していたものだ、信じられない。

XP のデザイン自体も古いけどウィジェットの絶対値配置ってマジ化石だな。
Vista や GNOME 環境を使っていると絶対値配置の奇妙なウイジェット位置に違和感出まくり。

PyGtk で GtkFixed コンテナを使っている初心者を最近見て死ぬほどガッカリしたんだが…
二年前の私はたいして変わらないな。

ということで今日の Python コード。

SeeMe for Linux で直接編集の指定部分。
何も書かれていなければ関連付け起動、でなければそのエディタで。
んでエディタを別プロセスで起動させたならそのまま SeeMe は終了。
というふうにしたかった、てか Windows 版がそうしている。

エディタ指定をしたならその実効ファイル名の引数に渡せばいいので普通なら下記…

os.system("%s %s" % (exe, self.sset.custome_path) )

これだと値が戻ってくるまで待機してしまう、つまり SeeMe はフリーズ状態に。
これでは使えない、ということで探したら os モジュールに spawn* というのがあるらしい。

16.1. os ? 雑多なオペレーティングシステムインタフェース ? Python v2.6.0 documentation

肝心な引数の書き方が可変個引数でよく解らない、検索してみたけどバラバラだし。
自分で色々試して二番目と三番目引数に実効ファイル名、四番目を開きたいファイルのフルパス

def on_textedit(self, widget, event=None):
    exe = self.deditor.edit_editor.get_text()
    if exe == "":
        os.system("xdg-open %s" % self.sset.custome_path)
        self.close()
    else:
        os.spawnlp(os.P_NOWAIT, exe , exe, self.sset.custome_path)
        self.close()

を入れてなんとか成功、イマイチ納得できないけどこれで動くからイイや!
ということで、Python で GUI アプリを作るのは難しい…
アトリビュート変数名の中身は本体スクリプトで、既に千行近くになっているけど…

ということで SeeMe for Linux v1.0.2 の公開。

追記

os.system("%s %s &" % (exe, self.sset.custome_path) )

こんな方法があった…出した直後に見つけるなよ俺。

Python gnome Module

Vista に変更中なのに何故か VirtualBox 上の Ubuntu 8.10 を。

gnome

bonobo や gnomevfs は解るんだけど gnome って何?
インタラクティブシェルで

import gnome
dir(gnome)

とやるとズラっと、どうも GNOME に対し何か行うモジュールのようで。
解りやすそうなメソッドを何か使ってみよう。

import gnome
gnome.url_show("http://palepoli.skr.jp/")

とやってみるとやっぱり Firefox が立ち上がって我がサイトを表示。
なんだよ、xdg-open を外部呼び出ししなくてもこれでイケるやん!

こんなことができたのね、もう少し地味に調べると面白そうです。
つーてもこういう Python 限定では Devhelp にあるはずがないしなぁ。
$ pydoc gnome
で見てもちょっと解りにくいのが難点かな。

しかし秀丸では今となってはネタが書きにくい、Gedit に慣れすぎた。