

以下のプログラムでは、kivyを用いてデータベースからキーワードをもとにデータを抽出し出力するソフトを目指しています。

問題点は、一番初めに起動されるTop_Screenが表示されないことです。  
なぜ、そうなるのか教えていただきたいです。

`build = Builder.load_file("design.kv")` は `UnicodeDecodeError: 'cp932'`
が出るので消しました。

以下がソースコードになります。

**mobiDB_ver1.2.py**

[code]

    from kivy.app import App
    from kivy.uix.screenmanager import ScreenManager, Screen
    import threading
    from kivy.core.window import Window
    
    class Top_Screen(Screen):
        """Top画面"""
    
        def press_enter_button(self):
            sm.add_widget(Search_Screen(name='search'))  # 初期処理を動かしたい画面は遷移の直前に追加する
            sm.remove_widget(self)
            sm.current = 'search'                        #遷移
    
    class Search_Screen(Screen):
        """search画面"""
    
        def __init__(self, **kwargs):
            super(Search_Screen, self).__init__(**kwargs)
            self.text = ''  # 検索のキーワードを取得
            self.btn_mythread = threading.Thread(target=self.search_to_uniprot_thread)
    
        def press_search_button(self):
            #ボタンが押されたときスレッドをスタート
    
            print("begin")
            sm.add_widget(Search_Screen(name='wait'))  # 初期処理を動かしたい画面は遷移の直前に追加する
            sm.current = 'wait'                        #遷移
            self.btn_mythread.start()                  #スレッドスタート
    
    
        def search_to_uniprot_thread(self):
                # Uniprotに接続
    
                from bioservices import UniProt
                service = UniProt()
    
                # 検索用の値をqueryとして代入
    
                query = self.ids["text_box"].text
    
                # データを抽出し出力.
                result = service.search("keyword:" + query)
                print(result)
                print("finish")
    
                sm.add_widget(Output_Screen(name='output'))  # 初期処理を動かしたい画面は遷移の直前に追加する
                sm.current = 'output'
    
    class Wait_Screen(Screen):
        """データ抽出中のwait画面"""
    
        def press_cancel_button(self):
            # ボタンが押されたときSearch画面に戻る
    
            sm.remove_widget(self)
            sm.current = 'search'
    
    
    class Output_Screen(Screen):
        """output画面"""
    
        def press_return_button(self):
            # ボタンが押されたときSearch画面に戻る
    
            temp = sm.get_screen('select')
            sm.remove_widget(temp)
            sm.remove_widget(self)
            sm.current = 'search'
    
    sm = ScreenManager() #スクリーンマネージャ
    
    
    class MobiDBApp(App):
        def build(self):
            sm.add_widget(Top_Screen(name='top'))
            sm.current = 'top'
    
            return sm
    
    if __name__ == '__main__':
        Window.size = (400, 220)
        MobiDBApp().run()
    
[/code]

**design.kv**

[code]

    <Top_Screen>:
        BoxLayout:
            size: root.size
    
            Button:
                size: 50,50
                size_hint: None,None
                text: 'Search画面へ'
                on_press: root.press_enter_button() #Top_Screenのメソッドが実行される
    
    <Search_Screen>:
        BoxLayout:
            orientation: 'vertical'
            size: root.size
    
            Label:
                text_size: self.size
                text: 'Searching in MobiDB'
    
                halign: 'left'
                size_hint_x: 1
                size_hint_y:0.5
                font_size: 24
    
            Label:
                size_hint_y: 0.1
                text:''
    
            BoxLayout:
                size_hint_x:0.9
                size_hint_y:0.4
                orientation: 'horizontal'
    
                TextInput:
                    id:text_box
                    font_size: 22
                    focus: True
                    on_text_validate: root.btnClicked_text()
    
            Label:
                size_hint_y: 0.1
                text:''
    
            FloatLayout:
                Button:
                    text: "Search"
                    size_hint_x: 0.23
                    size_hint_y: 0.3
                    pos_hint: {"x":0.75, "y":0}
                    font_size: 20
    
                    on_press:
                        root.manager.transition.direction = 'RiseInTransition'
                        root.press_search_button()
    
    <Wait_Screen>:
        BoxLayout:
            orientation: 'vertical'
            size: root.size
    
            Label:
                size_hint_y: 0.1
                text:''
    
            Label:
                text_size: self.size
                text: 'Searching Now'
    
                halign: 'left'
                size_hint_x: 1
                size_hint_y:0.8
                font_size: 24
    
            Label:
                size_hint_y: 0.1
                text:''
    
            Button:
                size: 50,50
                size_hint: None,None
                text: "cancel"
                on_press: root.press_cancel_button() #Top_Screenのメソッドが実行される
    
    <Output_Screen>:
            BoxLayout:
            size: root.size
    
                Button:
                    size: 50,50
                    size_hint: None,None
                    text: 'finish'
                    on_press: root.press_return_button() #Top_Screenのメソッドが実行される
    
[/code]


CC BY-SA 4.0
2019-08-26T09:58:59.230
57615
2023-11-04T04:08:46.023
2019-12-27T00:17:18.783
3060
35607
question
python kivy
kivy，Python，実行時、スクリーン上に何も表示されない


自動でkvファイルを読み込ませるにはファイル名はmobidb.kvにしないとですよね。。。


CC BY-SA 4.0
2019-12-26T09:04:26.087
61809
2019-12-26T09:04:26.087
37223
57615
answer