目的
コンテンツ領域に複数のWidgetを載せたGtk.Dialogを作成する場合、その記述部分は大きくなりGtk.Dialogを呼び出す部分にすべてを記入すると、プログラムが読みにくくなります。
それを防ぐためには、Gtk.Dialogを継承したクラスを用いてダイアログを定義します。こうすることにより、ダイアログの定義と表示の指示を分けて記述することができるようになり、プログラムは読み易いものになります。
今回はGtk.Dialogのクラスを定義して、その定義したクラスを表示したり、定義したダイアログ内のWidgetの値を取得する方法を紹介します。
Gtk.Dialogの設定
ダイアログをクラスにするのは、以下の手順でおこないます。
1. ‘class GtkDialog(Gtk.Dialog):’と記入して、Gtk.Dilaogを継承したクラスを作成する。
2. ’def __init__(self, parent):’の中に、コンテナ領域やボタンの内容を記入する。
class GtkDialog(Gtk.Dialog):
def __init__(self, parent):
Gtk.Dialog.__init__(
self, title='Dialog Test',
transient_for=parent,
default_width=250, default_height=150,
)
self.add_buttons(
'キャンセル', Gtk.ResponseType.CANCEL,
'OK', Gtk.ResponseType.OK
)
self.label = Gtk.Label(
label='ダイアログ', vexpand=True)
box = self.get_content_area()
box.append(self.label)
self.show()
Gtk.Dialogのボタンを押した場合の処理
作成したダイアログを取り扱うためには、
1. ‘dialog = GtkDialog(self)’で読み込み、
2. ‘dialog.connect(‘response’, self.on_dialog_response)’で、’response’とダイアログの
ボタンを押した場合の処理をおこなう関数とを紐付けます。
# dialogの呼び出し部分
def on_button_clicked(self, button):
dialog = GtkDialog(self)
dialog.connect('response', self.on_dialog_response)
# dialogのボタンが押された場合の処理部分
def on_dialog_response(self, dialog, response_id):
if response_id == Gtk.ResponseType.OK:
print('OK を押しました。')
print(dialog.label.get_text())
elif response_id == Gtk.ResponseType.CANCEL:
print('キャンセル を押しました。')
else:
print('Esc もしくは☓を押しました。')
dialog.destroy()
Gtk.Dialogのコンテナ領域に載せたWidgetから値を取得する
Gtk.Dialogのコンテナ領域に載せたWidgetから値を取得するには、そのWidgetをself.labelのように定義して、クラス外から値を取得できるようにして、’クラス名.label’により取得します。
# 定義部分
self.label = Gtk.Label(
label='ダイアログ', vexpand=True)
# 値の取得部分
def on_dialog_response(self, dialog, response_id):
if response_id == Gtk.ResponseType.OK:
print('OK を押しました。')
print(dialog.label.get_text())
…省略…
サンプルプログラム
以下のサンプルプログラムを実行すると、左図のようなボタン付きの画面が表示されます。動作は、Gtk.Dialogの使用について①のサンプルプログラムと同じであり、ダイアログをクラスに変更しただけのプログラムです。
import gi
gi.require_version('Gtk', '4.0')
from gi.repository import Gtk
APPID = 'com.github.taniyoshima.g4_fblog_dialog2'
class GtkDialog(Gtk.Dialog):
def __init__(self, parent):
Gtk.Dialog.__init__(
self, title='Dialog Test',
transient_for=parent,
default_width=250, default_height=150,
)
self.add_buttons(
'キャンセル', Gtk.ResponseType.CANCEL,
'OK', Gtk.ResponseType.OK
)
self.label = Gtk.Label(
label='ダイアログ', vexpand=True)
box = self.get_content_area()
box.append(self.label)
self.show()
class Gtk4TestTest(Gtk.Window):
def __init__(self, app):
Gtk.Window.__init__(
self, application=app, title='Gtk.Dialog Test')
box = Gtk.Box(
margin_top=30, margin_bottom=30,
margin_start=30, margin_end=30,
width_request=250, height_request=150,
)
button = Gtk.Button(label='ダイヤログ表示')
button.connect('clicked', self.on_button_clicked)
box.append(button)
self.set_child(box)
def on_button_clicked(self, button):
dialog = GtkDialog(self)
dialog.connect('response', self.on_dialog_response)
def on_dialog_response(self, dialog, response_id):
if response_id == Gtk.ResponseType.OK:
print('OK を押しました。')
print(dialog.label.get_text())
elif response_id == Gtk.ResponseType.CANCEL:
print('キャンセル を押しました。')
else:
print('Esc もしくは☓を押しました。')
dialog.destroy()
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()