【Python】Win11用GTK3实现多文档窗体弹出对话框

138 篇文章 0 订阅
15 篇文章 1 订阅

一、安装PyGObject5b01cef8b8a746f18d8abee71b9e773b.png

PyGObject是GTK+的Python绑定,用于Python中的GTK+3程序。可以使用`pacman`命令来安装PyGObject、GTK+3和其他必要的库。

1. 打开MSYS2终端:

可以直接通过MSYS2的快捷方式打开终端或者从开始菜单中找到MSYS2。

2. 更新MSYS2包管理器(可选,但推荐):

在开始安装之前,保持MSYS2更新是一个好习惯。可以使用以下命令来更新MSYS2的包管理器`pacman`:

 pacman -Syu

如果提示需要重启MSYS2终端,请关闭终端窗口、重新打开并再次运行上述命令。

3. 安装GTK+3和Python绑定:

 

然后,可以使用`pacman`命令来安装PyGObject、GTK+3和其他必要的库。在MSYS2终端中,执行以下命令:

pacman -S mingw-w64-x86_64-python-gobject mingw-w64-x86_64-gtk3

 这个命令将会安装GTK+3及其Python绑定。注意,上面的命令适用于64位的Windows系统。如果正在使用32位系统,请使用`mingw-w64-i686`前缀而不是`mingw-w64-x86_64`。

4. 验证安装:d0c130b1e2634865a3964c3080b3d569.png

为了验证`PyGObject`和GTK+3是否正确安装,可以尝试运行Python并导入模块以检查是否有任何错误发生:

$ python
>>> import gi
>>> gi.require_version('Gtk', '3.0')
>>> from gi.repository import Gtk
>>> 

MSYS2的包名可能与Debian/Ubuntu等Linux发行版中的包名略有差异。在MSYS2中,通常不需要安装例如 gir1.2-gtk-3.0 这样的包,因为相关的文件已经包含在`mingw-w64-x86_64-gtk3`包中。

5. MSYS2终端之外运行Python GTK+3应用程序

当在MSYS2终端之外运行Python GTK+3应用程序时,需要确保将MSYS2的`bin`目录添加到系统环境变量`PATH`中,这样Windows才能找到GTK+的动态链接库(DLLs)。

二、示例代码

写文章-CSDN创作中心相同

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
class MDIApplication(Gtk.Window):
    def __init__(self):
        super(MDIApplication, self).__init__(title='GTK MDI Application')
        self.set_default_size(800, 600)
        # 创建 VBox 和菜单
        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0)
        self.add(vbox)
        menu_bar = Gtk.MenuBar()
        file_menu = Gtk.Menu()
        file_item = Gtk.MenuItem(label='File')
        new_item = Gtk.MenuItem(label='New')
        dialog_item = Gtk.MenuItem(label="Open Dialog")
        file_item.set_submenu(file_menu)
        file_menu.append(new_item)
        file_menu.append(dialog_item)
        menu_bar.append(file_item)
        vbox.pack_start(menu_bar, False, False, 0)
        # 创建 Notebook
        self.notebook = Gtk.Notebook()
        vbox.pack_start(self.notebook, True, True, 0)
        # 信号连接
        new_item.connect("activate", self.on_menu_new_activate)
        dialog_item.connect("activate", self.on_menu_dialog_activate)
    def create_tab_label(self, title):
        label = Gtk.Label(label=title)
        label.show()
        close_image = Gtk.Image.new_from_icon_name("window-close", Gtk.IconSize.MENU)
        button = Gtk.Button()
        button.set_relief(Gtk.ReliefStyle.NONE)
        button.set_focus_on_click(False)
        button.add(close_image)
        button.connect('clicked', self.on_close_tab, label)
        button.show()
        hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=0)
        hbox.pack_start(label, True, True, 0)
        hbox.pack_start(button, False, False, 0)
        hbox.show_all()
        return hbox
    def on_menu_new_activate(self, widget):
        scrolled_window = Gtk.ScrolledWindow()
        document_view = Gtk.TextView()
        scrolled_window.add(document_view)
        tab_label = self.create_tab_label('Untitled Document')
        page_num = self.notebook.append_page(scrolled_window, tab_label)
        self.notebook.set_current_page(page_num)
        scrolled_window.show_all()
    def on_menu_dialog_activate(self, widget):
        dialog = Gtk.Dialog("Edit Text", self, Gtk.DialogFlags.MODAL, (
            Gtk.STOCK_OK, Gtk.ResponseType.OK,
            Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL
        ))
        text_view = Gtk.TextView()
        scroll_window = Gtk.ScrolledWindow()
        scroll_window.add(text_view)
        dialog.get_content_area().pack_start(scroll_window, True, True, 0)
        dialog.show_all()
        response = dialog.run()
        if response == Gtk.ResponseType.OK:
            buffer = text_view.get_buffer()
            start_iter, end_iter = buffer.get_bounds()
            text = buffer.get_text(start_iter, end_iter, True)
            print("Text from dialog:", text)  # 应用实际逻辑
        dialog.destroy()
    def on_close_tab(self, button, tab_label):
        page_num = self.notebook.page_num(tab_label.get_parent())
        self.notebook.remove_page(page_num)
    def run(self):
        self.connect("destroy", Gtk.main_quit)
        self.show_all()
        Gtk.main()
if __name__ == "__main__":
    app = MDIApplication()
    app.run()

运行:

$ python gui.py

将看到:一个顶层窗口,带有创建新文档的菜单项以及一个可以弹出编辑对话框的菜单项。

 

 

  • 40
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

109702008

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值