質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Kivy

Kivyは、Pythonを用いたNUI開発のためのオープンソースフレームワーク。マルチタッチなど多くの入力に対応したNUIアプリなどを開発することができます。多くの環境で動作するクロスプラットフォームです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1127閲覧

pythonのdef関数の戻り値をkvファイルのLabelに表示させたい

noggi

総合スコア8

Kivy

Kivyは、Pythonを用いたNUI開発のためのオープンソースフレームワーク。マルチタッチなど多くの入力に対応したNUIアプリなどを開発することができます。多くの環境で動作するクロスプラットフォームです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/02/15 16:08

編集2022/02/20 14:39

前提・実現したいこと

初心者質問で申し訳ありませんがよろしくお願いします。

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TakaiY

2022/02/16 01:12

質問に提示されているコードでは、そのエラーは出ないのではないかと思います。 提示のコードを実行したときのエラーメッセージを確認ください。
TakaiY

2022/02/16 01:13

もしくは、エラーが出ているところが提示のコード以外の場所なのか?
noggi

2022/02/16 13:56

丁寧にみていただいてありがとうございます。全コード追記しましたので、今一度ご覧いただけると幸いです。よろしくお願いします。
noggi

2022/02/16 14:03

def の中に入れると挙動がおかしくなるようです。defから出したらだいたい動かせていると思います。
guest

回答2

0

ベストアンサー

takasima20さんの回答の通りではありますが、アドバイスしてみます。

基本的に、関数やクラスのメソッドの返り値の利用方法の理解が不十分なのだと思います。
以下のコードのとき、root が StopwatchScreen のインスタンスだった場合、

root.get_datetime() は get_datetime()関数の返り値になります。 これは、「return zikan + place」で両方文字列なので、「文字列」 です。
なので、 「root.get_datetime() .place」などは、文字列に.place などは無いのでエラーになります。

python

1class StopwatchScreen(Screen): 2 text = StringProperty() 3 4 def get_datetime(self): 5 # 省略 6 return zikan + place

コードを見ると、目的は、 zikan と place を別々に取得できるようにすることのようです。
今の方式、 get_datetime関数を使う方式、でやるのであれば、から、返り値を繋げた文字列にすると面倒から、分て返るようにして、それに合せた扱いにする必要があります。

以下のコードだと、root.get_datetime() は zikanとplaceのタプルになります。
この場合 zikanが欲しいところは、「root.get_datetime()[0]」、placeが欲しいところは「root.get_datetime()[1]」とします。
また、つなげた文字列が必要なら「root.get_datetime()[0]+root.get_datetime()[1]」のようにつなげばいいでしょう。

python

1class StopwatchScreen(Screen): 2 text = StringProperty() 3 4 def get_datetime(self): 5 # 省略 6 return zikan, place

また、.placeのようにアクセスしたいのであれば、関数の返り値でなく、クラスのメンバ変数にすればいいですが、zikanの値をどのタイミングのものにしたいのかなどで実装が変るので、要件を整理して別途質問していだたくのがいいでしょう。

投稿2022/02/17 02:00

TakaiY

総合スコア12657

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

noggi

2022/02/19 15:34

ご指摘いただいた 「root.get_datetime() .place」などは、文字列に.place などは無いのでエラーになります。 の点が原因だと思います。 たしかにその辺りの理解が足りなかったと思うので勉強します。 身近に聞ける方もおらず、途方に暮れていました。 ご丁寧にありがとうございました。 またご指導のほどよろしくお願いします。
guest

0

よくわかりませんが

python

1 return zikan + place

--- 追記 ---
気になるところはありますがとりあえず

return zikan + place


return zikan,place

text: root.get_datetime().zikan


text: root.get_datetime()[0]

text: root.get_datetime.place


text: root.get_datetime()[1]

投稿2022/02/15 20:42

編集2022/02/16 21:38
takasima20

総合スコア7458

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

noggi

2022/02/16 13:54

ご対応いただきありがとうございました。でも原因は違うようです。また他にも何かありましたら教えてください。
noggi

2022/02/19 15:36

ご丁寧に追記までいただき、本当に感謝しております。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問