Skip to content

Instantly share code, notes, and snippets.

@gottadiveintopython
Last active December 4, 2019 08:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gottadiveintopython/c45184d6312a576c76399b0b6658c834 to your computer and use it in GitHub Desktop.
Save gottadiveintopython/c45184d6312a576c76399b0b6658c834 to your computer and use it in GitHub Desktop.
Qiita記事 yield fromへ統一
from kivy.clock import Clock
def start_gen(gen):
def step_gen(*args, **kwargs):
try:
gen.send((args, kwargs, ))(step_gen)
except StopIteration:
pass
try:
gen.send(None)(step_gen)
except StopIteration:
pass
def thread(func, *args, **kwargs):
from threading import Thread
return_value = None
is_finished = False
def wrapper(*args, **kwargs):
nonlocal return_value, is_finished
return_value = func(*args, **kwargs)
is_finished = True
Thread(target=wrapper, args=args, kwargs=kwargs).start()
while not is_finished:
yield from sleep(3)
return return_value
def sleep(duration):
return (yield lambda step_gen: Clock.schedule_once(step_gen, duration))
def event(ed, name):
bind_id = None
step_gen = None
def bind(step_gen_):
nonlocal bind_id, step_gen
bind_id = ed.fbind(name, callback)
assert bind_id > 0 # bindingに成功したか確認
step_gen = step_gen_
def callback(*args, **kwargs):
ed.unbind_uid(name, bind_id)
step_gen(*args, **kwargs)
return (yield bind)
from kivy.app import App
from kivy.lang import Builder
from kivy.factory import Factory
KV_CODE = '''
Button:
'''
class SampleApp(App):
def build(self):
return Builder.load_string(KV_CODE)
def on_start(self):
start_gen(self.some_task())
def some_task(self):
def heavy_task():
import time
for i in range(5):
time.sleep(1)
print(i)
button = self.root
button.text = 'start heavy task'
yield from event(button, 'on_press')
button.text = 'running...'
yield from thread(heavy_task)
button.text = 'done'
if __name__ == '__main__':
SampleApp().run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment