python - 关闭 GUI 窗口并不会结束程序

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

我已经阅读了很多有关 Glade 的内容,并且在过去的几天里一直在使用它来让基本的 Python GUI 应用程序正常工作。我能够显示一个窗口,但每当我关闭它时,我都会在启动程序的终端中看到一个幽灵进程 - 应用程序只是挂起,但窗口被隐藏。该进程只能通过 Kill 来终止 - 它不会响应 Ctrl-C 或 Ctrl-D。

冒险 - 我尝试过什么

我的代码中有一个名为 onDeleteWindow 的函数 对代码的所有修改都发生在该函数内。

我咨询了各种来源,包括 this Stack Overflow questionthis GTK3 documentation example以下是我从这些来源中提取并尝试过的不同方法:

方法一: window.connect("destroy", self.Destroy)
方法2:self.quitself.quit()
方法3: gtk.main_quit()
所有这些都会导致相同的结果——幽灵进程。如果按原样复制并粘贴,GTK3 文档中的示例也会导致相同的结果。

我的应用程序和代码

somegui.py:

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()

somegui.glade:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.16.1 -->
<interface domain="">
  <requires lib="gtk+" version="3.10"/>
  <object class="GtkWindow" id="MainWindow">
    <property name="can_focus">False</property>
    <property name="title" translatable="yes">Hi there</property>
    <property name="startup_id">MainWindow</property>
    <child>
      <object class="GtkBox" id="box1">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="orientation">vertical</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">True</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>
            <property name="relief">none</property>
            <property name="yalign">0.56000000238418579</property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">1</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
</interface>

Gtk版本:(根据XML)3.10
Python版本:(通过启动解释器检查)2.7.6

我做错了什么?过去几天我一直在努力让它工作,但没有任何进展。任何提示将不胜感激。

编辑: .glade 文件似乎存在问题,我已再次复制并粘贴其源代码,希望这会起作用。

编辑2:感谢所有花时间回答的人。问题是处理程序没有与 GUI 本身配对。

最佳答案

首先:您是否手动编辑 XML?您的 Glade 文件已损坏,因为您向窗口添加了 2 个子窗口。这是不允许的。您需要向窗口添加一个容器(例如 GtkBox),然后将所有其他小部件放入该框中。

在您的 Pyhthon 代码中,您还调用 self.quit()但在本例中 self 只是一个 Python 对象。并且它没有继承GTK的任何方法。再看一下 Python-GTK3-Tutorial ( https://python-gtk-3-tutorial.readthedocs.org/en/latest/ ) 中如何定义类。

正如 Leonardo 提到的,您还需要在 Glade 中定义信号,然后在 Python 中使用相同的名称,以便连接处理程序。您需要在此处设置窗口销毁信号:

enter image description here

这是我将使用的基本设置:

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>

关于python - 关闭 GUI 窗口并不会结束程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32212839/

相关文章:

android - Android 开发中的 UI 访问

Android:如何在 TabWidget 上删除选定的选项卡突出显示颜色和按下时突出显示

python - 使用函数时如何在Tkinter中销毁小部件

Glade/GTK 的 CSS

python - 用公式逻辑决定游戏结果

python - 给定一个字典迭代器,得到字典

python - 使用 Selenium 解析 html - 类名包含空格

python - MongoKit "ImportError: No module named objectid "错误

python - 在 Gtk+ 程序中嵌入 IPython shell

linux - GTK+ 下划线 - body 疼痛