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

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

ただいまの
回答率

90.02%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 2
  • VIEW 1,022

gymgym

score 88

#ファイル名 gui.py

def ninsyo():

    zyan_slide = ['paa.png', 'guu.png', 'tyoki.png']
    q_slide = ['kati.png', 'make.png', 'hikiwake.png']

    zyan = []

    random.shuffle(zyan_slide)
    random.shuffle(q_slide)

    # 問題提示

    img = cv2.imread(q_slide[0])
    cv2.namedWindow('screen', cv2.WINDOW_NORMAL)
    cv2.setWindowProperty('screen', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)
    cv2.imshow('screen', img)
    cv2.waitKey(2000)
    img = cv2.imread(zyan_slide[0])
    cv2.namedWindow('screen', cv2.WINDOW_NORMAL)
    cv2.setWindowProperty('screen', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)
    cv2.imshow('screen', img)
    cv2.waitKey(2000)

    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'):
        zyan.append(0)
    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'):
        zyan.append(1)
    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'):
        zyan.append(2)

    return(zyan)

root = Tk()
root.title('Scrollbar 1')

frame1 = ttk.Frame(root, padding=10)
frame1.grid()

# Listbox
currencies = ("A", "B")
v1 = StringVar(value=currencies)
lb = Listbox(frame1, listvariable=v1,height=3)
lb.grid(row=0, column=0)

# Label (新規追加)
label = Label(frame1, width=18)
label.grid(row=1, column=0, columnspan=2)

# Scrollbar
scrollbar = ttk.Scrollbar(
    frame1,
    orient=VERTICAL,
    command=lb.yview)
lb['yscrollcommand'] = scrollbar.set
scrollbar.grid(row=0,column=1,sticky=(N,S))


#Button


button2 = ttk.Button(frame1, text='認証開始', command=lambda: ninsyo())
button2.grid(row=4, column=0, columnspan=2)

root.mainloop()

    cv2.destroyAllWindows()
# ファイル名 file01.py

from gui.py import zyan

# こっちのファイルでzyaを使って処理していきたいと考えています
print(zyan)

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

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

from gui import ninsyo
zyan = ninsyo()

以上です。

ついでに

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

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


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

書いてみた

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

import enum
import itertools
import random

Result = enum.Enum('Result', ['WIN', 'DRAW', 'LOOSE'])

class __Hand:
    def do_game(self, other):
        raise NotImplementedError

    def wins(self, other):
        if self.do_game(other) is Result.WIN:
            return True
        return False

    def looses(self, other):
        return other.wins(self)

    def draws(self, other):
        return not (self.wins(other) or self.looses(other))

class __Guh(__Hand):
    def do_game(self, other):
        if other is choki:
            return Result.WIN
        if other is pah:
            return Result.LOOSE
        return Result.DRAW

    def __str__(self):
        return 'guh'

class __Choki(__Hand):
    def do_game(self, other):
        if other is pah:
            return Result.WIN
        if other is guh:
            return Result.LOOSE
        return Result.DRAW

    def __str__(self):
        return 'choki'

class __Pah(__Hand):
    def do_game(self, other):
        if other is guh:
            return Result.WIN
        if other is choki:
            return Result.LOOSE
        return Result.DRAW

    def __str__(self):
        return 'pah'


guh = __Guh()
choki = __Choki()
pah = __Pah()

hands = (guh, choki, pah)
def get_random_hand():
    return random.choice(hands)

def __simple_test():
    result = {
        Result.WIN: 'wins',
        Result.DRAW: 'draws',
        Result.LOOSE: 'looses'
    }

    for mine, other in itertools.product(hands, hands):
        print(
            mine, result[mine.do_game(other)], other
        )

if __name__ == '__main__':
    __simple_test()
import janken
Result = janken.Result

def ninsho():
    hand_img = {
        janken.guh: 'guh.png',
        janken.choki: 'choki.png',
        janken.pah: 'pah.png'
    }
    result_img = {
        Result.WIN: 'win.png',
        Result.LOOSE: 'loose.png',
        Result.DRAW: 'draw.png'
    }

    my_hand = janken.get_random_hand()
    yr_hand = janken.get_random_hand()
    result = my_hand.do_game(yr_hand)

    # make window
    cv2.namedWindow('screen', cv2.WINDOW_NORMAL)
    cv2.setWindowProperty('screen', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)

    # show my hand
    img = cv2.imread(hand_img[my_hand])
    assert img is not None
    cv2.imshow('screen', img)
    cv2.waitKey(2000)

    # show result
    img = cv2.imread(result_img[result])
    assert img is not None
    cv2.imshow('screen', img)
    cv2.waitKey(2000)

    return yr_hand

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/16 11:29

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

    キャンセル

  • 2018/01/16 11:36

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

    キャンセル

  • 2018/01/16 12:56

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

    キャンセル

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

  • ただいまの回答率 90.02%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる