因此,我正在开发一个 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.Popen
https://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)
这些可能有用: