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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Q&A

解決済

2回答

836閲覧

tkinter ラジオボタンで取得した値を、別の.pyファイルで使いたい

minomushia

総合スコア17

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

0グッド

0クリップ

投稿2022/07/29 15:36

tkinterでラジオボタンを作り、取得した文字列を、他の.pyファイルで使うことは可能ですか?
初心者なので、とんちんかんなことを言っていたら教えてください。

実現したいこと

def radio_click()
の中で、messegebox.showinfo で、新しいウィンドウで文字列を出力するのではなく、
その文字列自体を
x = '取得した文字列'
にしたい。

発生している問題・エラーメッセージ

エラーはありません。

該当のソースコード

python

1import tkinter , tkinter.messagebox 2 3#tkinterBasicInfo 4root = tkinter.Tk() 5root.geometry('400x400') 6root.title('MyFirstRadioButton') 7 8#TextList RadioBox 9radiotext = ['始値','安値','高値','終値'] 10#radio Zyoutai 11radio_var = tkinter.IntVar() 12 13#ClickEvent 14def radio_click(): 15 num = radio_var.get() 16 tkinter.messagebox.showinfo("選択された項目",radiotext[num]) 17 18#MakeRadioButton1 19for i in range(len(radiotext)): 20 rdo = tkinter.Radiobutton(root,value=i,variable=radio_var,text=radiotext[i]) 21 rdo.place(x=50,y=30 + (i *24)) 22 23#MakeButton 24btn = tkinter.Button(root,text='ラジオボタン取得',command = radio_click) 25 26#layout 27btn.place(x=100,y=170) 28 29 30root.mainloop()

試したこと

def radio_click(self):
num = radio_var.get()
tkinter.messagebox.showinfo("選択された項目",radiotext[num])

この部分を、↓

def radio_click():
num = radio_var.get()
str = radiotext[num]
return str

こちらに変更して、radio_click()自体に文字列を返しましたが、
x = radio_click()
としても自分でも「?」となってしまい、わからない状態です。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

meg_

2022/07/30 00:49

> tkinterでラジオボタンを作り、取得した文字列を、他の.pyファイルで使うことは可能ですか? 「他の.pyファイルで使う」とはどういう動作でしょうか? tkinterを使用したプログラムから「他の.pyファイル」のプログラムを呼び出して値を渡すことを意味していますか?他のことを想定していますか? また、「としても自分でも「?」となってしまい、わからない状態です。」のときの「x」の値はどうなったのでしょうか?
guest

回答2

0

ベストアンサー

質問の意図がよくわからないところもありますが、いくつかコメントします。

tkinterでボタンなどにcommandとして割り当てる関数の返り値は破棄されてしまうので、取得した値を伝える方法としては使えません。
その関数から値を渡したいときは、他の方の回答にあるとおり、global変数を使います。

「他の.pyファイル」が、別のプログラムをとして軌道したものである場合、「プロセス間通信」という方法を使う必要があります。
https://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E9%96%93%E9%80%9A%E4%BF%A1

そうじゃないよ、という場合、どういう意味なのか教えてください。


ちょっと難しい話なのかもしれませんが、「複数のファイルに処理を書く」 ことと、「プログラムを複数のプロセスで動作させること」は一対一で対応していません。
1つのプロセスで動くプログラムを複数のpyファイルで作ることも、1つのpyファイルなのに複数のプロセスで動作するプログラムを書くこともできます。

まずは、「「1つの.pyファイル」に①と②を合わせたものを作」って動くようにするのがいいでしょう。
大抵のソフトはそれで動かすことができます。

ただ、プログラムが大きくなると、1つのファイルで管理するのが難しくなってきます。 こうなったら、処理の一部を別のファイルに移して、メインのpyファイルでimportして使うようにすると管理が楽になります。
外に出したプログラムを他のプログラムからも使いやすいように考えて作ると使いまわすことができて便利ですね。公開されているモジュールはそういう風に作られたものです。

処理によってはとても時間がかかるし、すぐには結果が必要でないものもあるでしょう。
プログラムは通常1つのことしかできませんので、そういう処理を1つのプロセスで動くプログラムで実行しようとすると、ボタンを押したあとしばらく何もできなくなります。 待っている時間に他の事もできるようにしたいのであれば、そのプログラムをマルチプロセスに対応させることになります。 時間のかかる処理を別のプロセスで実行しておいて、処理結果をプロセス間通信で受け取って処理するようにします。

こんな感じで、必要に応じて、段階を踏みながら進んでいけばいいんじゃないかと思いますよ。

投稿2022/07/30 05:14

編集2022/07/30 15:58
TakaiY

総合スコア12657

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

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

minomushia

2022/07/30 14:36

お返事ありがとうございます! わかりやすい解説ありがとうございました。 ①処理を行いたい.pyファイルを複数個作り、 ②メインのGUIとなるtkinter.pyファイルを作り、②で取得した値や文字列を①に送る、①で計算した値を②にまた送る、といったことをイメージしていました。 ですが、それだと「プロセス間通信」を行う必要があるとのことですが、 できれば「1つの.pyファイル」に①と②を合わせたものを作り、global変数を使ったほうがスムーズ、という解釈で良いのでしょうか? お返事お待ちしております。
minomushia

2022/07/31 14:28

とてもわかりやすいご回答ありがとうございました。 マルチプロセス、プロセス間通信は初めて聞きました。 なんだか作ってみたいプログラムが増えてワクワクします!
guest

0

質問者さんがやりたいことかは分かりませんが下記のようにしてはどうでしょうか?
※下記は追加したコードの部分です。

Python

1def radio_click(): 2 global selected #追加 3 num = radio_var.get() 4 selected = radiotext[num] #追加 5 tkinter.messagebox.showinfo("選択された項目",radiotext[num]) 6 7#追加 8btn2 = tkinter.Button(root,text='ラジオボタン前回値',command = lambda: tkinter.messagebox.showinfo("前回値", selected)) 9#追加 10btn2.place(x=100,y=200)

質問者さんがやりたいことに合わせて修正なさってください。

投稿2022/07/30 01:06

meg_

総合スコア10577

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

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

minomushia

2022/07/31 14:29

ご回答ありがとうございました。 global変数、挑戦してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問