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

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

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

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

Python

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

Q&A

解決済

1回答

2553閲覧

Kivyでボタン押下時に代入した値を別モジュールで取得したい

koosan

総合スコア1

Kivy

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

Python

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

0グッド

0クリップ

投稿2021/10/30 05:01

前提・実現したいこと

pythonでKivyを用いて画面を作成。
画面のボタン押下時に変数に代入を行う。
その値をもとのモジュールで取得する。

発生している問題

ボタン押下時の処理にprint()を追加すると代入は確認できる。
しかし、元のモジュール側では代入されていない。

該当のソースコード

main.py

import datetime import inquirer import window global Mode def main(): Mode = 0 #GUIの起動 window.MainWinApp().run() print(Mode) #①

window.py

from kivy.config import Config Config.set('graphics', 'width', '900') Config.set('graphics', 'height', '480') from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.uix.button import Button from kivy.core.text import LabelBase, DEFAULT_FONT from kivy.resources import resource_add_path import main class MainWinScreen(BoxLayout): def __init__(self, **kwargs): super().__init__(**kwargs) def buttonClicked1(self): Mode = 1 print(Mode) #② class MainWinApp(App): def build(self): return MainWinScreen()

mainwin.kv

# -*- coding: utf-8 -*- MainWinScreen: <MainWinScreen>: BoxLayout: orientation: 'vertical' size: root.size Label: size_hint_y: 0.3 id: label1 text: "モードを選択してください" font_size: 26 BoxLayout: size_hint_y: 0.7 Button: id: button1 text: "ボタン1" font_size: 26 on_press: root.buttonClicked1()

補足情報

①のprint(Mode)では0
②のprint(Mode)では1
となります。
①の部分でもwindow.pyで代入した値を取得したいです。

pythonを初めて2日のため、右も左もわかっていない状態です。
追加で必要な情報がありましたら記載をしますのでご指摘ください。
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Python でのグローバル変数の有効範囲は、モジュール内。
通常であれば、ファイル内のみに制限されます。

別モジュールから参照したい場合は、モジュール名経由で参照します。

例: mainモジュール内のグローバル変数 Mode を参照したい場合は、別モジュールからは main.Mode


main <-> window 相互インポートする構成になってるので
変数 Mode は、この場合であれば window モジュール側に持たせてください。

main -> window としているのに window -> main のインポートがあると、
モジュール間に不要な依存関係が生じて、
window が他のモジュールから再利用しにくい設計・構成になってしまいます。

python

1# window.py 2 3# XXX: main.py は import しない。相互importになってしまう為。 4# import main 5 6Mode = 0 7 8class MainWinScreen(BoxLayout): 9 def __init__(self, **kwargs): 10 super().__init__(**kwargs) 11 12 def buttonClicked1(self): 13 # NOTE: グローバル変数を書き換える為、宣言が必要 14 global Mode 15 16 Mode = 1 17 print(Mode) #② 18 19 20# main.py 21 22import window 23 24# XXX: 不要。Pythonではglobal宣言は関数内で行います。 25# global Mode 26 27def main(): 28 # XXX: window 側で初期化 29 # Mode = 0 30 window.Mode = 0 31 32 #GUIの起動 33 window.MainWinApp().run() 34 35 print(window.Mode) #① 36

但し、グローバル変数にすると、
複数の MainWinScreen インスタンスを作った際に、
同じ変数を共有することになるので、複数インスタンスからの操作が競合して
問題になる事があります。

更にクラス・モジュールの再利用性を高めるなら、
MainWinApp のインスタンス変数にする等を検討して見て下さい。

※ MainWinScreen や MainWinApp のインスタンスを一つしか作らない場合は
問題点が解りにくいかもしれません。


参考:

投稿2021/10/30 06:19

teamikl

総合スコア8664

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

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

koosan

2021/10/30 07:02

ご回答ありがとうございます。 ご提示いただきました内容で希望していた通りの動作となりました。 Pythonの基礎の部分の知識が足りていないと感じましたので、参考のURLなどを確認して勉強いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問