1

このような GUI を備えた簡単なプログラムを作成したいとします。

これは私のコードです:

from gi.repository import Gtk
import gobject

class gui():
    def __init__(self):
        self.window = Gtk.Window()
        self.window.connect('delete-event', Gtk.main_quit)

        self.box = Gtk.Box()
        self.window.add(self.box)

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

        self.button = Gtk.Button(label='Start')
        self.button.connect('clicked', self.on_button_clicked)
        self.box.pack_start(self.button, True, True, 0)

        self.window.show_all()
        Gtk.main()

    def on_button_clicked(self, widget):
        self.task = self.iters(100000)
        gobject.idle_add(self.task.next)

    def iters(self, j):
        i = j
        while i > 0 :
            i -= 1
            print i
            self.progressbar.set_fraction((j - float(i)) / j)
            yield True
        yield False

if __name__ == '__main__':
    gui = gui()

そのような1つのスクリプトにすべてを入れれば、プログレスバーを機能させる方法を知っています。しかし、GUI 部分とロジック部分を分離したい場合はどうすればよいでしょうか。したがって、次のようになります。

GUI.py

from gi.repository import Gtk

class gui():
    def __init__(self):
        self.window = Gtk.Window()
        self.window.connect('delete-event', Gtk.main_quit)

        self.box = Gtk.Box()
        self.window.add(self.box)

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

        self.button = Gtk.Button(label='Start')
        self.button.connect('clicked', self.on_button_clicked)
        self.box.pack_start(self.button, True, True, 0)

        self.window.show_all()
        Gtk.main()

    def on_button_clicked(self, widget):
        //how to implement it

if __name__ == '__main__':
    gui = gui()

反復.py

class Iteration():
def iters(self, j):
    i = j
    while i > 0 :
        i -= 1
        print i

編集: もう1つ、上記の最初のコードは機能しますが、なぜこのメッセージが表示されるのですか:

/usr/lib/python2.7/dist-packages/gobject/constants.py:24: Warning: g_boxed_type_register_static: assertion `g_type_from_name (name) == 0' failed
import gobject._gobject

編集: わかりました、次のようなモジュールが 1 つあると想像してください: Works.py

def getImageFromInternet(uri):
    #some code to get image from internet

このgetImageFromInternet関数は反復可能ではありません。私がやりたいのは、プログレスバーを更新し、GUIで他のことをしながら、この関数をバックグラウンドで処理することです。これにはスレッドが必要ですか?

4

1 に答える 1