Python + kivy でGUIデスクトップアプリを作成しています。
下記のコードで実行したところ、「Run」ボタンを押した後、画面が触れなくなり固まってしまいます。
「Run」ボタンで再帰処理を実行、「Stop」ボタンで停止がやりたいことです。
threadingを使ってマルチスレッドで処理しようとしている所のがまずいのかなと思うのですが、解決策が浮かびません。
python
import japanize_kivy import webbrowser import time import threading from kivy.app import App from kivy.uix.widget import Widget from kivy.uix.floatlayout import FloatLayout from kivy.properties import StringProperty from kivy.properties import NumericProperty from kivy.core.text import LabelBase, DEFAULT_FONT from kivy.resources import resource_add_path from kivy.clock import Clock class MainScreen(Widget): site_url = StringProperty() count = NumericProperty(0) text = StringProperty() interval_time = NumericProperty(0) run_flg = True def SiteAccess(self): #webbrowser.open(self.site_url, 1) print(self.count) self.count += 1 time.sleep(self.interval_time) Clock.schedule_once(self.update) if MainScreen.run_flg: th = threading.Thread(target=self.SiteAccess()) th.start() else: print("end") def buttonClicked(self): self.text = 'OK' self.count += 1 self.site_url = self.ids["text_url"].text self.interval_time = self.ids["text_time"].text th = threading.Thread(target=self.SiteAccess()) th.start() def buttonClicked2(self): global run_flg MainScreen.run_flg = False def update(self): self.ids.text_count.text = self.count class TicketApp(App): def __init__(self, **kwargs): super(TicketApp, self).__init__(**kwargs) def build(self): return MainScreen() if __name__ == '__main__': TicketApp().run()
kv
<MainScreen>: BoxLayout: orientation: 'vertical' size: root.size BoxLayout: size: root.size pos: root.pos size_hint_y: 10 Label: id: label1 size_hint_x: 20 font_size: 16 text: "SITE URL :" canvas.before: Color: rgba: .68, .73, 1, .5 Rectangle: pos: self.pos size: self.size TextInput: id: text_url size_hint_x: 80 font_size: 16 text: "http://reserve.tokyodisneyresort.jp/" foreground_color:1,0.5,0,1 #canvas.before: # Color: # rgba: .68, .73, 1, .5 # Rectangle: # pos: self.pos # size: self.size BoxLayout: size: root.size pos: root.pos size_hint_y: 10 Label: id: label2 size_hint_x: 20 font_size: 16 text: "interval time :" canvas.before: Color: rgba: .68, .73, 1, .5 Rectangle: pos: self.pos size: self.size TextInput: id: text_time size_hint_x: 20 font_size: 16 foreground_color:1,0.5,0,1 text:"5" #canvas.before: # Color: # rgba: .68, .73, 1, .5 # Rectangle: # pos: self.pos # size: self.size Label: size_hint_x: 60 font_size: 16 text: "(sec)" text_size: self.size halign: 'left' valign: 'bottom' padding: 10,10 canvas.before: Color: rgba: .68, .73, 1, .5 Rectangle: pos: self.pos size: self.size BoxLayout: size: root.size pos: root.pos size_hint_y: 10 Label: id: label3 size_hint_x: 20 font_size: 16 text: "access count :" canvas.before: Color: rgba: .68, .73, 1, .5 Rectangle: pos: self.pos size: self.size Label: id: text_count size_hint_x: 80 font_size: 16 text: str(root.count) canvas.before: Color: rgba: .68, .73, 1, .5 Rectangle: pos: self.pos size: self.size BoxLayout: size: root.size pos: root.pos size_hint_y: 70 Button: id: button1 text: "Run" font_size: 68 on_press: root.buttonClicked() Button: id: button2 text: "Stop" font_size: 68 on_press: root.buttonClicked2()
まだ回答がついていません
会員登録して回答してみよう