我已经阅读了很多有关 Glade 的内容,并且在过去的几天里一直在使用它来让基本的 Python GUI 应用程序正常工作。我能够显示一个窗口,但每当我关闭它时,我都会在启动程序的终端中看到一个幽灵进程 - 应用程序只是挂起,但窗口被隐藏。该进程只能通过 Kill 来终止 - 它不会响应 Ctrl-C 或 Ctrl-D。
冒险 - 我尝试过什么
我的代码中有一个名为 onDeleteWindow
的函数
对代码的所有修改都发生在该函数内。
我咨询了各种来源,包括 this Stack Overflow question和 this GTK3 documentation example以下是我从这些来源中提取并尝试过的不同方法:
方法一: window.connect("destroy", self.Destroy)
方法2:self.quit
或self.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 中使用相同的名称,以便连接处理程序。您需要在此处设置窗口销毁信号:
这是我将使用的基本设置:
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/