我不知道如何向 glade/python 中的菜单项添加功能(快速生成)
I don't know how to add a function to a menu Item in glade/python (generated with quickly)
我正在尝试在单击时向菜单项添加一个功能 我希望该功能能够执行
应用程序名为 Simpleadministration
我正在使用的代码位于 Simpleadministrationwindow.py :
## functions
class Handler:
def on_account_add_menu_item_activate():
print ("something")
builder = Gtk.Builder()
builder.add_from_file("data/ui/SimpleadministrationWindow.ui")
builder.connect_signals(Handler())
终端警告:
WARNING:simpleadministration_lib: connect_signals() 'expected handler 'on_account_add_menu_item_activate' in /home/ami/simpleadministration/simpleadministration/SimpleadministrationWindow.py'
我不知道到底出了什么问题,有人可以帮我吗?
额外信息:
(具有从 SimpleadministrationWindow.ui 中选择的项目的菜单结构)
http://i57.tinypic.com/2s6pstx.png(声望低于 10 时无法上传)
尝试提供尽可能多的信息
(SimpleadministrationWindow.ui)
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.18.3 -->
<interface>
<requires lib="gtk+" version="3.0"/>
<requires lib="simpleadministration_window" version="1.0"/>
<!-- interface-local-resource-path ../media -->
<object class="SimpleadministrationWindow" id="simpleadministration_window">
<property name="can_focus">False</property>
<property name="title" translatable="yes">Simpleadministration</property>
<property name="icon">../media/simpleadministration.svg</property>
<child>
<object class="GtkVBox" id="vbox1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">5</property>
<child>
<object class="GtkMenuBar" id="menubar1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkMenuItem" id="mnu_file">
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">_File</property>
<property name="use_underline">True</property>
<child type="submenu">
<object class="GtkMenu" id="menu1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkImageMenuItem" id="mnu_new">
<property name="label">gtk-new</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<accelerator key="n" signal="activate" modifiers="GDK_CONTROL_MASK"/>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="mnu_open">
<property name="label">gtk-open</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<accelerator key="o" signal="activate" modifiers="GDK_CONTROL_MASK"/>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="separatormenuitem3">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="mnu_save">
<property name="label">gtk-save</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<accelerator key="s" signal="activate" modifiers="GDK_CONTROL_MASK"/>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkMenuItem" id="mnu_edit">
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">_Edit</property>
<property name="use_underline">True</property>
<child type="submenu">
<object class="GtkMenu" id="menu2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkMenuItem" id="account_menu_item">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">account</property>
<property name="use_underline">True</property>
<child type="submenu">
<object class="GtkMenu" id="menu3">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkMenuItem" id="account_add_menu_item">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">add</property>
<property name="use_underline">True</property>
<signal name="activate" handler="on_account_add_menu_item_activate" swapped="no"/>
</object>
</child>
<child>
<object class="GtkMenuItem" id="account_change_status_menu_item">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">change status</property>
<property name="use_underline">True</property>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkMenuItem" id="budget_menu_item">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">budget</property>
<property name="use_underline">True</property>
<child type="submenu">
<object class="GtkMenu" id="menu4">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkMenuItem" id="budget_add_menu_item">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">add</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="budget_change_menu_item">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">change</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="budget_delete_menu_item">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">delete</property>
<property name="use_underline">True</property>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<object class="GtkStatusbar" id="statusbar1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">2</property>
<child>
<object class="GtkLabel" id="label2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="xpad">5</property>
<property name="ypad">5</property>
<property name="label" translatable="yes">Status Area</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack_type">end</property>
<property name="position">3</property>
</packing>
</child>
</object>
</child>
</object>
</interface>
这现在有效,但我认为您不应该这样做,您可能不应该做的其他事情是使生成器全局化,但我不知道如何访问我的 windows 另一种方式(我可能 post 另一个问题)但我认为我的整个基础设施需要改变
# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
### BEGIN LICENSE
# This file is in the public domain
### END LICENSE
from locale import gettext as _
from gi.repository import Gtk # pylint: disable=E0611
import logging
logger = logging.getLogger('simpleadministration')
from simpleadministration_lib import Window
from simpleadministration.AboutSimpleadministrationDialog import AboutSimpleadministrationDialog
from simpleadministration.PreferencesSimpleadministrationDialog import PreferencesSimpleadministrationDialog
import tkMessageBox, Tkinter
import functions
class SimpleadministrationWindow(Window):
__gtype_name__ = "SimpleadministrationWindow"
Global_build = ''
def on_account_add_menu_item_activate(self, widget):
window = Global_build.get_object("addaccountwindow")
print ("account add activated")
window.show()
def on_Add_account_action_button_clicked(self, widget):
fname = self.account_First_Name_entry.get_text()
lname = self.account_Last_Name_entry.get_text()
balance = self.account_balance_entry.get_text()
Tkinter.Tk().withdraw()
if tkMessageBox.askquestion(title="account creation",message="Are you sure you want to create this account?"):
#functions.create_account(fname,lname,balance)
functions.update_accounts_array()
window = Global_build.get_object("addaccountwindow")
window.hide()
def finish_initializing(self, builder): # pylint: disable=E1002
"""Set up the main window"""
super(SimpleadministrationWindow, self).finish_initializing(builder)
## don't try this at home
global Global_build
Global_build = builder
self.AboutDialog = AboutSimpleadministrationDialog
self.PreferencesDialog = PreferencesSimpleadministrationDialog
objects = self.builder.get_object
self.Add_account_action_button = objects('Add_account_action_button')
#add account entries
self.account_First_Name_entry = objects('account_First_Name_entry')
self.account_Last_Name_entry = objects('account_Last_Name_entry')
self.account_balance_entry = objects('account_balance_entry')
我建议查看更多有关如何构建 classes 的示例。这个问题的答案包含一个工作示例,您应该能够快速将其适应您的程序:
- MultiWindow error Glade, Gtk and Python
您看到的警告意味着您在 Glade 中定义的处理程序未被 builder.connect_signals(Handler())
方法找到。所以也许 class 没有正确初始化(检查执行顺序?)。
如果您的项目是开源的,您可以将其上传到人们可以 运行 整个程序并提出改进建议的地方。您还可以查看 this 程序,了解有关如何构建更大项目的一些提示。
我正在尝试在单击时向菜单项添加一个功能 我希望该功能能够执行
应用程序名为 Simpleadministration
我正在使用的代码位于 Simpleadministrationwindow.py :
## functions
class Handler:
def on_account_add_menu_item_activate():
print ("something")
builder = Gtk.Builder()
builder.add_from_file("data/ui/SimpleadministrationWindow.ui")
builder.connect_signals(Handler())
终端警告:
WARNING:simpleadministration_lib: connect_signals() 'expected handler 'on_account_add_menu_item_activate' in /home/ami/simpleadministration/simpleadministration/SimpleadministrationWindow.py'
我不知道到底出了什么问题,有人可以帮我吗?
额外信息:
(具有从 SimpleadministrationWindow.ui 中选择的项目的菜单结构) http://i57.tinypic.com/2s6pstx.png(声望低于 10 时无法上传)
尝试提供尽可能多的信息
(SimpleadministrationWindow.ui)
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.18.3 -->
<interface>
<requires lib="gtk+" version="3.0"/>
<requires lib="simpleadministration_window" version="1.0"/>
<!-- interface-local-resource-path ../media -->
<object class="SimpleadministrationWindow" id="simpleadministration_window">
<property name="can_focus">False</property>
<property name="title" translatable="yes">Simpleadministration</property>
<property name="icon">../media/simpleadministration.svg</property>
<child>
<object class="GtkVBox" id="vbox1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">5</property>
<child>
<object class="GtkMenuBar" id="menubar1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkMenuItem" id="mnu_file">
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">_File</property>
<property name="use_underline">True</property>
<child type="submenu">
<object class="GtkMenu" id="menu1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkImageMenuItem" id="mnu_new">
<property name="label">gtk-new</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<accelerator key="n" signal="activate" modifiers="GDK_CONTROL_MASK"/>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="mnu_open">
<property name="label">gtk-open</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<accelerator key="o" signal="activate" modifiers="GDK_CONTROL_MASK"/>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="separatormenuitem3">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="mnu_save">
<property name="label">gtk-save</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<accelerator key="s" signal="activate" modifiers="GDK_CONTROL_MASK"/>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkMenuItem" id="mnu_edit">
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">_Edit</property>
<property name="use_underline">True</property>
<child type="submenu">
<object class="GtkMenu" id="menu2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkMenuItem" id="account_menu_item">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">account</property>
<property name="use_underline">True</property>
<child type="submenu">
<object class="GtkMenu" id="menu3">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkMenuItem" id="account_add_menu_item">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">add</property>
<property name="use_underline">True</property>
<signal name="activate" handler="on_account_add_menu_item_activate" swapped="no"/>
</object>
</child>
<child>
<object class="GtkMenuItem" id="account_change_status_menu_item">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">change status</property>
<property name="use_underline">True</property>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkMenuItem" id="budget_menu_item">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">budget</property>
<property name="use_underline">True</property>
<child type="submenu">
<object class="GtkMenu" id="menu4">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkMenuItem" id="budget_add_menu_item">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">add</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="budget_change_menu_item">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">change</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="budget_delete_menu_item">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">delete</property>
<property name="use_underline">True</property>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<object class="GtkStatusbar" id="statusbar1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">2</property>
<child>
<object class="GtkLabel" id="label2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="xpad">5</property>
<property name="ypad">5</property>
<property name="label" translatable="yes">Status Area</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack_type">end</property>
<property name="position">3</property>
</packing>
</child>
</object>
</child>
</object>
</interface>
这现在有效,但我认为您不应该这样做,您可能不应该做的其他事情是使生成器全局化,但我不知道如何访问我的 windows 另一种方式(我可能 post 另一个问题)但我认为我的整个基础设施需要改变
# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
### BEGIN LICENSE
# This file is in the public domain
### END LICENSE
from locale import gettext as _
from gi.repository import Gtk # pylint: disable=E0611
import logging
logger = logging.getLogger('simpleadministration')
from simpleadministration_lib import Window
from simpleadministration.AboutSimpleadministrationDialog import AboutSimpleadministrationDialog
from simpleadministration.PreferencesSimpleadministrationDialog import PreferencesSimpleadministrationDialog
import tkMessageBox, Tkinter
import functions
class SimpleadministrationWindow(Window):
__gtype_name__ = "SimpleadministrationWindow"
Global_build = ''
def on_account_add_menu_item_activate(self, widget):
window = Global_build.get_object("addaccountwindow")
print ("account add activated")
window.show()
def on_Add_account_action_button_clicked(self, widget):
fname = self.account_First_Name_entry.get_text()
lname = self.account_Last_Name_entry.get_text()
balance = self.account_balance_entry.get_text()
Tkinter.Tk().withdraw()
if tkMessageBox.askquestion(title="account creation",message="Are you sure you want to create this account?"):
#functions.create_account(fname,lname,balance)
functions.update_accounts_array()
window = Global_build.get_object("addaccountwindow")
window.hide()
def finish_initializing(self, builder): # pylint: disable=E1002
"""Set up the main window"""
super(SimpleadministrationWindow, self).finish_initializing(builder)
## don't try this at home
global Global_build
Global_build = builder
self.AboutDialog = AboutSimpleadministrationDialog
self.PreferencesDialog = PreferencesSimpleadministrationDialog
objects = self.builder.get_object
self.Add_account_action_button = objects('Add_account_action_button')
#add account entries
self.account_First_Name_entry = objects('account_First_Name_entry')
self.account_Last_Name_entry = objects('account_Last_Name_entry')
self.account_balance_entry = objects('account_balance_entry')
我建议查看更多有关如何构建 classes 的示例。这个问题的答案包含一个工作示例,您应该能够快速将其适应您的程序:
- MultiWindow error Glade, Gtk and Python
您看到的警告意味着您在 Glade 中定义的处理程序未被 builder.connect_signals(Handler())
方法找到。所以也许 class 没有正确初始化(检查执行顺序?)。
如果您的项目是开源的,您可以将其上传到人们可以 运行 整个程序并提出改进建议的地方。您还可以查看 this 程序,了解有关如何构建更大项目的一些提示。