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

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

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

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

Q&A

解決済

1回答

2588閲覧

Pythonでtkinterを用いた関数の返り値を違うファイルでインポート

gymgym

総合スコア97

Python

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

0グッド

2クリップ

投稿2018/01/15 08:31

Python

1#ファイル名 gui.py 2 3def ninsyo(): 4 5 zyan_slide = ['paa.png', 'guu.png', 'tyoki.png'] 6 q_slide = ['kati.png', 'make.png', 'hikiwake.png'] 7 8 zyan = [] 9 10 random.shuffle(zyan_slide) 11 random.shuffle(q_slide) 12 13 # 問題提示 14 15 img = cv2.imread(q_slide[0]) 16 cv2.namedWindow('screen', cv2.WINDOW_NORMAL) 17 cv2.setWindowProperty('screen', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN) 18 cv2.imshow('screen', img) 19 cv2.waitKey(2000) 20 img = cv2.imread(zyan_slide[0]) 21 cv2.namedWindow('screen', cv2.WINDOW_NORMAL) 22 cv2.setWindowProperty('screen', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN) 23 cv2.imshow('screen', img) 24 cv2.waitKey(2000) 25 26 if(zyan_slide[0]=='guu.png' and q_slide[0] == 'hikiwake.png' or zyan_slide[0]=='tyoki.png' and q_slide[0] == 'kati.png' or zyan_slide[0]=='paa.png' and q_slide[0] == 'make.png'): 27 zyan.append(0) 28 elif(zyan_slide[0]=='tyoki.png' and q_slide[0] == 'hikiwake.png' or zyan_slide[0]=='paa.png' and q_slide[0] == 'kati.png' or zyan_slide[0]=='guu.png' and q_slide[0] == 'make.png'): 29 zyan.append(1) 30 elif(zyan_slide[0]=='paa.png' and q_slide[0] == 'hikiwake.png' or zyan_slide[0]=='guu.png' and q_slide[0] == 'kati.png' or zyan_slide[0]=='tyoki.png' and q_slide[0] == 'make.png'): 31 zyan.append(2) 32 33 return(zyan) 34 35root = Tk() 36root.title('Scrollbar 1') 37 38frame1 = ttk.Frame(root, padding=10) 39frame1.grid() 40 41# Listbox 42currencies = ("A", "B") 43v1 = StringVar(value=currencies) 44lb = Listbox(frame1, listvariable=v1,height=3) 45lb.grid(row=0, column=0) 46 47# Label (新規追加) 48label = Label(frame1, width=18) 49label.grid(row=1, column=0, columnspan=2) 50 51# Scrollbar 52scrollbar = ttk.Scrollbar( 53 frame1, 54 orient=VERTICAL, 55 command=lb.yview) 56lb['yscrollcommand'] = scrollbar.set 57scrollbar.grid(row=0,column=1,sticky=(N,S)) 58 59 60#Button 61 62 63button2 = ttk.Button(frame1, text='認証開始', command=lambda: ninsyo()) 64button2.grid(row=4, column=0, columnspan=2) 65 66root.mainloop() 67 68 cv2.destroyAllWindows()

Python

1# ファイル名 file01.py 2 3from gui.py import zyan 4 5# こっちのファイルでzyaを使って処理していきたいと考えています 6print(zyan)

gui.pyの方の関数ninsyo()の返り値を違ったファイルで処理していきたいのですが、どこでzyanを返せるのかがわかりません。

よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

正直何を聞きたいのかよく分からないんですが、回答が付かないようなので。
TkinkerもOpenCVも無視して、『他のモジュールの関数を呼び出す方法』を回答します。

Python

1from gui import ninsyo 2zyan = ninsyo()

以上です。

ついでに

コード自体も意味不明なのですが... これ、じゃんけんですか?
先に一方の手と勝敗を選択して、それに基づいて他方の手を決めているのですね。
じゃんけんの実装など山ほどあるでしょうから、リサーチすることをお勧めします。

ひょっとしたら『逆順じゃんけん(?)』なる頭の体操を実装しようとしているのかもしれません。
しかし、コーダーまで頭の体操をする必要はありません。


また、namedWindowを複数回呼ぶのは無駄です。
何を実現しようとしているのか、自分自身で理解したうえでコードを書いてください。

書いてみた

じゃんけんだけですけど。

Python

1import enum 2import itertools 3import random 4 5Result = enum.Enum('Result', ['WIN', 'DRAW', 'LOOSE']) 6 7class __Hand: 8 def do_game(self, other): 9 raise NotImplementedError 10 11 def wins(self, other): 12 if self.do_game(other) is Result.WIN: 13 return True 14 return False 15 16 def looses(self, other): 17 return other.wins(self) 18 19 def draws(self, other): 20 return not (self.wins(other) or self.looses(other)) 21 22class __Guh(__Hand): 23 def do_game(self, other): 24 if other is choki: 25 return Result.WIN 26 if other is pah: 27 return Result.LOOSE 28 return Result.DRAW 29 30 def __str__(self): 31 return 'guh' 32 33class __Choki(__Hand): 34 def do_game(self, other): 35 if other is pah: 36 return Result.WIN 37 if other is guh: 38 return Result.LOOSE 39 return Result.DRAW 40 41 def __str__(self): 42 return 'choki' 43 44class __Pah(__Hand): 45 def do_game(self, other): 46 if other is guh: 47 return Result.WIN 48 if other is choki: 49 return Result.LOOSE 50 return Result.DRAW 51 52 def __str__(self): 53 return 'pah' 54 55 56guh = __Guh() 57choki = __Choki() 58pah = __Pah() 59 60hands = (guh, choki, pah) 61def get_random_hand(): 62 return random.choice(hands) 63 64def __simple_test(): 65 result = { 66 Result.WIN: 'wins', 67 Result.DRAW: 'draws', 68 Result.LOOSE: 'looses' 69 } 70 71 for mine, other in itertools.product(hands, hands): 72 print( 73 mine, result[mine.do_game(other)], other 74 ) 75 76if __name__ == '__main__': 77 __simple_test()

Python

1import janken 2Result = janken.Result 3 4def ninsho(): 5 hand_img = { 6 janken.guh: 'guh.png', 7 janken.choki: 'choki.png', 8 janken.pah: 'pah.png' 9 } 10 result_img = { 11 Result.WIN: 'win.png', 12 Result.LOOSE: 'loose.png', 13 Result.DRAW: 'draw.png' 14 } 15 16 my_hand = janken.get_random_hand() 17 yr_hand = janken.get_random_hand() 18 result = my_hand.do_game(yr_hand) 19 20 # make window 21 cv2.namedWindow('screen', cv2.WINDOW_NORMAL) 22 cv2.setWindowProperty('screen', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN) 23 24 # show my hand 25 img = cv2.imread(hand_img[my_hand]) 26 assert img is not None 27 cv2.imshow('screen', img) 28 cv2.waitKey(2000) 29 30 # show result 31 img = cv2.imread(result_img[result]) 32 assert img is not None 33 cv2.imshow('screen', img) 34 cv2.waitKey(2000) 35 36 return yr_hand

GUIに関しましては、面倒なのでテストしていません。悪しからず。
また、何度もninshoを呼び出すようならば、画像の入出力は関数外に括りだした方が良いでしょう。

投稿2018/01/15 14:58

編集2018/01/15 15:53
LouiS0616

総合スコア35660

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

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

umyu

2018/01/15 15:40 編集

呼び方はLouiS0616さんの回答であってると思いますが、質問文のコードの場合、gui.pyにif __name__ == '__main__':を記述していないので、import文でgui.pyの root = Tk()以下のコードが全部呼ばれてしまうかと。。
LouiS0616

2018/01/15 15:48

@umyu さん tkinkerには自信がないもので、ちょっと気になったんですがスルーしていました。 ご指摘ありがとうございます。
gymgym

2018/01/16 02:21

わかりづらい質問で申し訳ございません。 修正しておきます。 質問としては、 button2 = ttk.Button(frame1, text='認証開始', command=lambda: ninsyo()) でボタンを押した時に、関数ninsyo()が実行された時に返り値zyanを新しいリストに代入したいのですが、このようなことは可能でしょうか。 といった質問でした。 うまく説明できていいないかもしれないのですが、よろしくお願い致します。
gymgym

2018/01/16 02:22

@umyuさん ご指摘ありがとうございます。修正しておきます。
LouiS0616

2018/01/16 02:25

zyanの値をリストに貯めていきたいということでしょうか? 呼び出し元で戻り値をリストにappendするのが自然だと思います。
gymgym

2018/01/16 02:26

@LouiS0616さん じゃんけんのコードありがとうございました。 プログラミング初心者なので、上級者の方のコードを参考にさせていただけることはとても助かります。 ぜひ参考にして修正させていただきたいと思います!
gymgym

2018/01/16 02:29

貯める必要はないと考えています。 ninsyo()でどのスライドが実行されたかを知りたくて、それをzyanに代入したいと考えています。 appendするリストは、関数の外で宣言するのでよろしいでしょうか。
LouiS0616

2018/01/16 02:36

> appendするリストは、関数の外で宣言するのでよろしいでしょうか。 問題ないです。他の方法もありますが、それが一番自然な実装かと思います。
gymgym

2018/01/16 03:56

了解です。 丁寧に教えてくださりありがとうございます。 とても助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問