关闭GUI窗口不会结束程序

时间:2015-08-25 19:51:22

标签: python user-interface gtk python-2.x glade

我一直在阅读很多关于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 questionthis GTK3 documentation example,以下是我从这些来源中提取的不同方法,当然,尝试过:

方法1: onDeleteWindow
方法2 window.connect("destroy", self.Destroy)self.quit
方法3: self.quit()
所有这些都导致了相同的结果 - 幽灵过程。如果按原样复制和粘贴,GTK3文档中的示例也会产生相同的结果。

我的申请和代码

somegui.py:

gtk.main_quit()

somegui.glade:

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本身配对。

2 个答案:

答案 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>