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

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

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

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

Python

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

Q&A

解決済

1回答

399閲覧

画像が表示されるframeと表示されないframeがある

takatoyo

総合スコア13

Tkinter

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

Python

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

0グッド

1クリップ

投稿2022/01/19 08:46

前提・実現したいこと

麻雀のルールを説明するアプリをTkinterで制作しています。

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

麻雀牌の画像を表示して説明を行いたいのですがtile_frame7のみ画像が表示され、tile_frame1~tile_frame6まで画像がcanvasに表示されません。
tile_frame1~tile_frame6とtile_frame7のソースを比較しましたが、特に違いが無くエラーメッセージも表示されないのでなぜなのかわかりません。
別のプログラムで試したところ画像は問題なく表示されたので参照ミスではないと思います。
ご教授お願い致します。

該当のソースコード

Python

1import numpy as np 2import cv2 3import PIL.Image,PIL.ImageTk 4import tkinter as tk 5from pickle import TRUE 6from mahjong import agari, constants, shanten, tile 7from mahjong.hand_calculating import hand, hand_config 8import fire 9import copy 10from tkinter import Canvas 11 12 13##### PATH設定 14MAHJONG_TILES_PATH = 'C:\\university\\guraduation research\\pai_images\\' # 麻雀牌画像パス 15PATH_DELIMITER = '\\' 16 17### 定数定義 18Mahjong_tiles_types = ['ji1','ji2','ji3','ji4','ji5','ji6','ji7','ji1y','ji2y','ji3y','ji4y','ji5y','ji6y','ji7y', 19 'man1','man2','man3','man4','man5','man6','man7','man8','man9','man1y','man2y','man3y','man4y','man5y','man6y','man7y','man8y','man9y', 20 'pin1','pin2','pin3','pin4','pin5','pin6','pin7','pin8','pin9','pin1y','pin2y','pin3y','pin4y','pin5y','pin6y','pin7y','pin8y','pin9y', 21 'sou1','sou2','sou3','sou4','sou5','sou6','sou7','sou8','sou9','sou1y','sou2y','sou3y','sou4y','sou5y','sou6y','sou7y','sou8y','sou9y','yohaku'] 22tile_images = {} 23for mj_tile in Mahjong_tiles_types: 24 tile_images[mj_tile] = cv2.imread(MAHJONG_TILES_PATH + mj_tile + '.png', cv2.IMREAD_COLOR) 25tehai = cv2.hconcat([tile_images['man1'],tile_images['man2'],tile_images['man3'],tile_images['pin4'],tile_images['pin5'],tile_images['pin6'],tile_images['sou1'],tile_images['sou1'],tile_images['sou7'],tile_images['sou8'],tile_images['sou9'],tile_images['ji1'],tile_images['ji1'],tile_images['ji1'],]) 26ji_tiles = cv2.hconcat([tile_images['ji1'],tile_images['ji2'],tile_images['ji3'],tile_images['ji4'],tile_images['ji5'],tile_images['ji6'],tile_images['ji7'],tile_images['yohaku'],tile_images['yohaku']]) 27man_tiles = cv2.hconcat([tile_images['man1'],tile_images['man2'],tile_images['man3'],tile_images['man4'],tile_images['man5'],tile_images['man6'],tile_images['man7'],tile_images['man8'],tile_images['man9']]) 28pin_tiles = cv2.hconcat([tile_images['pin1'],tile_images['pin2'],tile_images['pin3'],tile_images['pin4'],tile_images['pin5'],tile_images['pin6'],tile_images['pin7'],tile_images['pin8'],tile_images['pin9']]) 29sou_tiles = cv2.hconcat([tile_images['sou1'],tile_images['sou2'],tile_images['sou3'],tile_images['sou4'],tile_images['sou5'],tile_images['sou6'],tile_images['sou7'],tile_images['sou8'],tile_images['sou9']]) 30suuhai = cv2.vconcat([man_tiles,pin_tiles,sou_tiles]) 31mahjong_tiles = cv2.vconcat([ji_tiles,man_tiles,pin_tiles,sou_tiles]) 32ji_tiles = cv2.hconcat([tile_images['ji1'],tile_images['ji2'],tile_images['ji3'],tile_images['ji4'],tile_images['ji5'],tile_images['ji6'],tile_images['ji7']]) 33chunchanpai_man = cv2.hconcat([tile_images["man2"],tile_images["man3"],tile_images["man4"],tile_images["man5"],tile_images["man6"],tile_images["man7"],tile_images["man8"]]) 34chunchanpai_pin = cv2.hconcat([tile_images["pin2"],tile_images["pin3"],tile_images["pin4"],tile_images["pin5"],tile_images["pin6"],tile_images["pin7"],tile_images["pin8"]]) 35chunchanpai_sou = cv2.hconcat([tile_images["sou2"],tile_images["sou3"],tile_images["sou4"],tile_images["sou5"],tile_images["sou6"],tile_images["sou7"],tile_images["sou8"]]) 36chunchanpai = cv2.vconcat([chunchanpai_man,chunchanpai_pin,chunchanpai_sou]) 37 38OPT_RULES = hand_config.OptionalRules(has_open_tanyao=True) 39WIND_STR2CONST = {"EAST": constants.EAST, 40 "SOUTH": constants.SOUTH, 41 "WEST": constants.WEST, 42 "NORTH": constants.NORTH} 43WIND_STR2CHARA = {"EAST": "東", 44 "SOUTH": "南", 45 "WEST": "西", 46 "NORTH": "北"} 47#ホーム 48def home(): 49 home_frame.tkraise() 50#入門者編ホーム 51def title_btn1_click(): 52 intro_frame.tkraise() 53#麻雀牌の種類① 54def tile_btn1_click(): 55 tile_frame1.tkraise() 56#麻雀牌の種類② 57def tile_btn2_click(): 58 tile_frame2.tkraise() 59#麻雀牌の種類③ 60def tile_btn3_click(): 61 tile_frame3.tkraise() 62#麻雀牌の種類④ 63def tile_btn4_click(): 64 tile_frame4.tkraise() 65#麻雀牌の種類⑤ 66def tile_btn5_click(): 67 tile_frame5.tkraise() 68#麻雀牌の種類⑥ 69def tile_btn6_click(): 70 tile_frame6.tkraise() 71#麻雀牌の種類⑦ 72def tile_btn7_click(): 73 tile_frame7.tkraise() 74 75#ホーム 76root = tk.Tk() 77root.title('麻雀初心者支援ツール') 78root.geometry('1200x700') #*ではなく小文字のxで記述 79root.grid_rowconfigure(0,weight=1) 80root.grid_columnconfigure(0,weight=1) 81home_frame = tk.Frame(root) 82home_frame.grid(row=0, column=0, sticky="nsew") 83title_btn1 = tk.Button(home_frame, width=80,height=10,font=('MSゴシック','15','bold'),text = 'ルールがわからない人向け',anchor=tk.CENTER,command=title_btn1_click) 84title_btn1.pack(fill = 'x', padx=100) 85 86#入門者編ホーム 87intro_frame = tk.Frame(root) 88root.title('ルールを知らない人向け(入門編)') 89intro_frame.grid(row=0, column=0, sticky="nsew") 90intro_frame.label = tk.Label(intro_frame,font=('MSゴシック','20','bold'), text='このステップは麻雀のルールを全く知らない人向けです\nまずは麻雀の基本から学びましょう') 91intro_frame.label.pack() 92intro_titlebtn1 = tk.Button(intro_frame, text="①麻雀牌の種類", height=10, width=80, command=tile_btn1_click) 93intro_titlebtn1.pack() 94 95#麻雀牌の種類① 96tile_frame1 = tk.Frame(root) 97tile_frame1.grid(row=0, column=0, sticky="nsew") 98tile_frame1.label = tk.Label(tile_frame1,font=('MSゴシック','20','bold'), text='まず麻雀に使用する道具に「牌(パイ、ハイ)」と呼ばれるものがあります\nこれは27種の数牌(すうはい、かずはい)と7種の字牌(じはい)から成り、\n1種類につき4個存在するので使用する総数は34種×4枚=136枚となります') 99tile_frame1.label.place(x=80,y=100) 100canvas = tk.Canvas(tile_frame1,bg="green") 101canvas.pack(expand=True,fill=tk.X) 102image = PIL.ImageTk.PhotoImage(image=PIL.Image.fromarray(mahjong_tiles)) 103canvas.create_image(500,100,image=image) 104tile_btn2 = tk.Button(tile_frame1,text="次へ", width=8, command=tile_btn2_click) 105tile_btn2.place(x=1100,y=300) 106tile_frame1.update() 107#麻雀牌の種類② 108tile_frame2 = tk.Frame(root) 109tile_frame2.grid(row=0, column=0, sticky="nsew") 110tile_frame2.label = tk.Label(tile_frame2,font=("MSゴシック","20","bold"),text="麻雀はこの136枚の牌から14枚の牌を手牌とし、\n特定の形に揃えてアガリを目指すゲームです") 111tile_frame2.label.place(x=300,y=100) 112canvas = tk.Canvas(tile_frame2,bg="green") 113canvas.pack(expand=True,fill=tk.X) 114canvas.create_image(500,100,image=image) 115tile_btn3 = tk.Button(tile_frame2,text="次へ", width=8, command=tile_btn3_click) 116tile_btn3.place(x=1100,y=300) 117tile_frame2.update() 118#麻雀牌の種類③ 119tile_frame3 = tk.Frame(root) 120tile_frame3.grid(row=0, column=0, sticky="nsew") 121tile_frame3.label = tk.Label(tile_frame3,font=("MSゴシック","20","bold"),text="数牌は漢数字で数字が描かれた萬子(マンズ)\n丸の数で数字を表す筒子(ピンズ)\n竹のようなマークの数で数字を表す索子(ソーズ)\nの3種類があります\nトランプのハートやダイヤのようなものです") 122tile_frame3.label.place(x=250,y=50) 123canvas = tk.Canvas(tile_frame3,bg="green") 124canvas.pack(expand=True,fill=tk.X) 125suuhai = cv2.vconcat([man_tiles,pin_tiles,sou_tiles]) 126image = PIL.ImageTk.PhotoImage(image=PIL.Image.fromarray(suuhai)) 127canvas.create_image(500,100,image=image) 128tile_btn4 = tk.Button(tile_frame3,text="次へ",width=8,command=tile_btn4_click) 129tile_btn4.place(x=1100,y=300) 130tile_frame3.update() 131#麻雀牌の種類④ 132tile_frame4 = tk.Frame(root) 133tile_frame4.grid(row=0, column=0, sticky="nsew") 134tile_frame4.label = tk.Label(tile_frame4,font=("MSゴシック","20","bold"),text="数牌は中国語の1~9と萬(マン)、筒(ピン)、索(ソー)を合わせて呼びます\n例えば萬子の5であれば5(ウー)と萬(マン)を合わせて五萬(ウーマン)と呼びます\n始めたばかりの時は呼び方はそれほど重要ではありません\n「漢数字の4」や「竹の6」など、自分の覚えやすい呼び方で大丈夫です") 135tile_frame4.label.place(x=100,y=50) 136canvas = tk.Canvas(tile_frame4,bg="green") 137canvas.pack(expand=True,fill=tk.X) 138suuhai = cv2.vconcat([man_tiles,pin_tiles,sou_tiles]) 139image = PIL.ImageTk.PhotoImage(image=PIL.Image.fromarray(suuhai)) 140canvas.create_image(500,100,image=image) 141tile_btn5 = tk.Button(tile_frame4,text="次へ",width=8,command=tile_btn5_click) 142tile_btn5.place(x=1100,y=300) 143tile_frame4.update() 144#麻雀牌の種類⑤ 145tile_frame5 = tk.Frame(root) 146tile_frame5.grid(row=0, column=0, sticky="nsew") 147tile_frame5.label = tk.Label(tile_frame5,font=("MSゴシック","20","bold"),text="字牌には東南西北の4つからなる風牌と白發中の3つからなる三元牌があります\n風牌は順番に東(トン)、南(ナン)、西(シャー)、北(ペイ)と読みます\n三元牌は順番に白(ハク)、發(ハツ)、中(チュン)と読みます") 148tile_frame5.label.place(x=100,y=50) 149canvas = tk.Canvas(tile_frame5,bg="green") 150canvas.pack(expand=True,fill=tk.X) 151image = PIL.ImageTk.PhotoImage(image=PIL.Image.fromarray(ji_tiles)) 152canvas.create_image(500,100,image=image) 153tile_btn6 = tk.Button(tile_frame5,text="次へ",width=8,command=tile_btn6_click) 154tile_btn6.place(x=1100,y=300) 155tile_frame5.update() 156#麻雀牌の種類⑥ 157tile_frame6 = tk.Frame(root) 158tile_frame6.grid(row=0, column=0, sticky="nsew") 159tile_frame6.label = tk.Label(tile_frame6,font=("MSゴシック","20","bold"),text="日本とは違い、麻雀における方角の順番は東→南→西→北です\nまた三元牌の順番も白→發→中です\n後に登場する「ドラ」の理解に必要なので間違えないようにしましょう") 160tile_frame6.label.place(x=150,y=50) 161canvas = tk.Canvas(tile_frame6,bg="green") 162canvas.pack(expand=True,fill=tk.X) 163image = PIL.ImageTk.PhotoImage(image=PIL.Image.fromarray(ji_tiles)) 164canvas.create_image(500,100,image=image) 165tile_btn7 = tk.Button(tile_frame6,text="次へ",width=8,command=tile_btn7_click) 166tile_btn7.place(x=1100,y=300) 167tile_frame6.update() 168#麻雀牌の種類⑦ 169tile_frame7 = tk.Frame(root) 170tile_frame7.grid(row=0, column=0, sticky="nsew") 171tile_frame7.label = tk.Label(tile_frame7,font=("MSゴシック","20","bold"),text="以上の34種の牌を使って麻雀はプレイされます\n次からは何をすればアガリになるのかを見ていきます") 172tile_frame7.label.place(x=250,y=50) 173canvas = tk.Canvas(tile_frame7,bg="green") 174canvas.pack(expand=True,fill=tk.X) 175image = PIL.ImageTk.PhotoImage(image=PIL.Image.fromarray(mahjong_tiles)) 176canvas.create_image(500,100,image=image) 177home_btn = tk.Button(tile_frame7,text="ホーム",width=8,command=home) 178home_btn.place(x=1100,y=300) 179tile_frame7.update() 180 181home() 182root.mainloop() 183

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

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

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

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

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

guest

回答1

0

ベストアンサー

canvas に画像を登録する処理がありますが、どうやら参照(reference)を使用している模様です。なので、image 変数の名前をそれぞれ image1 ... image7 に変更してみて下さい。

python

1#image = PIL.ImageTk.PhotoImage(image=PIL.Image.fromarray(mahjong_tiles)) 2#canvas.create_image(500,100,image=image) 3image1 = PIL.ImageTk.PhotoImage(image=PIL.Image.fromarray(mahjong_tiles)) 4canvas.create_image(500,100,image=image1)

投稿2022/01/19 11:11

melian

総合スコア19749

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

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

takatoyo

2022/01/19 11:13

キャンバスや変数の名前を変更したら上手く表示されるようになりました! いつもありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問