Python + kivy でGUIデスクトップアプリを作成しています。
下記のコードで実行したところ、「Run」ボタンを押した後、画面が触れなくなり固まってしまいます。
「Run」ボタンで再帰処理を実行、「Stop」ボタンで停止がやりたいことです。
threadingを使ってマルチスレッドで処理しようとしている所のがまずいのかなと思うのですが、解決策が浮かびません。
python
1import japanize_kivy 2import webbrowser 3import time 4import threading 5 6from kivy.app import App 7from kivy.uix.widget import Widget 8from kivy.uix.floatlayout import FloatLayout 9 10from kivy.properties import StringProperty 11from kivy.properties import NumericProperty 12 13from kivy.core.text import LabelBase, DEFAULT_FONT 14from kivy.resources import resource_add_path 15from kivy.clock import Clock 16 17 18class MainScreen(Widget): 19 site_url = StringProperty() 20 count = NumericProperty(0) 21 text = StringProperty() 22 interval_time = NumericProperty(0) 23 run_flg = True 24 25 def SiteAccess(self): 26 #webbrowser.open(self.site_url, 1) 27 print(self.count) 28 self.count += 1 29 time.sleep(self.interval_time) 30 Clock.schedule_once(self.update) 31 if MainScreen.run_flg: 32 th = threading.Thread(target=self.SiteAccess()) 33 th.start() 34 else: 35 print("end") 36 37 def buttonClicked(self): 38 self.text = 'OK' 39 self.count += 1 40 self.site_url = self.ids["text_url"].text 41 self.interval_time = self.ids["text_time"].text 42 th = threading.Thread(target=self.SiteAccess()) 43 th.start() 44 45 def buttonClicked2(self): 46 global run_flg 47 MainScreen.run_flg = False 48 49 def update(self): 50 self.ids.text_count.text = self.count 51 52 53class TicketApp(App): 54 def __init__(self, **kwargs): 55 super(TicketApp, self).__init__(**kwargs) 56 57 def build(self): 58 return MainScreen() 59 60if __name__ == '__main__': 61 TicketApp().run()
kv
1 2<MainScreen>: 3 BoxLayout: 4 orientation: 'vertical' 5 size: root.size 6 BoxLayout: 7 size: root.size 8 pos: root.pos 9 size_hint_y: 10 10 Label: 11 id: label1 12 size_hint_x: 20 13 font_size: 16 14 text: "SITE URL :" 15 canvas.before: 16 Color: 17 rgba: .68, .73, 1, .5 18 Rectangle: 19 pos: self.pos 20 size: self.size 21 TextInput: 22 id: text_url 23 size_hint_x: 80 24 font_size: 16 25 text: "http://reserve.tokyodisneyresort.jp/" 26 foreground_color:1,0.5,0,1 27 #canvas.before: 28 # Color: 29 # rgba: .68, .73, 1, .5 30 # Rectangle: 31 # pos: self.pos 32 # size: self.size 33 BoxLayout: 34 size: root.size 35 pos: root.pos 36 size_hint_y: 10 37 Label: 38 id: label2 39 size_hint_x: 20 40 font_size: 16 41 text: "interval time :" 42 canvas.before: 43 Color: 44 rgba: .68, .73, 1, .5 45 Rectangle: 46 pos: self.pos 47 size: self.size 48 TextInput: 49 id: text_time 50 size_hint_x: 20 51 font_size: 16 52 foreground_color:1,0.5,0,1 53 text:"5" 54 #canvas.before: 55 # Color: 56 # rgba: .68, .73, 1, .5 57 # Rectangle: 58 # pos: self.pos 59 # size: self.size 60 Label: 61 size_hint_x: 60 62 font_size: 16 63 text: "(sec)" 64 text_size: self.size 65 halign: 'left' 66 valign: 'bottom' 67 padding: 10,10 68 canvas.before: 69 Color: 70 rgba: .68, .73, 1, .5 71 Rectangle: 72 pos: self.pos 73 size: self.size 74 BoxLayout: 75 size: root.size 76 pos: root.pos 77 size_hint_y: 10 78 Label: 79 id: label3 80 size_hint_x: 20 81 font_size: 16 82 text: "access count :" 83 canvas.before: 84 Color: 85 rgba: .68, .73, 1, .5 86 Rectangle: 87 pos: self.pos 88 size: self.size 89 Label: 90 id: text_count 91 size_hint_x: 80 92 font_size: 16 93 text: str(root.count) 94 canvas.before: 95 Color: 96 rgba: .68, .73, 1, .5 97 Rectangle: 98 pos: self.pos 99 size: self.size 100 BoxLayout: 101 size: root.size 102 pos: root.pos 103 size_hint_y: 70 104 Button: 105 id: button1 106 text: "Run" 107 font_size: 68 108 on_press: root.buttonClicked() 109 Button: 110 id: button2 111 text: "Stop" 112 font_size: 68 113 on_press: root.buttonClicked2()
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。