Gio SimpleAction 调用函数

Posted

技术标签:

【中文标题】Gio SimpleAction 调用函数【英文标题】:Gio SimpleAction to call a function 【发布时间】:2016-05-16 02:19:42 【问题描述】:

我在 Gtk3 应用程序中使用 Gio 操作制作了菜单。 菜单项创建为:

#in main file
MenuElem = menu.MenuManager
# Open Menu
action = Gio.SimpleAction(name="open")
action.connect("activate", MenuElem.file_open_clicked)
self.add_action(action)

file_open_clickedmenu.pyclass MenuManager 中,定义为:

import gi
import pybib
import view
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk


class MenuManager:
    def __init__(self):
        self.parsing = pybib.parser()
        self.TreeView = view.treeview()
    #file_open_clicked
    #in menu.py
    def file_open_clicked(self, widget):
        dialog = Gtk.FileChooserDialog("Open an existing fine", None,
                                       Gtk.FileChooserAction.OPEN,
                                       (Gtk.STOCK_CANCEL,
                                        Gtk.ResponseType.CANCEL,
                                        Gtk.STOCK_OPEN, Gtk.ResponseType.OK))
        response = dialog.run()
        if response == Gtk.ResponseType.OK:
            filename = dialog.get_filename()
            dialog.destroy()
            self.TreeView.bookstore.clear()
            self.TreeView.viewer(self.parsing.booklist)
            # self.TreeView.view.set_model()
        elif response == Gtk.ResponseType.CANCEL:
            print("Cancel clicked")
            dialog.destroy()

我收到错误:

Traceback (most recent call last):
  File "/home/rudra/Devel/mkbib/Python/src/menu.py", line 81, in file_open_clicked
    self.TreeView.bookstore.clear()
AttributeError: 'SimpleAction' object has no attribute 'TreeView'

我知道SimpleAction 需要多一个选项,应该调用TreeView。 但我不知道怎么做。 请帮忙

【问题讨论】:

请显示更多封闭代码,特别是MenuElem类的定义。 已更新。请看一下 【参考方案1】:

让我为你分解你的代码。

#in main file
MenuElem = menu.MenuManager

在这里您将MenuElem 设置为指向menu.MenuManager 类。可能您打算在这里初始化对象,使MenuElem 成为menu.MenuManagerclass 的instance。这样MenuManager 类的__init__ 函数就被调用了。因此代码应该是:

#in main file
MenuElem = menu.MenuManager()

那么接下来出现问题的部分就在这里:

def file_open_clicked(self, widget):

如果我们检查docs 中的activate 信号,我们会看到它有2 个参数。所以目前没有初始化对象self设置为第一个参数即SimpleActionwidget设置为激活parameter

但是由于我们现在已经初始化了 MenuManager 对象,file_open_clicked 函数将获得 3 个输入参数,即 selfSimpleActionparameter。因此我们需要像这样接受它们:

def file_open_clicked(self, simpleAction, parameter):

现在代码可以工作了,因为self 实际上是一个具有TreeView 属性的对象。 (仅供参考,Python 中的变量和属性通常用小写字母书写)

【讨论】:

【参考方案2】:

您的问题是TreeView 属性仅存在于MenuManager 类上,而当您调用file_open_clicked 方法时,第一个参数(self)是创建的SimpleAction 对象。使用 MenuManager 实例file_open_clicked 方法可以解决此问题。

menu_manager = MenuManager()
action = Gio.SimpleAction(name="open")
action.connect("activate", menu_manager.file_open_clicked)

【讨论】:

这就是我所做的......看,file_open_clicked 是用MenuElem 实例调用的。

以上是关于Gio SimpleAction 调用函数的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 上使用 cabal 安装 pango 和 GIO 时不可见 CULlong 类型的构造函数

linux应用程序中如何操作gpio口

如何使用 dbus/gio 向 bluez 注册个人资料?

Gio.MemoryInputStream 关​​闭时不释放内存

main函数可以被其他函数调用吗?

php如何调用函数