如何在调用或 os.system 之前在 Python 中隐藏 GTK 窗口

如何在调用或 os.system 之前在 Python 中隐藏 GTK 窗口

因此,我正在开发一个 Python/GTK 应用程序,在显示助手后,它会隐藏助手的窗口并运行外部应用程序。问题是,如果在命令之后使用或window.hide()进行应用程序调用,则该方法不起作用。调用完成后,窗口似乎挂起,直到所有调用完成才会消失。那么...可以做什么?os.system()call()

答案1

在谷歌上搜索了一段时间可能的解决方案后,我找到了一个简单的答案,它等待 GTK 完成所有工作任务。你可能认为这会让应用程序变慢,但实际上几乎没有区别。

此解决方法可以与任何Python 版本。它与 PyGTK 和 GTK+3 兼容(GTK+3 会gtk根据Gtk... 进行更改 :P )

while gtk.events_pending():
    gtk.main_iteration()

只需在导致问题的代码之前添加它...就完成了!:)

答案2

在我的应用程序中,我倾向于用os.system()(参见subprocess.call()subprocess.Popenhttps://stackoverflow.com/a/636570/2372604)。

答案3

这里使用 openSUSE Leap 15.5、Python 3.6.15 和 GTK 4.6.9。

简而言之,这个想法是:通过调用来隐藏窗口Gtk.Window.hide(),然后使用启动一个线程threading.Timer()(非阻塞)。在该线程中,使用subprocess.run()(阻塞)然后再次显示窗口Gtk.Window.show()

这是一个完整的工作示例:

#!/usr/bin/python3

import subprocess
import sys
import threading
import gi
gi.require_version('Gtk', '4.0')
from gi.repository import Gtk, Gdk


class MainWindow(Gtk.ApplicationWindow):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.set_default_size(600, 250)
        self.set_title('MyApp')

        self.box1 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
        self.set_child(self.box1)

        self.button = Gtk.Button(label='Launch')
        self.button.connect('clicked', self.on_button_clicked)
        self.box1.append(self.button)

    def on_button_clicked(self, button):
        self.hide()
        t = threading.Timer(1, self.launch)
        t.start()

    def launch(self):
        subprocess.run(['gnome-calculator'])
        self.show()


class MyApp(Gtk.Application):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.connect('activate', self.on_activate)

    def on_activate(self, app):
        self.main_window = MainWindow(application=app)
        self.main_window.present()


app = MyApp(application_id='com.example.MyApp')
app.run(sys.argv)

这些可能有用:

相关内容