このような 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で他のことをしながら、この関数をバックグラウンドで処理することです。これにはスレッドが必要ですか?