我已经在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_clicked位于menu.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
但是我不知道如何。
请帮助

最佳答案

让我为您分解您的代码。

#in main file
MenuElem = menu.MenuManager


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

#in main file
MenuElem = menu.MenuManager()


然后出现问题的下一部分在这里:

def file_open_clicked(self, widget):


如果我们检查docs中的activate信号,我们会看到它有2个参数。因此,当前未初始化对象self设置为第一个参数,即SimpleAction,而widget设置为激活parameter

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

def file_open_clicked(self, simpleAction, parameter):


现在,代码将起作用,因为self实际上是具有属性TreeView的对象。 (仅供参考,Python变量和属性通常以小写形式编写)

10-08 02:47