Gtk.Application 在精灵中
Gtk.Application in Genie
我在 Genie 中找不到关于 "Gtk.Application" 的信息或示例。
精灵中Gtk.Applicationclass的正确使用方法是什么?
美好的一天,谢谢你
编辑:我不知道这是否是最好的方法,但我的代码是这样的:
// compila con valac --pkg gtk+-3.0 nombre_archivo.gs
uses Gtk
class MyApplication : Gtk.Application
def override activate ()
var window = new Gtk.ApplicationWindow (this)
window.title = "Welcome to GNOME"
window.set_default_size (400, 400)
window.show ()
init
new MyApplication ().run (args)
你的例子对我来说是一个很好的开始,但我认为你应该添加一个应用程序 ID 和一些应用程序标志。
三个好资源是GTK+3 Reference Manual's documentation for GtkApplication, the GNOME Wiki "HowDoI" section's page called "Using GtkApplication" and the GIO Reference Manual's documentation for GApplication。 GApplication,或 Vala 绑定中的 GLib.Application,是 GtkApplication 的父 class。
"HowDoI" 页面建议:
GtkApplication does not implement main() for you. You must do so yourself. Your main() function should be as small as possible and do almost nothing except creating your GtkApplication and running it. The "real work" should always be done in response to the signals fired by GtkApplication.
您在 Genie 中的 main()
函数是:
init
new MyApplication().run( args )
这就很简单了。
"HowDoI" 页面还建议:
When your application starts, the startup signal will be fired. This gives you a chance to perform initialisation tasks that are not directly related to showing a new window. After this, depending on how the application is started, either activate or open will be called next.
您的示例没有执行任何启动任务,这很好。所以不需要使用 startup
信号,但是你通过用 def override activate ()
覆盖虚函数来使用 activate
信号。 activate
实际上是 Gtk.Application 运行 时的默认信号,但是当设置适当的 ApplicatonFlags
时可以发出替代信号。例如,如果设置了 HANDLES_OPEN
标志,那么如果有未解析的命令行参数,将发送 open
信号。未解析的参数被视为文件名或 URI。默认标志是 FLAGS_NONE
,稍后将在示例代码中明确说明。
GTK+3 参考手册中关于 GtkApplication 的部分指出:
Currently, GtkApplication handles GTK+ initialization, application uniqueness, session management, provides some basic scriptability and desktop shell integration by exporting actions and menus and manages a list of toplevel windows whose life-cycle is automatically tied to the life-cycle of your application...If no application ID is given then some features (most notably application uniqueness) will be disabled. A null application ID is only allowed with GTK+ 3.6 or later.
应用程序 ID 应至少由两个用点分隔的名称组成。如果应用程序是 运行 第二次,则第二个实例的 window 成为第一个应用程序的一部分,但第二个应用程序实例随后关闭。这是应用程序的唯一性功能,可以使用 ApplicationFlags.NON_UNIQUE
禁用。应用程序使用应用程序 ID 在会话总线上注册。如果您正在使用 Linux,您可以使用像 D-Feet 这样的工具来查看应用程序出现在会话总线上,以及当您再次 运行 应用程序时会发生什么(您需要刷新视图).
一些代码的时间:
// compila con valac --pkg gtk+-3.0 nombre_archivo.gs
[indent=4]
uses Gtk
init
new MyApplication( "org.genie.Example.SimpleGtkApplication",
ApplicationFlags.FLAGS_NONE
).run( args )
class MyApplication:Gtk.Application
construct( application_id:string, flags:ApplicationFlags )
if !id_is_valid( application_id )
error( "application id %s is not valid", application_id )
this.application_id = application_id
this.flags = flags
def override activate ()
var window = new Gtk.ApplicationWindow( this )
window.title = "Welcome to GNOME"
window.set_default_size( 400, 400 )
window.show_all()
这会添加一个应用程序 ID 并使 ApplicationFlags
明确。
嗯,我还在进步。
我用 Gtk.Application 编写了运行简单屏幕截图的代码:
// compila con valac --pkg gtk+-3.0 nombre_archivo.gs
uses Gtk
init
new MyApplication( "captura.escritorio",
ApplicationFlags.FLAGS_NONE
).run( args )
class MyApplication:Gtk.Application
construct( application_id:string, flags:ApplicationFlags )
if !id_is_valid( application_id )
error( "application id %s is not valid", application_id )
this.application_id = application_id
this.flags = flags
def override activate ()
var window = new Gtk.ApplicationWindow( this )
window.title = "Escritorio"
window.border_width = 10
window.window_position = WindowPosition.CENTER
var grid = new Gtk.Grid()
window.add (grid)
var boton = new Button.with_label ("Capturar")
boton.clicked.connect(btn)
boton.border_width = 10
grid.attach(boton, 0, 0, 2, 1)
var boton_salir = new Button.with_label ("Salir")
boton_salir.clicked.connect(btn_salir)
boton_salir.border_width = 10
grid.attach(boton_salir, 2, 0, 2, 1)
window.show_all()
def btn(btn:Button)
escritorio: Gdk.Window = Gdk.get_default_root_window()
ancho: int = escritorio.get_width()
alto: int = escritorio.get_height()
screenshot: Gdk.Pixbuf = Gdk.pixbuf_get_from_window(escritorio, 0, 0, ancho, alto)
try
screenshot.save("screenshot.png","png")
except e: GLib.Error
stderr.printf ("Error: %s\n", e.message)
def btn_salir(btn:Button)
this.quit()
我想放在这里是因为Gtk.Application和Genie的例子很少
谢谢
我在 Genie 中找不到关于 "Gtk.Application" 的信息或示例。
精灵中Gtk.Applicationclass的正确使用方法是什么?
美好的一天,谢谢你
编辑:我不知道这是否是最好的方法,但我的代码是这样的:
// compila con valac --pkg gtk+-3.0 nombre_archivo.gs
uses Gtk
class MyApplication : Gtk.Application
def override activate ()
var window = new Gtk.ApplicationWindow (this)
window.title = "Welcome to GNOME"
window.set_default_size (400, 400)
window.show ()
init
new MyApplication ().run (args)
你的例子对我来说是一个很好的开始,但我认为你应该添加一个应用程序 ID 和一些应用程序标志。
三个好资源是GTK+3 Reference Manual's documentation for GtkApplication, the GNOME Wiki "HowDoI" section's page called "Using GtkApplication" and the GIO Reference Manual's documentation for GApplication。 GApplication,或 Vala 绑定中的 GLib.Application,是 GtkApplication 的父 class。
"HowDoI" 页面建议:
GtkApplication does not implement main() for you. You must do so yourself. Your main() function should be as small as possible and do almost nothing except creating your GtkApplication and running it. The "real work" should always be done in response to the signals fired by GtkApplication.
您在 Genie 中的 main()
函数是:
init
new MyApplication().run( args )
这就很简单了。
"HowDoI" 页面还建议:
When your application starts, the startup signal will be fired. This gives you a chance to perform initialisation tasks that are not directly related to showing a new window. After this, depending on how the application is started, either activate or open will be called next.
您的示例没有执行任何启动任务,这很好。所以不需要使用 startup
信号,但是你通过用 def override activate ()
覆盖虚函数来使用 activate
信号。 activate
实际上是 Gtk.Application 运行 时的默认信号,但是当设置适当的 ApplicatonFlags
时可以发出替代信号。例如,如果设置了 HANDLES_OPEN
标志,那么如果有未解析的命令行参数,将发送 open
信号。未解析的参数被视为文件名或 URI。默认标志是 FLAGS_NONE
,稍后将在示例代码中明确说明。
GTK+3 参考手册中关于 GtkApplication 的部分指出:
Currently, GtkApplication handles GTK+ initialization, application uniqueness, session management, provides some basic scriptability and desktop shell integration by exporting actions and menus and manages a list of toplevel windows whose life-cycle is automatically tied to the life-cycle of your application...If no application ID is given then some features (most notably application uniqueness) will be disabled. A null application ID is only allowed with GTK+ 3.6 or later.
应用程序 ID 应至少由两个用点分隔的名称组成。如果应用程序是 运行 第二次,则第二个实例的 window 成为第一个应用程序的一部分,但第二个应用程序实例随后关闭。这是应用程序的唯一性功能,可以使用 ApplicationFlags.NON_UNIQUE
禁用。应用程序使用应用程序 ID 在会话总线上注册。如果您正在使用 Linux,您可以使用像 D-Feet 这样的工具来查看应用程序出现在会话总线上,以及当您再次 运行 应用程序时会发生什么(您需要刷新视图).
一些代码的时间:
// compila con valac --pkg gtk+-3.0 nombre_archivo.gs
[indent=4]
uses Gtk
init
new MyApplication( "org.genie.Example.SimpleGtkApplication",
ApplicationFlags.FLAGS_NONE
).run( args )
class MyApplication:Gtk.Application
construct( application_id:string, flags:ApplicationFlags )
if !id_is_valid( application_id )
error( "application id %s is not valid", application_id )
this.application_id = application_id
this.flags = flags
def override activate ()
var window = new Gtk.ApplicationWindow( this )
window.title = "Welcome to GNOME"
window.set_default_size( 400, 400 )
window.show_all()
这会添加一个应用程序 ID 并使 ApplicationFlags
明确。
嗯,我还在进步。
我用 Gtk.Application 编写了运行简单屏幕截图的代码:
// compila con valac --pkg gtk+-3.0 nombre_archivo.gs
uses Gtk
init
new MyApplication( "captura.escritorio",
ApplicationFlags.FLAGS_NONE
).run( args )
class MyApplication:Gtk.Application
construct( application_id:string, flags:ApplicationFlags )
if !id_is_valid( application_id )
error( "application id %s is not valid", application_id )
this.application_id = application_id
this.flags = flags
def override activate ()
var window = new Gtk.ApplicationWindow( this )
window.title = "Escritorio"
window.border_width = 10
window.window_position = WindowPosition.CENTER
var grid = new Gtk.Grid()
window.add (grid)
var boton = new Button.with_label ("Capturar")
boton.clicked.connect(btn)
boton.border_width = 10
grid.attach(boton, 0, 0, 2, 1)
var boton_salir = new Button.with_label ("Salir")
boton_salir.clicked.connect(btn_salir)
boton_salir.border_width = 10
grid.attach(boton_salir, 2, 0, 2, 1)
window.show_all()
def btn(btn:Button)
escritorio: Gdk.Window = Gdk.get_default_root_window()
ancho: int = escritorio.get_width()
alto: int = escritorio.get_height()
screenshot: Gdk.Pixbuf = Gdk.pixbuf_get_from_window(escritorio, 0, 0, ancho, alto)
try
screenshot.save("screenshot.png","png")
except e: GLib.Error
stderr.printf ("Error: %s\n", e.message)
def btn_salir(btn:Button)
this.quit()
我想放在这里是因为Gtk.Application和Genie的例子很少
谢谢