Gio SimpleAction 调用函数
Gio SimpleAction to call a function
我在 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.py
、class 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
。
但我不知道如何。
请帮助
您的问题是 TreeView
属性仅存在于 MenuManager
class 上,而当您调用 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)
让我为您分解代码。
#in main file
MenuElem = menu.MenuManager
这里你设置MenuElem
指向menu.MenuManager
class。可能您打算在此处初始化对象,使 MenuElem
成为 menu.MenuManager
class 的 实例 。这样就调用了 MenuManager
class 的 __init__
函数。因此代码应该是:
#in main file
MenuElem = menu.MenuManager()
那么下一个出错的部分就在这里:
def file_open_clicked(self, widget):
如果我们检查 activate
信号的 docs,我们会看到它有 2 个参数。所以目前没有初始化对象 self
设置为第一个参数即 SimpleAction
并且 widget
设置为激活 parameter
.
但是由于我们现在已经初始化了 MenuManager
对象,因此 file_open_clicked
函数将获得 3 个输入参数,即 self
、SimpleAction
和 parameter
。因此我们需要像这样接受它们:
def file_open_clicked(self, simpleAction, parameter):
现在代码可以工作了,因为 self
实际上是一个具有属性 TreeView
的对象。 (仅供参考 Python 变量和属性通常以小写形式书写)
我在 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.py
、class 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
。
但我不知道如何。
请帮助
您的问题是 TreeView
属性仅存在于 MenuManager
class 上,而当您调用 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)
让我为您分解代码。
#in main file
MenuElem = menu.MenuManager
这里你设置MenuElem
指向menu.MenuManager
class。可能您打算在此处初始化对象,使 MenuElem
成为 menu.MenuManager
class 的 实例 。这样就调用了 MenuManager
class 的 __init__
函数。因此代码应该是:
#in main file
MenuElem = menu.MenuManager()
那么下一个出错的部分就在这里:
def file_open_clicked(self, widget):
如果我们检查 activate
信号的 docs,我们会看到它有 2 个参数。所以目前没有初始化对象 self
设置为第一个参数即 SimpleAction
并且 widget
设置为激活 parameter
.
但是由于我们现在已经初始化了 MenuManager
对象,因此 file_open_clicked
函数将获得 3 个输入参数,即 self
、SimpleAction
和 parameter
。因此我们需要像这样接受它们:
def file_open_clicked(self, simpleAction, parameter):
现在代码可以工作了,因为 self
实际上是一个具有属性 TreeView
的对象。 (仅供参考 Python 变量和属性通常以小写形式书写)