请注意这应用程序是如何通过activate信号和.run()方法调用实现主循环的:
import gi
gi.require_version("Gtk", "4.0")
from gi.repository import Gtk
def on_activate(app):
win = Gtk.ApplicationWindow(application=app)
btn = Gtk.Button(label="Hello, World!")
btn.connect('clicked', lambda x: win.close())
win.set_child(btn)
win.present()
app = Gtk.Application(application_id='org.gtk.Example')
app.connect('activate', on_activate)
app.run(None)更正一下:我认为这个activate信号是作为一个事件发出的,用于同步创建GTK窗口、小部件等,这样在应用程序准备好之前,GUI部件就不会发生竞争。还有什么要说的?
然后,当窗口、小部件等全部绘制完毕时,应用程序就会被.run()卡在一个主循环中。这样,应用程序不会立即退出,而是等待用户输入。
让我烦恼的是,我看不到Application类的价值。正因为如此,我们在信号activate上有一个事件告诉“哦,应用程序已经准备好了”,但是这个应用程序到底是什么呢?为什么我不能直接在.run()上做Gtk.ApplicationWindow,甚至Gtk.Window
为了回答上述问题,我发明/发现了这样一个问题,如果得到回答,我认为它将解决我的沮丧:
问题:,在不使用
Application或ApplicationWindow类的情况下,运行GUI应用程序的GT4方法是什么?
背景
我来自TKinter背景。在那里,我可以简单地说出这样的话来制作一个应用程序:
import tkinter
class MyApp(tkinter.Tk):
def __init__(self):
super().__init__()
self.title('some title')
if __name__ == '__main__':
myapp = MyApp()
myapp.mainloop()它感觉简单得多,没有创建两个对象的意大利面(比如在GTK4中),通过它们发出的信号仅仅是为了得到一个.run()主循环。
但是我必须在这个项目中使用GTK4,Tkinter不是一个选项。所以我必须为我学习合适的GTK4。
发布于 2022-06-28 23:23:16
根据文档:"GtkApplication是用于编写应用程序的高级API。
它支持以一种方便的方式编写GTK应用程序的许多方面,而无需强制执行一刀切的模型。
目前,GtkApplication处理GTK初始化、应用程序唯一性、会话管理,通过导出操作和菜单提供一些基本的脚本性和桌面shell集成,并管理一个toplevel窗口列表,这些窗口的生命周期自动绑定到应用程序的生命周期。虽然GtkApplication在普通GtkWindows中运行良好,但建议与GtkApplicationWindow一起使用它。“
来源:https://docs.gtk.org/gtk4/class.Application.html
来自Gtk3的不会在Gtk4上工作。
这样做是可行的:
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk
win = Gtk.Window()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()但是,如果将"3.0“改为"4.0”不起作用,原因是迁移指南:
"GTK 4删除了gtk_main_*系列的API。推荐的替代方法是GtkApplication“
Gtk对Tk有一种不同的方法,您需要使用它。
而且GTK4仍然是新的,您将找到更多关于Gtk3代码的示例,因此,请将迁移指南放在手边。
https://stackoverflow.com/questions/72792476
复制相似问题