如何实施废除行动?

2024-09-27 21:33:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我用Python和PyGObject编写了一些简单的程序。我想让她通过ProgressBar通知用户进度。我在google上搜索到这个进程应该是一个单独的线程,否则接口会保持不变,现在有一些类似的测试:

import time
import threading
from gi.repository import Gtk, GObject

GObject.threads_init()

def tread_function():
    progress.set_fraction(0)
    time.sleep(5)
    progress.set_fraction(0.25)
    time.sleep(5)
    progress.set_fraction(0.5)
    time.sleep(5)
    progress.set_fraction(0.75)
    time.sleep(5)
    progress.set_fraction(1)


def clickOk(*args):
    t = threading.Thread(target=tread_function)
    t.start()

def clickCancel(*args):
    pass

buttonOk = Gtk.Button("Start Count")
buttonOk.connect("clicked", clickOk)

buttonCancel = Gtk.Button("Cancel Count")
buttonCancel.connect("clicked", clickCancel)

progress = Gtk.ProgressBar()
progress.set_show_text(True)

vBox = Gtk.VBox()
vBox.pack_start(buttonOk, True, True, 10)
vBox.pack_start(buttonCancel, True, True, 10)
vBox.pack_start(progress, True, True, 10)

window = Gtk.Window()
window.connect('destroy', Gtk.main_quit)
window.add(vBox)
window.show_all()

Gtk.main()

现在,当界面不坚持,我想给一个机会,用户停止工作,以充分完成,如果他做了​​设置错误。但我无法在google上搜索,也无法在文档中找到如何在线程完全执行之前杀死它


Tags: importtruegtktimedefconnectsleepwindow
1条回答
网友
1楼 · 发布于 2024-09-27 21:33:32

在python中没有简单的方法可以杀死线程。为了解决这个问题,您需要构建自己的钩子来触发早期线程退出。一个好的方法是使用Event,这是一个可以设置的线程安全触发器

不过,在这样做之前,您可能希望将代码封装在一些类中。从长远来看,编写没有类的gui只会给你带来痛苦

from threading import Event,Thread


class FakeClass(object):
    def __init__(self):
        self.progress = Gtk.ProgressBar()
        self.progress.set_show_text(True)
        self.buttonOk = Gtk.Button("Start Count")
        self.buttonOk.connect("clicked", self.clickOk)
        self.buttonCancel = Gtk.Button("Cancel Count")
        self.buttonCancel.connect("clicked", self.clickCancel)

        #create an event to trigger in your thread
        self.trigger = Event() 
        self.t = None

        #Other GTK stuff here...

    def tread_function(self):
        progress_fraction = 0.0

        #keep looping while the trigger is not set and the 
        #progress is not > 1.0
        while not self.trigger.is_set() and progress <= 1.0:
            progress.set_fraction(progress_fraction)
            time.sleep(1)
            progress_fraction += 0.1

    def clickOk(self, *args):
        # reset the trigger
        self.trigger.clear()
        #launch the thread
        self.t = threading.Thread(target=self.tread_function)
        self.t.start()

    def clickCancel(self, *args):
        # set the trigger (interrupting the thread)
        self.trigger.set()
        # join the thread so it is not left hanging
        if not self.t is None:
            self.t.join()


    # More other GTK stuff here...

相关问题 更多 >

    热门问题