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

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

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

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Python

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

Q&A

解決済

1回答

843閲覧

pythonでrealtime databaseを利用する時、PySimpleGuiアプリを終了せずに連続で読み込みまたは書き込みをしたい。

samusara

総合スコア21

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Python

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

0グッド

0クリップ

投稿2021/12/30 18:00

編集2022/01/01 10:20

前提、実現したいこと

PySimplGuiを使ってインプット欄に入れた項目をFirebaseのRealTime-Databaseにデータ保存をするアプリを作っています。
機能を果たすアプリになったのですが、一度書き込みをするとアプリを終了させないと別データを保存できません。そこでアプリの再読み込みをしてプログラムの最初に戻るように考えたのですが、やはりアプリを終了させないと連続でデータ保存をできないのです。
実現させたいのはアプリを稼働させたまま連続してデータを書き込みたい。

import PySimpleGUI as sg import firebase_admin from firebase_admin import credentials from firebase_admin import db from oauth2client.service_account import ServiceAccountCredentials import json import datetime dt = datetime.datetime.now() dtDay = dt.day dtMonth = dt.month dtYear = dt.year def datainput_func(name): print(name) touroku = str(dtYear)+'/'+str(dtMonth)+str(dtDay) if not firebase_admin._apps: cred2 = credentials.Certificate('./hogefirebase-adminsdk-epcpl-03c5efaabf.json') firebase_admin.initialize_app(cred2, { 'databaseURL': 'https://fuga-default-rtdb.asia-southeast1.firebasedatabase.app/', 'databaseAuthVariableOverride': { 'uid': 'my-service-worker' } }) ref2 = db.reference('user') ref2.child(name).set({ 'touroku':str(touroku), }) return def dataoutput_func(): pass def submit_func(): pass handler = { 'datainput': datainput_func, 'dataoutput': dataoutput_func, 'Submit': submit_func, } def main(): layout = [[sg.Text('名前',font = ('arial',22)),sg.Input(font = ('arial',22))], [sg.Button('データ入力', key='datainput')], [sg.Button('データ読み込み', key='dataoutput')], [sg.Submit(), sg.Cancel()]] window = sg.Window('Sample', layout=layout, size = (300,300)) while True: event, value = window.read() print(event, value) name=value[0] print(name) if event in [None, 'Cancel']: window.close() main() function = handler[event] # handlerからeventに応じた関数を呼び出す function(name) window.close() if __name__ == '__main__': main()

イメージ説明

データ入力ボタンを押すと名前欄に入れた文字を元にデータがRealTime-Database上に作られます。
イメージ説明
Cancelボタンを押すとウィンドウをmain()を再読み込みして最初に戻るのですが、ここで新たにインプットしても書き込みが行われません。
イメージ説明
上図はkaneko8のデータ保存をした後、Cancelボタンを押し、main()再読み込みした後にkaneko9のデータ保存を試みたところです。
イメージ説明
やはりkaneko9のデータ保存はうまくいきませんでした。しかし、アプリを再起動するときちんとできます。この差がいまいち理解できず,
解消できずにいます。

MacOs 12.2 Beta(21D5025f)
Python 3.8.12
参考 リンク内容
どなたかご教授お願いできないでしょうか?

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

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

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

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

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

guest

回答1

0

自己解決

自己解決できました。
単純な見落としでした。

import PySimpleGUI as sg import firebase_admin from firebase_admin import credentials from firebase_admin import db import datetime from oauth2client.service_account import ServiceAccountCredentials from selenium.webdriver.chrome.options import Options import schedule import json dt = datetime.datetime.now() dtDay = dt.day dtMonth = dt.month dtYear = dt.year def datainput_func(): print(value[0]) name = value[0] devents = 0 dpoints = 0 dyonma1st = 0 dyonma2nd = 0 dyonma3rd = 0 roundtotal = 0 mdtotalpoints = 0 mdtotalevents = 0 mdtotalyonma1st = 0 mdtotalyonma2nd = 0 mdtotalyonma3rd = 0 mdtotalroundtotal = 0 ydtotalpoints = 0 ydtotalevents = 0 ydtotalyonma1st = 0 ydtotalyonma2nd = 0 ydtotalyonma3rd = 0 ydtotalroundtotal = 0 guestout = 0 touroku = value[1] pointnow = value[2] pointpermanent = value[3] if not firebase_admin._apps: cred2 = credentials.Certificate('./customerinfo-7f390-firebase-adminsdk-epcpl-03c5efaabf.json') firebase_admin.initialize_app(cred2, { 'databaseURL': 'https://customerinfo-7f390-default-rtdb.asia-southeast1.firebasedatabase.app/', 'databaseAuthVariableOverride': { 'uid': 'my-service-worker' } }) ref2 = db.reference('m_seed').child('isesaki').child('free') ref2.child(name).set({ 'touroku':str(touroku), 'guestout':str(guestout) }) ref2.child(name).child(str(dtYear)).child('yeartotal').set({ 'ytotalpoints':str(pointnow), 'ytotalevents':str(pointpermanent), 'ytotalyonma1st':str(ydtotalyonma1st), 'ytotalyonma2nd':str(ydtotalyonma2nd), 'ytotalyonma3rd':str(ydtotalyonma3rd), 'ytotalroundtotal':str(ydtotalroundtotal) }) ref2.child(name).child(str(dtYear)).child(str(dtMonth)).child('monthtotal').set({ 'mtotalpoints':str(mdtotalpoints), 'mtotalevents':str(mdtotalevents), 'mtotalyonma1st':str(mdtotalyonma1st), 'mtotalyonma2nd':str(mdtotalyonma2nd), 'mtotalyonma3rd':str(mdtotalyonma3rd), 'mtotalroundtotal':str(mdtotalroundtotal) }) else: ref2 = db.reference('m_seed').child('isesaki').child('free') ref2.child(name).set({ 'touroku':str(touroku), 'guestout':str(guestout) }) ref2.child(name).child(str(dtYear)).child('yeartotal').set({ 'ytotalpoints':str(pointnow), 'ytotalevents':str(pointpermanent), 'ytotalyonma1st':str(ydtotalyonma1st), 'ytotalyonma2nd':str(ydtotalyonma2nd), 'ytotalyonma3rd':str(ydtotalyonma3rd), 'ytotalroundtotal':str(ydtotalroundtotal) }) ref2.child(name).child(str(dtYear)).child(str(dtMonth)).child('monthtotal').set({ 'mtotalpoints':str(mdtotalpoints), 'mtotalevents':str(mdtotalevents), 'mtotalyonma1st':str(mdtotalyonma1st), 'mtotalyonma2nd':str(mdtotalyonma2nd), 'mtotalyonma3rd':str(mdtotalyonma3rd), 'mtotalroundtotal':str(mdtotalroundtotal) }) print(touroku) return def dataoutput_func(): pass def submit_func(): pass handler = { 'datainput': datainput_func, 'dataoutput': dataoutput_func, 'Submit': submit_func, } layout = [[sg.Text('名前',font = ('arial',22)),sg.Input(font = ('arial',22))], [sg.Text('登録日',font = ('arial',22)),sg.Input(font = ('arial',22))], [sg.Text('現状ポイント',font = ('arial',22)),sg.Input(font = ('arial',22))], [sg.Text('生涯獲得ポイント',font = ('arial',22)),sg.Input(font = ('arial',22))], [sg.Button('データ入力', key='datainput')], [sg.Button('データ読み込み', key='dataoutput')], [sg.Submit(), sg.Cancel()]] window = sg.Window('既存客ポイント移植コンソール', layout=layout, size = (300,300)) while True: event, value = window.read() print(event, value) if event in [None, 'Cancel']: break function = handler[event] # handlerからeventに応じた関数を呼び出す function() window.close()

アプリのワークフローを制御して、初期化が1回だけ呼び出されるようにする部分です。
例外処理を記述してうまく動くようになりました

投稿2022/01/01 16:21

samusara

総合スコア21

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問