ラベル Python の投稿を表示しています。 すべての投稿を表示
ラベル Python の投稿を表示しています。 すべての投稿を表示

2009/10/31

PythonでHTTPS接続

Google App Engineのローカルサーバでしか試していませんが一応動作を確認
ユーザ認証にHTTP接続がないサービスでもGAE経由で操作できそう

import urllib2

d = urllib2.urlopen("https://foobar....")
self.response.out.write(d.read().decode("utf8"))
d.close()

2009/09/14

文字コード@Python

HTTP経由で取ってきたデータとか文字コードが色々ですね
文字コードの判定とか変換とかどうやるんだろうって探していたら出てきたのでメモ
うーん、、
Pythonは試してエラーだったら次って方法しかないのかな?
できればもっとスマートなのが良いんだけどなぁ

文字コード判定して一括でuft-8に変換するPythonスクリプト - 清水川Web

2009/09/06

PythonでJSONを扱う

実はmixiアプリにデータを渡す用にGoogle App Engineを使っています
OpenSocialのAPIでできない部分は外部のサーバに頼る必要があり
たまたま目についたのがGoogle App Engineだったってだけですが

19.2. json — JSON encoder and decoder — Python v2.6.2 documentation

ドキュメントだと import json ってなってるけどなんか無理っぽい
from django.utils import simplejson


文字列からオブジェクト
obj = simplejson.loads(str)


オブジェクトを文字列
str = simplejson.dumps(obj)

2009/02/04

ボリュームコントロールアプリ完成

あまり美しくないコードですが公開します
適当なところが多い、、(エラー処理とかないし
トレイに出るアイコンを右クリックとか左クリックとかしてください
そのうちFedoracubeに入れる予定

#!/usr/bin/python
# -*- encoding: utf-8 -*-

import sys, pygtk, gtk, subprocess

class PopupMenu(gtk.Menu):
def __init__(self, icon):
gtk.Menu.__init__(self)

self.icon = icon

# コントロール
controls = []
group = None
for i in self.GetControls():
controls.append(gtk.RadioMenuItem(group, i))
control = controls[-1]
control.connect("activate", self.activate_ChangeControl, i)
group = control
self.append(control)
controls[0].set_active(True)

# 区切り線
self.append(gtk.SeparatorMenuItem())

# PulseAudio Volume Control
self.pavucontrol = gtk.ImageMenuItem("PulseAudio Volume Control")
self.pavucontrol.set_image(gtk.image_new_from_icon_name("multimedia-volume-control", gtk.ICON_SIZE_MENU))
self.pavucontrol.connect("activate", self.activate_RunPavucontrol)
self.append(self.pavucontrol)

# 終了
self.exit = gtk.ImageMenuItem(stock_id = gtk.STOCK_QUIT)
self.exit.connect("activate", gtk.main_quit)
self.append(self.exit)

self.show_all()

def GetControls(self):
amixer = subprocess.Popen(["/usr/bin/amixer", "scontrols"], stdout = subprocess.PIPE).communicate()[0]

controls = []
for control in amixer.rstrip().split("\n"):
controls.append(control.split(" ")[3])

return controls

def activate_RunPavucontrol(self, widget):
subprocess.Popen(["/usr/bin/pavucontrol"])

def activate_ChangeControl(self, widget, control):
if widget.get_active() == True:
self.icon.active_control = control

class VolumeControl(gtk.Window):
def __init__(self, icon):
gtk.Window.__init__(self)

self.icon = icon
self.vbox = gtk.VBox(False, 0)
self.plus = gtk.Button()
self.scale = gtk.VScale(gtk.Adjustment(50, 0, 101, 1, 1, 1))
self.minus = gtk.Button()
self.mute = gtk.Button()

self.plus.set_relief(gtk.RELIEF_NONE)
self.plus.set_image(gtk.image_new_from_stock(gtk.STOCK_GO_UP, gtk.ICON_SIZE_MENU))
self.plus.connect("clicked", self.clicked_ChangeVolume, 5)

self.minus.set_relief(gtk.RELIEF_NONE)
self.minus.set_image(gtk.image_new_from_stock(gtk.STOCK_GO_DOWN, gtk.ICON_SIZE_MENU))
self.minus.connect("clicked", self.clicked_ChangeVolume, -5)

self.mute.set_relief(gtk.RELIEF_NONE)
self.mute.connect("clicked", self.clicked_ToggleMute)

self.scale.set_size_request(28, 128)
self.scale.set_draw_value(False)
self.scale.set_inverted(True)
self.scale.connect("adjust-bounds", self.adjust_bounds_ChangeVolume)

self.vbox.pack_start(self.plus, False, True, 0)
self.vbox.pack_start(self.scale, False, True, 0)
self.vbox.pack_start(self.minus, False, True, 0)
self.vbox.pack_start(self.mute, False, True, 0)

self.set_skip_pager_hint(True)
self.set_skip_taskbar_hint(True)
self.set_decorated(False)
self.resize(28, 212)
self.add(self.vbox)
self.connect("show", self.show_ShowWindow)
self.connect("focus-out-event", self.focus_out_event_CloseWindow)

def GetMuteStatus(self):
amixer = subprocess.Popen(["/usr/bin/amixer", "sget", self.icon.active_control], stdout = subprocess.PIPE)
grep = subprocess.Popen(["/bin/grep", "-e", "\[on\]$"], stdin = amixer.stdout, stdout = subprocess.PIPE).communicate()[0]

if grep == "":
ret = gtk.STOCK_MEDIA_PLAY
else:
ret = gtk.STOCK_MEDIA_STOP

return ret

def GetVolume(self):
amixer = subprocess.Popen(["/usr/bin/amixer", "sget", self.icon.active_control], stdout = subprocess.PIPE)
grep = subprocess.Popen(["/bin/grep", "-oe", "[0-9]*%"], stdin = amixer.stdout, stdout = subprocess.PIPE).communicate()[0]
ret = int(grep.split("%")[0])

return ret

def ChangeVolume(self, adjust):
value = adjust.value

if value > adjust.upper:
value = adjust.upper
elif value < adjust.lower:
value = adjust.lower

subprocess.Popen(["/usr/bin/amixer", "sset", self.icon.active_control, str(int(value)) + "%"], stdout = subprocess.PIPE).communicate()[0]

def show_ShowWindow(self, widget):
self.scale.grab_focus()
self.scale.set_value(self.GetVolume())
self.mute.set_image(gtk.image_new_from_stock(self.GetMuteStatus(), gtk.ICON_SIZE_MENU))

def focus_out_event_CloseWindow(self, widget, event):
self.hide_all()

def clicked_ChangeVolume(self, button, value):
self.scale.set_value(self.scale.get_value() + value)
self.ChangeVolume(self.scale.get_adjustment())

def clicked_ToggleMute(self, button):
subprocess.Popen(["/usr/bin/amixer", "sset", self.icon.active_control, "toggle"], stdout = subprocess.PIPE).communicate()[0]
self.hide_all()

def adjust_bounds_ChangeVolume(self, range, value):
self.ChangeVolume(self.scale.get_adjustment())

class StatusIconVolumeControl(gtk.StatusIcon):
def __init__(self):
gtk.StatusIcon.__init__(self)

self.menu = PopupMenu(self)
self.control = VolumeControl(self)

self.set_from_icon_name("multimedia-volume-control")
self.connect("activate", self.activate_VolumeControl)
self.connect("popup-menu", self.popup_menu_PopupMenu)

def activate_VolumeControl(self, widget):
if self.control.is_active() == True:
self.control.hide_all()
else:
(screen, rectangle, orientation) = self.get_geometry()

if (screen.get_width() / rectangle.x) > 2:
x = rectangle.x + rectangle.width
else:
x = rectangle.x - self.control.get_size()[0]

if (screen.get_height() / rectangle.y) > 2:
y = rectangle.y + rectangle.height
else:
y = rectangle.y - self.control.get_size()[1]

self.control.move(x, y)
self.control.show_all()

def popup_menu_PopupMenu(self, widget, button, time):
self.menu.popup(None, None, gtk.status_icon_position_menu, button, time, self)

if __name__ == '__main__':
StatusIconVolumeControl()
gtk.main()

2009/02/01

ミュートトグルアプリ若干改良

右クリックのメニューを少し拡張、コードの量は減少
あと少しかな

#!/usr/bin/python
# -*- encoding: utf-8 -*-

import sys, subprocess, pygtk, gtk, threading

def get_controls():
amixer = subprocess.Popen(["/usr/bin/amixer", "scontrols"], stdout = subprocess.PIPE).communicate()[0]

controls = []
for control in amixer.rstrip().split("\n"):
controls.append(control.split(" ")[3])

return controls

def change_tray(tray, control):
amixer = subprocess.Popen(["/usr/bin/amixer", "sget", control], stdout = subprocess.PIPE)
grep = subprocess.Popen(["/bin/grep", "-e", "\[on\]$"], stdin = amixer.stdout, stdout = subprocess.PIPE).communicate()[0]

if grep == "":
msg = control + " is mute"
icon = gtk.STOCK_MEDIA_STOP
else:
msg = control + " is unmute"
icon = gtk.STOCK_MEDIA_PLAY

tray.set_from_stock(icon)
tray.set_tooltip(msg)

class PopupMenu(gtk.Menu):
def __init__(self, tray):
gtk.Menu.__init__(self)

self.tray = tray

# コントロール
controls = []
group = None
for i in get_controls():
controls.append(gtk.RadioMenuItem(group, i))
control = controls[-1]
control.connect("activate", self.activate_control, i)
group = control
self.append(control)
controls[0].set_active(True)

# 区切り線
self.append(gtk.SeparatorMenuItem())

# PulseAudio Volume Control
self.pavucontrol = gtk.ImageMenuItem("PulseAudio Volume Control")
self.pavucontrol.set_image(gtk.image_new_from_stock(gtk.STOCK_PREFERENCES, gtk.ICON_SIZE_MENU))
self.pavucontrol.connect("activate", self.activate_pavucontrol)
self.append(self.pavucontrol)

# 終了
self.exit = gtk.ImageMenuItem(stock_id = gtk.STOCK_QUIT)
self.exit.connect('activate', gtk.main_quit)
self.append(self.exit)

self.show_all()

def activate_pavucontrol(self, widget):
subprocess.Popen(["/usr/bin/pavucontrol"])

def activate_control(self, widget, control):
if widget.get_active() == True:
self.active_control = control
change_tray(self.tray, self.active_control)

class SystrayVolumeControl:
def __init__(self):
self.tray = gtk.StatusIcon()
self.menu = PopupMenu(self.tray)

self.tray.connect("activate", self.toggle_mute)
self.tray.connect("popup-menu", self.popup_menu)

def toggle_mute(self, widget):
subprocess.Popen(["/usr/bin/amixer", "sset", self.menu.active_control, "toggle"], stdout = subprocess.PIPE).communicate()[0]
change_tray(self.tray, self.menu.active_control)

def popup_menu(self, widget, button, time):
self.menu.popup(None, None, gtk.status_icon_position_menu, button, time, self.tray)

if __name__ == '__main__':
SystrayVolumeControl()
gtk.main()

2009/01/28

PyGTKでプログラムを書いてみた

カーネルアップデートでHP Mini 1000でも音が出るようになりました
音が出ないのはFedoracubeの問題ではなかった模様です
良かった、良かった

音量を調節するのにPulseAudio Volume Controlを開くのも面倒なので
システムトレイに入るボリュームコントローラを探してみました
(GNOMEならアプレットがあるんですけどね)
しかし探し方が悪いのか見つからず、、
(ソースはあった、Fedoracubeに入れる為公式のリポジトリに欲しかった)

偶然以下のサイトを見つけて「結構簡単にできるんだなー」と思い
自分で作ってみることにしました
(肝心の操作はコマンドに任せるとしてGUIだけできればいいやって考え)
2008-07-19 - 試験運用中なLinux備忘録

と、ここまでは良かったのですが残念ながら途中で挫折
以下のコードは右クリックからPulseAudio Volume Controlを
左クリックでミュートの切り替え、それしかできません
まぁこれでいいや
やっつけ仕事で汚いけどソースコードを載せておきます
誰かGNOMEのアプレットみたいなの作ってくれないかなぁ

ってか、よく考えたら初Python、初GTK
見よう見まねでいけたしPython意外と書きやすいのかもなー

#!/usr/bin/python
# -*- encoding: utf-8 -*-

import sys, subprocess

try:
import pygtk
pygtk.require("2.0")
except:
pass
try:
import gtk
except:
print >> sys.stderr, "Error: PyGTK not installed"
sys.exit(1)

if gtk.pygtk_version < (2,10,0):
errtitle = "Error"
errmsg = "PyGTK 2.10.0 or later required"

if gtk.pygtk_version < (2,4,0):
print >> sys.stderr, errtitle + ": " + errmsg
else:
errdlg = gtk.MessageDialog(type = gtk.MESSAGE_ERROR, buttons = gtk.BUTTONS_OK)
errdlg.set_title(errtitle)
errdlg.set_markup(errmsg)
errdlg.run()
sys.exit(1)

class TrayMenu(gtk.Menu):
def __init__(self, tray):
# 親クラスのコンストラクタ
gtk.Menu.__init__(self)

self.tray = tray

# PulseAudio Volume Control
self.item1 = gtk.ImageMenuItem("PulseAudio Volume Control")
self.item1.connect("activate", self.item1_activate)
self.item1.set_image(gtk.image_new_from_stock('gtk-preferences', gtk.ICON_SIZE_MENU))
self.append(self.item1)

# 区切り線(インスタンスを生成してそのまま入れている)
self.append(gtk.SeparatorMenuItem())

# 終了
self.item2 = gtk.ImageMenuItem(stock_id = gtk.STOCK_QUIT)
self.item2.connect('activate', self.item2_activate)
self.append(self.item2)

# このメニューを表示可能にする
self.show_all()

def item1_activate(self, widget):
print "PulseAudio Volume Control"
subprocess.Popen(["/usr/bin/pavucontrol"])

def item2_activate(self, widget):
print "終了"
gtk.main_quit()

def popup_menu(self, widget, button, time):
print "右クリック"
# gtk.status_icon_position_menu()でメニューをアイコンの位置に合わせる
self.popup(None, None, gtk.status_icon_position_menu, button, time, self.tray)

class PyGTKSystrayTest:
def main(self):
# PyGTK 2.10以上
tray = gtk.StatusIcon()

# gtk.Menuの子クラス
menu = TrayMenu(tray)

# 今回はgtk.STOCK_DIALOG_INFOのストックアイコンを使用
# set_from_file()やset_from_icon_name()、set_from_pixbuf()も使える
#tray.set_from_stock(gtk.STOCK_DIALOG_INFO)
self.change_tray_icon(tray)

# マウスオーバー
tray.set_tooltip("ボリュームコントロール")

# 左クリック
tray.connect("activate", self.toggle_mute)
# 右クリック
tray.connect("popup-menu", menu.popup_menu)

gtk.main()

def toggle_mute(self, widget):
print "左クリック"
amixer = subprocess.Popen(["/usr/bin/amixer"], stdout = subprocess.PIPE)
head = subprocess.Popen(["/usr/bin/head", "-n", "1"], stdin = amixer.stdout, stdout = subprocess.PIPE).communicate()[0]
control = head.split("'")[1]

if control != "":
amixer = subprocess.Popen(["/usr/bin/amixer", "get", control], stdout = subprocess.PIPE)
grep = subprocess.Popen(["/bin/grep", "-e", "\[on\]"], stdin = amixer.stdout, stdout = subprocess.PIPE).communicate()[0]

if grep == "":
print "unmute"
subprocess.Popen(["/usr/bin/amixer", "set", control, "on"], stdout = subprocess.PIPE)
self.change_tray_icon(widget)
else:
print "mute"
subprocess.Popen(["/usr/bin/amixer", "set", control, "off"], stdout = subprocess.PIPE)
self.change_tray_icon(widget)

def change_tray_icon(self, widget):
print "アイコン変更"
amixer = subprocess.Popen(["/usr/bin/amixer"], stdout = subprocess.PIPE)
head = subprocess.Popen(["/usr/bin/head", "-n", "1"], stdin = amixer.stdout, stdout = subprocess.PIPE).communicate()[0]
control = head.split("'")[1]

if control != "":
amixer = subprocess.Popen(["/usr/bin/amixer", "get", control], stdout = subprocess.PIPE)
grep = subprocess.Popen(["/bin/grep", "-e", "\[on\]"], stdin = amixer.stdout, stdout = subprocess.PIPE).communicate()[0]

if grep == "":
print "mute"
widget.set_from_stock(gtk.STOCK_MEDIA_STOP)
else:
print "unmute"
widget.set_from_stock(gtk.STOCK_MEDIA_PLAY)

if __name__ == "__main__":
app = PyGTKSystrayTest()
app.main()