前提・実現したいこと
初心者質問で申し訳ありませんがよろしくお願いします。
pythonファイルとkivyファイルを分けて書いています。
def関数のupdate_time の戻り値である、str(lat + " " + lon) + str(datetime.today()) の結果をLabelに表示させたいと思っています。が、以下のようなエラーが出てしまいます。
この場合kivyファイルの方で、text: の後ろをどのように定義したら、update_time関数の結果がLabelに表示できるのでしょうか。
何卒ご教授いただけるとありがたいです。よろしくお願いします。
発生している問題・エラーメッセージ
BuilderException: Parser: File "ファイルパス", line 61: ... 59: font_size: "30" 60: bold: True >> 61: text: root.get_datetime.place 62: 63: ... AttributeError: 'function' object has no attribute 'place' File "ファイルパス", line 242, in create_handler return eval(value, idmap), bound_list File "ファイルパス", line 61, in <module> text: root.get_datetime.place File "ファイルパス", line 695, in _apply_rule value, bound = create_handler( File "ファイルパス", line 245, in create_handler raise BuilderException(rule.ctx, rule.line,
該当のソースコード
python
1from kivy.config import Config 2 3Config.set('graphics', 'width', '500') 4Config.set('graphics', 'height', '500') 5 6from kivy.app import App 7from kivy.lang import Builder 8from kivy.uix.widget import Widget 9from kivy.uix.button import Button 10from kivy.uix.behaviors import ButtonBehavior 11from kivy.uix.image import Image 12from kivy.uix.screenmanager import ScreenManager, Screen 13from kivy.graphics.texture import Texture 14from kivy.core.text import LabelBase, DEFAULT_FONT 15from kivy.resources import resource_add_path 16from kivy.clock import Clock 17from kivy.properties import StringProperty 18import requests 19import json 20 21from datetime import datetime 22import threading 23import time 24import queue 25import csv 26from geopy.distance import geodesic 27import numpy as np 28import requests 29import ui 30import subprocess 31 32resource_add_path("/System/Library/Fonts") 33LabelBase.register(DEFAULT_FONT, "ヒラギノ角ゴシック W0.ttc") 34 35Builder.load_file("/Users/user_name/Downloads/GpsApp.kv") 36 37class MenuScreen(Screen): 38 pass 39 40class StopwatchScreen(Screen): 41 text = StringProperty() 42 43 def get_datetime(self): 44 geo_request_url = "https://get.geojs.io/v1/ip/geo.json" 45 geo_data = requests.get(geo_request_url) 46 json_geo = geo_data.json() 47 lat = json.dumps(json_geo["latitude"]) 48 lon = json.dumps(json_geo["longitude"]) 49 place = str(lat + "\n" + lon) 50 zikan = str(datetime.now()) 51 return zikan + place 52 53#作成途中 54 def go_clicked(self): 55 print("Buckle up!") 56 Clock.schedule_interval(get_datetime, 1) 57 print(get_datetime) 58 59 # 作成途中 60 def arrived_clicked(self): 61 Clock.unschedule(go_clicked) 62 print("Arrived!") 63 64#作成途中 65class ResultScreen(Screen): 66 start_time = time.time() 67 stop_time = time.time() 68 result = str(stop_time - start_time) 69 pass 70#作成途中 71class LogScreen(Screen): 72 pass 73 74class GpsApp(App): 75 def build(self): 76 sm = ScreenManager() 77 sm.add_widget(MenuScreen(name='menu')) 78 sm.add_widget(StopwatchScreen(name='Stopwatch')) 79 sm.add_widget(ResultScreen(name="Result")) 80 sm.add_widget(LogScreen(name="Log")) 81 return sm 82 83 def __init__(self, **kwargs): 84 super(GpsApp, self).__init__(**kwargs) 85 self.title = "GPS" 86 87 88if __name__ == "__main__": 89 GpsApp().run()
kivy
1<MenuScreen>: 2 canvas.before: 3 Color: 4 rgba: 1, 1, 1, 1 5 Rectangle: 6 pos: self.pos 7 size: self.size 8 9 GridLayout: 10 rows: 2 11 cols: 1 12 13 Button: 14 text_size: self.size 15 valign: "top" 16 color: 0, 1, 0, 1 17 font_size: "30" 18 bold: True 19 text: "Drive_Logger" 20 on_press: root.manager.current = 'Stopwatch' 21 Button: 22 text_size: self.size 23 valign: "top" 24 color: 0, 1, 0, 1 25 font_size: "30" 26 bold: True 27 text: "Log" 28 on_press: root.manager.current = 'Log' 29 30 31<StopwatchScreen>: 32 canvas.before: 33 Color: 34 rgba: 1, 1, 1, 1 35 Rectangle: 36 pos: self.pos 37 size: self.size 38 39 GridLayout: 40 rows: 2 41 cols: 2 42 43 Label: 44 text_size: self.size 45 valign: "top" 46 color: 0, 1, 0, 1 47 font_size: "30" 48 bold: True 49 text: root.get_datetime().zikan 50 51 Label: 52 text_size: self.size 53 valign: "top" 54 color: 0, 1, 0, 1 55 font_size: "30" 56 bold: True 57 text: root.get_datetime.place 58 59 60 Button: 61 text_size: self.size 62 valign: "top" 63 color: 0, 1, 0, 1 64 font_size: "30" 65 bold: True 66 text: "Go!" 67 on_press: root.get_datetime() 68 69 Button: 70 text_size: self.size 71 valign: "top" 72 color: 0, 1, 0, 1 73 font_size: "30" 74 bold: True 75 text: "Arrived!" 76 on_press: root.arrived_clicked() 77 78 79<ResultScreen> 80 canvas.before: 81 Color: 82 rgba: 1, 1, 1, 1 83 Rectangle: 84 pos: self.pos 85 size: self.size 86 87 GridLayout: 88 rows: 2 89 cols: 1 90 91 Label: 92 text_size: self.size 93 valign: "top" 94 color: 0, 1, 0, 1 95 font_size: "30" 96 bold: True 97 text: root.result 98 99 Button: 100 text_size: self.size 101 valign: "top" 102 color: 0, 1, 0, 1 103 font_size: "30" 104 bold: True 105 text: "Back to menu" 106 on_press: root.manager.current = 'menu' 107 108 109 110 111<LogScreen>: 112 canvas.before: 113 Color: 114 rgba: 1, 1, 1, 1 115 Rectangle: 116 pos: self.pos 117 size: self.size 118 119 GridLayout: 120 rows: 1 121 cols: 4 122 123 Button: 124 text_size: self.size 125 valign: "top" 126 color: 0, 1, 0, 1 127 font_size: "30" 128 bold: True 129 text: "Back to menu" 130 on_press: root.manager.current = 'menu' 131
試したこと
text: root.placeだと
AttributeError: 'StopwatchScreen' object has no attribute 'place'
text: root.place()だと
AttributeError: 'function' object has no attribute 'place'
その他、似たようなものを作っておられる方のブログを参照させていただいたりしました。もし参照すべきマニュアル等ありましたらそちらも併せて教えていただけると幸いです。読んで勉強します。
補足情報(FW/ツールのバージョンなど)
PyCharm 2020.3.5 (Community Edition)
Build #PC-203.7717.81, built on March 25, 2021
Runtime version: 11.0.10+8-b1145.96 x86_64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.
macOS 10.16
GC: ParNew, ConcurrentMarkSweep
Memory: 990M
Cores: 4
回答2件
あなたの回答
tips
プレビュー