3

クラスに基づいて、ボタンがクリックされるたびにbuttonとを含むウィンドウがあり、次の 2 つのことが発生するはずです。progressbar

1 - ダイアログパスから値を入力する必要がありますclass ABCD

2 - 私たちのクラスABCD()が彼の仕事をしている間、私たちのプログレスバーは、クラス ABCD() がプロセスを終了するまで定期的なパルスを行うべきです.

したがって、問題は、プログレスバーが一度だけパルスし、クラス ABCD() が終了するまでそこに留まり、後で定期的にパルスを開始することです。

これが私の試みです:

import gi,time
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk, GObject

class DialogExample(Gtk.Dialog):

    def __init__(self, parent):
        Gtk.Dialog.__init__(self, "My Dialog", parent, 0,
            (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
             Gtk.STOCK_OK, Gtk.ResponseType.OK))

        self.set_default_size(150, 100)

        self.Myinput = Gtk.Entry()

        box = self.get_content_area()
        box.add(self.Myinput)
        self.show_all()

class DialogWindow(Gtk.Window):

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

        self.set_border_width(6)
        Hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
        self.add(Hbox)

        self.button = Gtk.Button("Open dialog")
        self.button.connect("clicked", self.on_button_clicked)

        Hbox.pack_start(self.button, True, True, 0)

        self.progressbar = Gtk.ProgressBar()
        Hbox.pack_start(self.progressbar, True, True, 0)

#~~~~~~ Progress Bar
    def on_timeout(self, user_data):
        """
        Update value on the progress bar
        """
        if self.activity_mode:
            self.progressbar.pulse()
        else:
            new_value = self.progressbar.get_fraction() + 0.01

            if new_value > 1:
                new_value = 0

            self.progressbar.set_fraction(new_value)

        # As this is a timeout function, return True so that it
        # continues to get called
        return True

    def on_button_clicked(self, widget):
        dialog = DialogExample(self)
        response = dialog.run()

        if response == Gtk.ResponseType.OK:
            variable = dialog.Myinput.get_text()
            print("start")
        dialog.destroy()

        #ProgressBar time function

        self.timeout_id = GObject.timeout_add(50, self.on_timeout, None)
        self.activity_mode = False
        self.progressbar.pulse()

        #this for Updating the Windows and make the progressbar pulsing while waiting
        # the class ABCD finish his stuff, finally should stop pulsing.
        while Gtk.events_pending():
            Gtk.main_iteration_do(False)
        passing_instance = ABCD(variable)


class ABCD(object):
    def __init__(self,value_of_dialog):
        self.get_value = value_of_dialog
        self.for_add = "______ add was done"
        self.final_value = self.get_value+self.for_add
        time.sleep(10)
        print("gonna be finished")
        print(self.final_value)



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

ここでわかるように、コードのこの部分ですでにパルスを作成してウィンドウを更新しようとしています

self.timeout_id = GObject.timeout_add(50, self.on_timeout, None)
self.activity_mode = False
self.progressbar.pulse()

#this for Updating the Windows and make the progressbar pulsing while waiting
# the class ABCD finish his stuff, finally should stop pulsing.
while Gtk.events_pending():
    Gtk.main_iteration_do(False)

それ以外の場合my class ABCD()time.sleep(10)、進行状況バーのパルスがその時間だけ 10 秒後に停止する必要があるためです。

このコードはどうあるべきか、私は誰かが私に正しいコードを提供する必要があります。

4

1 に答える 1

1

sleep時間の経過をエミュレートするために使用する場合の問題sleepは、スレッドで発生しているすべてのことを停止することです。この場合Gtk.main()、プログレスバーのパルスまたは更新に必要なスレッドに到達できなくなります。

したがって、これを適切に行うには、次の 2 つのオプションがあります。

  1. ABCDメインスレッドが到達できるように別のスレッドで実行しますGtk.main()。プログレスバーが期待どおりに移動することを確認します。これの簡単な例は次のようになります。

    self.abcd_thread = ABCD(variable)
    self.abcd_thread.start()
    
    class ABCD(Thread):
        def __init__(self, value_of_dialog):
            super(ABCD, self).__init__()
            self.get_value = value_of_dialog
            self.for_add = "______ add was done"
            self.final_value = self.get_value+self.for_add
    
        def run(self):
            print "Starting " + self.name
    
            time.sleep(10)
            print("gonna be finished")
            print(self.final_value)
    
            print "Exiting " + self.name
    

    これを使用するself.abcd_thread.isAlive()と、スレッドがまだ処理を行っているかどうかを確認できます。情報を返す方法は、スレッドに配置されたジョブに大きく依存します。

  2. time.sleepを次のフラグメントに置き換えます。

    now = time.time()
    while time.time() - now < 10:
        # Insert any code here
        Gtk.main_iteration_do(False)
    

    これでもABCD10 秒間処理をエミュレートしGtk.main_iteration_do(False)ますが、ループの各反復で呼び出すため、GTK はループ中にインターフェイスを更新できます。

一般に、2 番目のオプションは、Gtk.main_iteration_do(False)何をしていても電話をかけるだけなので、最も簡単です。一方、最初のオプションは、Gtk 呼び出しを追加するのが容易ではない複雑な計算を処理する場合により便利です。

于 2016-05-19T09:56:30.463 に答える