我一直在阅读很多关于Glade的文章,并且在过去的几天里一直在玩它以获得基本的Python GUI应用程序。我能够显示一个窗口,但每当我关闭它时,我在启动程序的终端中得到一个ghost进程 - 应用程序只是挂起,但窗口是隐藏的。该过程只能通过kill杀死 - 它不响应Ctrl-C或Ctrl-D。
我的代码中有一个名为Polymer({
is : "my-element",
openForm: function(e) {
e.srcElement.getAttribute("data-id"); // does not work
e.target.getAttribute("data-id"); // neither works
},
color: function(c) {
return "color:" + c;
}
});
的函数
代码的所有修改都发生在这个函数中。
我咨询了各种来源,包括this Stack Overflow question和this GTK3 documentation example,以下是我从这些来源中提取的不同方法,当然,尝试过:
方法1: onDeleteWindow
方法2 :window.connect("destroy", self.Destroy)
或self.quit
方法3: self.quit()
所有这些都导致了相同的结果 - 幽灵过程。如果按原样复制和粘贴,GTK3文档中的示例也会产生相同的结果。
gtk.main_quit()
from gi.repository import Gtk
import sys
class Handler:
def onDeleteWindow(self, *args):
self.quit()
def onButtonPressed(self, button):
print("Hello World!")
builder = Gtk.Builder()
builder.add_from_file("somegui.glade")
builder.connect_signals(Handler())
window = builder.get_object("MainWindow")
window.show_all()
builder.get_objects()
Gtk.main()
Gtk版 :(根据XML)3.10
Python版本:(通过启动解释器检查)2.7.6
我做错了什么?我一直试图让它在过去几天工作,没有任何进展。任何提示都将不胜感激。
编辑:看来.glade文件存在问题,我已经复制并粘贴了其来源,希望这会有效。
EDIT2:感谢所有花时间回答的人。问题是处理程序没有与GUI本身配对。
答案 0 :(得分:1)
我无法使用Glade打开此connect_signals
文件。该应用程序报告过早关闭标签。
无论如何,您没有将信号连接到处理程序。如果您使用Glade来映射哪些方法将处理来自哪些小部件的信号,.ui
方法将起作用。要将信号映射到方法,请使用Glade打开.glade
或<template is="dom-bind" id="app">
<iron-ajax id="itemAPI"
url="/api/item"
params='{{createIdParam(itemId)}}'
handle-as="json"
on-response="loadItem"
debounce-duration="1000">
</iron-ajax>
</template>
<script>
app.createIdParam = function(id) { return {id:id}; }
</script>
文件,选择窗口小部件(例如,按钮),然后单击右窗格下部的“信号”选项卡。通常,您只需要在“处理程序”列中的对应于您要处理的信号的行中编写方法名称。
答案 1 :(得分:1)
首先:您是手动编辑XML吗?您的Glade文件已损坏,因为您向窗口添加了2个子项。这是不允许的。您需要在窗口中添加一个容器(例如GtkBox),然后将所有其他小部件放在该框中。
在你的Pyhthon代码中,你也调用self.quit()
但在这种情况下,self只是一个Python对象。并且它不会从GTK继承任何方法。再看看如何在Python-GTK3-Tutorial(GitHub)中定义类。
正如Leonardo所说,您还需要在Glade中定义信号,然后在Python中使用相同的名称,以便连接处理程序。这是您需要设置窗口销毁信号的地方:
https://python-gtk-3-tutorial.readthedocs.org/en/latest/
以下是我将使用的基本设置:
from gi.repository import Gtk
import sys
class Handler(object):
def __init__(self, builder):
self.builder = builder
self.window = builder.get_object("window1")
self.window.show_all()
def on_window1_destroy(self, *args):
Gtk.main_quit()
def on_button1_clicked(self, button):
print("Hello World!")
builder = Gtk.Builder()
builder.add_from_file("somegui.glade")
hdlr = Handler(builder)
builder.connect_signals(hdlr)
Gtk.main()
用户界面:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.18.3 -->
<interface>
<requires lib="gtk+" version="3.12"/>
<object class="GtkWindow" id="window1">
<property name="can_focus">False</property>
<property name="title" translatable="yes">Hi there</property>
<signal name="destroy" handler="on_window1_destroy" swapped="no"/>
<child>
<object class="GtkBox" id="box1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="homogeneous">True</property>
<child>
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Hi There!</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button1">
<property name="label" translatable="yes">Awesome Button!</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<signal name="clicked" handler="on_button1_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</interface>