gpt4 book ai didi

linux - 无法初始化窗口并等待进程在 Python 3 + GTK+ 3 中结束

转载 作者:IT王子 更新时间:2023-10-29 01:13:36 25 4
gpt4 key购买 nike

我是面向对象编程、Python 和 GTK+3 的新手,但我对过程编程(主要是 C)有一定的了解。

我正在尝试构建一个简单的 Python + GTK+ 3 脚本来运行 pkexec apt-get update在 Linux 下。

我有一个 mainWindow类(基于 Gtk.Window 类),其中包含一个名为 button 的按钮对象(基于 Gtk.Button 类)触发 new_update_window() mainWindow 中定义的方法在 clicked事件;

new_update_window()方法初始化 updateWindow来自 updateWindow 的对象类(基于 Gtk.Window 类),其中包含名为 label 的标签对象(基于 Gtk.Label 类)并调用方法 show_all()update()updateWindow 中定义;

update()方法应该改变 label , 运行 pkexec apt-get update并更改 label再次。

问题是无论我做什么都会发生以下情况之一:

  • 如果我运行 subprocess.Popen(["/usr/bin/pkexec", "/usr/bin/apt-get", "update"])直接,update.Window显示但label立即设置为应仅在 pkexec apt-get update 之后设置的值执行完毕;
  • 如果我运行 subprocess.call(["/usr/bin/pkexec", "/usr/bin/apt-get", "update"])直接,update.Window直到 pkexec apt-get update 才显示执行完毕;
  • 我试过了 import荷兰国际集团threading , 定义一个单独的 run_update() updateWindow 中的方法并使用 thread = threading.Thread(target=self.run_update) 在单独的线程中启动函数, thread.start() , thread.join() , 但仍然取决于我在 run_update() 中调用的方法(subprocess.call()subprocess.Popen)上述相关行为表现出来。

Tl;dr

我不知道如何完成我所追求的,即:

  1. 显示 updateWindow ( Gtk.Window )
  2. 更新 label ( Gtk.Label ) 在 updateWindow
  3. 正在运行 pkexec apt-get update
  4. 更新 labelupdateWindow
  • subprocess.Popen() : update.Window显示但label立即设置为应仅在 pkexec apt-get update 之后设置的值执行完毕;
  • subprocess.call() : update.Window直到 pkexec apt-get update 才显示执行完毕;
  • 将两者中的任何一个包装在函数中并在单独的线程中运行该函数不会改变任何东西。

这是代码;

不使用线程(情况 1,在本例中使用 subprocess.Popen() ):

#!/usr/bin/python3
from gi.repository import Gtk
import subprocess

class mainWindow(Gtk.Window):

def __init__(self):
Gtk.Window.__init__(self, title = "Updater")

button = Gtk.Button()
button.set_label("Update")
button.connect("clicked", self.new_update_window)
self.add(button)

def new_update_window(self, button):
update = updateWindow()
update.show_all()
update.update()

class updateWindow(Gtk.Window):

def __init__(self):
Gtk.Window.__init__(self, title = "Updating...")

self.label = Gtk.Label()
self.label.set_text("Idling...")
self.add(self.label)

def update(self):
self.label.set_text("Updating... Please wait.")
subprocess.call(["/usr/bin/pkexec", "/usr/bin/apt-get", "update"])
self.label.set_text("Updated.")

def run_update(self):

main = mainWindow()
main.connect("delete-event", Gtk.main_quit)
main.show_all()
Gtk.main()

使用线程(案例 3,在本例中使用 subprocess.Popen() ):

#!/usr/bin/python3
from gi.repository import Gtk
import threading
import subprocess

class mainWindow(Gtk.Window):

def __init__(self):
Gtk.Window.__init__(self, title = "Updater")

button = Gtk.Button()
button.set_label("Update")
button.connect("clicked", self.new_update_window)
self.add(button)

def new_update_window(self, button):
update = updateWindow()
update.show_all()
update.update()

class updateWindow(Gtk.Window):

def __init__(self):
Gtk.Window.__init__(self, title = "Updating...")

self.label = Gtk.Label()
self.label.set_text("Idling...")
self.add(self.label)

def update(self):
self.label.set_text("Updating... Please wait.")
thread = threading.Thread(target=self.run_update)
thread.start()
thread.join()
self.label.set_text("Updated.")

def run_update(self):
subprocess.Popen(["/usr/bin/pkexec", "/usr/bin/apt-get", "update"])

main = mainWindow()
main.connect("delete-event", Gtk.main_quit)
main.show_all()
Gtk.main()

最佳答案

除了使用 Python 的 subprocess 模块,您还可以使用 Gio.Subprocess与 GTK 的主循环集成:

#!/usr/bin/python3
from gi.repository import Gtk, Gio

# ...

class updateWindow(Gtk.Window):

def __init__(self):
Gtk.Window.__init__(self, title="Updating...")

self.label = Gtk.Label()
self.label.set_text("Idling...")
self.add(self.label)

def update(self):
self.label.set_text("Updating... Please wait.")
subprocess = Gio.Subprocess.new(["/usr/bin/pkexec", "/usr/bin/apt-get", "update"], 0)
subprocess.wait_check_async(None, self._on_update_finished)

def _on_update_finished(self, subprocess, result):
subprocess.wait_check_finish(result)
self.label.set_text("Updated.")

关于linux - 无法初始化窗口并等待进程在 Python 3 + GTK+ 3 中结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35036122/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com