Python 如何检测是否显示Gtk小部件

Python 如何检测是否显示Gtk小部件,python,widget,gtk,Python,Widget,Gtk,这是一个相当直截了当的问题 我如何知道小部件是否已经显示?是否有功能?您可以使用此功能检查窗口是否可见- if mywindow.props.visible: pass # do stuff here GtkWidget上的visible属性只会告诉您小部件是否“应该”出现在UI中。它并没有告诉你它是否真的已经存在 这一点很重要,因为当您第一次创建小部件时,在GTK重新进入主循环之前,它实际上不会显示。在它显示出来之前,诸如大小协商之类的事情还没有发生,后端存储(GDK资源等)也没有分配。例如

这是一个相当直截了当的问题


我如何知道小部件是否已经显示?是否有功能?

您可以使用此功能检查窗口是否可见-

if mywindow.props.visible: pass # do stuff here

GtkWidget
上的
visible
属性只会告诉您小部件是否“应该”出现在UI中。它并没有告诉你它是否真的已经存在

这一点很重要,因为当您第一次创建小部件时,在GTK重新进入主循环之前,它实际上不会显示。在它显示出来之前,诸如大小协商之类的事情还没有发生,后端存储(GDK资源等)也没有分配。例如,在Python中:

Gtk.Window w
w.show_all() # sets "visible" property to True
alloc = w.get_allocation() # Error -- size hasn't been allocated yet!
gdk_window = w.get_window() # Error -- no GDK window yet!

要了解小部件是否已实际显示,您需要使用
realized
属性。您可以连接到
realize
信号来执行只有在小部件实际显示后才能执行的操作,如上面的示例所示

基于这里的一些其他答案和一些实验,我将此代码用作pytest:

import pytest as pytest

from gi.repository import Gtk
from gi.repository import Wnck

from GTKGUITestHelper import GTKGUITestHelper
import GTKSignal
from gui.XLDMainWindow import XLDMainWindow


class TestTemplate:

    xld_main_window = None

    def test_window_created(self, create_xld_main_window):
        """This test tests, whether or not the Gtk.Window has been created.
        """

        screen = Wnck.Screen.get_default()
        screen.force_update() # recommended per Wnck documentation

        window_found = False

        # loop all windows
        for window in screen.get_windows():
            if window.has_name():
                if window.get_name() == self.xld_main_window.get_title():
                    window_found = True
        assert window_found, 'The Gtk.Window named {window_name} has not been found.'.format(window_name=self.xld_main_window.get_title())

        # clean up Wnck (saves resources, check documentation)
        window = None
        screen = None
        Wnck.shutdown()

    @pytest.fixture()
    def create_xld_main_window(self):
        self.xld_main_window = XLDMainWindow()
        self.xld_main_window.connect(GTKSignal.DELETE, Gtk.main_quit)
        self.xld_main_window.show_all()
        GTKGUITestHelper.refresh_gui()
以下是
GTKGUITestHelper

from gi.repository import Gtk
import time


class GTKGUITestHelper():
    def __init__(self):
        pass

    @classmethod
    def refresh_gui(cls, delay=0):
        #print('delay', delay)
        while Gtk.events_pending():
            Gtk.main_iteration_do(blocking=False)
        time.sleep(float(delay))
如果在我读过的一篇博客上正确地找到了这些代码,那么这些代码显然来自于《奇维》的内部。我就是从那里拿的

GTKSignal
只是一个Python文件,其中包含一些信号字符串常量,帮助我记住信号名称并避免任何打字错误

XLDMainWindow
可以是您的Gtk。窗口,只需交换即可


这个解决方案使用了
Wnck
,但我想因为它也是从
gi.repository
导入的,所以添加这个依赖项并没有什么坏处。不过我可能错了。

您可以检查小部件以前是否创建为对象,然后您可以检查它是否可见。@badc0re,您能给我一个演示吗?无论如何,在大多数情况下,
可见
是正确的使用属性。小部件是在第一次绘制时实现的,即使以后隐藏它们,它们也会保持实现状态。