目標
Gtk.FileDialogは、保存ファイルの指定にも使用することができます。今回は、Gtk.FileDialogを使用した保存ファイルを指定と、Gtk.FileDialogを開く時のフォルダを指定する方法を紹介します。
Gtk.FileDialogの使用
Gtk.FileDialogが表示するフォルダを指定する
Gtk.FileDialogを開いた時に表示するフォルダは、プロパティinitial_folderで指定します。initial_foldderの値は、Gio.Fileなのでメソッドnew_for_pathなどを使用して定義します。
ini_folder = Gio.File.new_for_path(os.path.dirname(__file__))
filedialog = Gtk.FileDialog(
title="保存ファイルの選択",
accept_label="Ok",
modal=True,
initial_folder=ini_folder,
)
保存ファイルを指定する
Gtk.FileDialogで保存ファイルを指定する作業は、以下の手順でおこないます。
1. メソッドsaveによりファイルダイアログを表示する。
2. 関数on_filedialog_save(1.で指定)内で、メソッドsave_finishにより
選択したファイル(戻り値は、Gio.FileもしくはNone)を取得する。
3. 取得したGio.Fileよりファイルのパスやファイル名を取得する。
※ 保存ファイルの指定では、既存のファイルを指定した場合は上書きをして
良いかの確認メッセージが自動で表示されます。
filedialog.save(
parent=self, cancellable=None,
callback=self.on_filedialog_save)
def on_filedialog_save(self, filedialog, task):
try:
file = filedialog.save_finish(task)
except GLib.GError:
return
if file is not None and os.path.isfile(file.get_path()):
print(file.get_path())
print(file.get_parent().get_path())
print(file.get_basename())
サンプルプログラム
以下のプログラムを実行すると、左図のようなウィンドウが表示されます。ウィンドウ内の`Gtk.FileDialoの表示`ボタンを押すと、右図のようなGtk.FileDialogが表示されます。
Gtk.FileDialogでファイルを指定してOkボタンを押すと、ターミナルに選択したファイルのパスやファイル名を表示します。既存のファイルを選択した場合は、上書きして良いかの確認メッセージが表示されます。
import os
import gi
gi.require_version('Gtk', '4.0')
from gi.repository import Gtk, Gio
APPID = 'com.github.taniyoshima.g4_fblog2_filedialog2'
class Gtk4TestTest(Gtk.Window):
def __init__(self, app):
Gtk.Window.__init__(
self, application=app, title='FileDialog Test2',
default_width=400, default_height=80)
button = Gtk.Button(
label='Gtk.FileDialogの表示',
margin_top=20, margin_bottom=20,
margin_start=20, margin_end=20,
)
button.connect('clicked', self.on_button_clicked)
self.set_child(button)
def on_button_clicked(self, button):
ini_folder = Gio.File.new_for_path(os.path.dirname(__file__))
filedialog = Gtk.FileDialog(
title="保存ファイルの選択",
accept_label="Ok",
modal=True,
initial_folder=ini_folder,
)
filedialog.save(
parent=self, cancellable=None,
callback=self.on_filedialog_save)
def on_filedialog_save(self, filedialog, task):
try:
file = filedialog.save_finish(task)
except GLib.GError:
return
if file is not None and os.path.isfile(file.get_path()):
print(file.get_path())
print(file.get_parent().get_path())
print(file.get_basename())
class Gtk4TestApp(Gtk.Application):
def __init__(self):
Gtk.Application.__init__(self, application_id=APPID)
def do_activate(self):
window = Gtk4TestTest(self)
window.present()
def main():
app = Gtk4TestApp()
app.run()
if __name__ == '__main__':
main()