最近は溜まりまくっている Python 平書きコードの整理をしている。
といっても大半が PyGtk の覚書だったものを PyGI に作り直しであるが。
こんな状態だっったりする。
ソレより GNOME3 で gnomevfs が使えなくなったのをなんとかしないと。
Gio で「ファイルの種類」を得る方法が中々見つからず苦労した。
一旦 Content Type を得て変換するようだと解った。
とりあえず GLocalFile を作成。
query_info の引数に得たい情報文字列をコンマ区切りで突っ込む。
Gio.FILE_ATTRIBUTE_STANDARD_SIZE 等は只の #define された文字列。
GFileInfo
後はメソッドで取り出し、こんな感じかな。
ということで解ったところまで。
ファイルを何かドロップすると詳細が書き出されるウインドウ。
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import sys
import gi
try:
gi.require_version("Gtk", "3.0")
except:
print "This Program is GTK+ 3.0 or later."
sys.exit()
from gi.repository import Gtk, Gdk, Gio
res = """----------
Name: {0}
Size: {1} byte
Content Type: {2}
Mime Type: {3}
Description: {4}
----------
"""
attr = (
Gio.FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME,
Gio.FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
Gio.FILE_ATTRIBUTE_STANDARD_SIZE )
class Win(Gtk.Window):
"""
Information at Dropped File
"""
def __init__(self):
Gtk.Window.__init__(self)
# DnD
dnd_list = Gtk.TargetEntry.new("text/uri-list", 0, 0)
self.drag_dest_set(
Gtk.DestDefaults.MOTION |
Gtk.DestDefaults.HIGHLIGHT |
Gtk.DestDefaults.DROP,
[dnd_list],
Gdk.DragAction.MOVE )
# GtkLabel
self.label = Gtk.Label("Please drop your files")
self.add(self.label)
# Gtk.Window
self.drag_dest_add_uri_targets()
self.connect("drag-data-received", self.on_drag_data_received)
self.set_title("dnd_type")
self.show_all()
def on_drag_data_received(self, widget, drag_context, x, y, data, info, time):
uris = data.get_uris()
s = ""
for uri in uris:
# Create GLocalFile
f = Gio.file_new_for_uri(uri)
# Create GFileInfo
info = f.query_info(
",".join(attr),
Gio.FileQueryInfoFlags.NONE,
None )
# Anyway Get Content Type
ct = info.get_content_type()
# splintf
s += res.format(
info.get_display_name(),
info.get_size(),
ct,
Gio.content_type_get_mime_type(ct),
Gio.content_type_get_description(ct) )
self.label.set_text(s)
class App(Gtk.Application):
def __init__(self):
Gtk.Application.__init__(
self,
application_id="apps.test.akemi.homura",
flags=Gio.ApplicationFlags.FLAGS_NONE)
self.connect("activate", self.on_activate)
def on_activate(self, application, user_data=None):
w = Win()
w.set_application(self)
if __name__ == "__main__":
app = App()
app.run(None)
うんコレで拡張子無しでもキチンと description が得られる。
Mime Type って Content Type と何が違うのかイマイチ解らない。
後は Last Write Time 等なんだがまだ解っていない。
os.stat から得られるのは知っているが Gio でやりたいので。
てゆーか昔のコードはほとんど役に立たなくなってしまったような。
もう少し纏めたら又 Tips ページを作ります。
















