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

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

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

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

Tkinter

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

Python

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

Q&A

2回答

681閲覧

Python tkinterでエラーが出ます

mmmm66

総合スコア1

Python 3.x

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

Tkinter

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

Python

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

0グッド

0クリップ

投稿2021/11/10 04:47

前提・実現したいこと

プログラミング初心者です。
Python tkinterで簡単なゲームを作っています。
メインウィンドウのボタンを押すと別のウィンドウが出て、その別ウィンドウでゲームを行いたいのですが、

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

File "C:\python\Graduation study\OXゲーム施策.py", line 46, in mark if player == 1: NameError: name 'player' is not defined

というエラーが出てしまいます。

該当のソースコード

python

1import tkinter as tk 2import tkinter.ttk as ttk 3import random 4import winsound 5 6def sub_window(): 7 win = tk.Toplevel() 8 win.geometry("640x480") 9 cv= tk.Canvas(win,background="gold", width=640, height=480) 10 cv.place(x=0, y=0) 11 12 def init_data(): 13 global init, data 14 data = [[init for i in range(3)] for j in range(3)] 15 def judge(): 16 global data 17 data = [[init for i in range(3)] for j in range(3)] 18 for i in range(3): 19 if data[i][0] != 0: 20 if data[i][0] == data[i][1] and data[i][0] == data[i][2]: 21 return data[i][0] 22 for j in range(3): 23 if data[0][j] != 0: 24 if data[0][j] == data[1][j] and data[0][j] == data[2][j]: 25 return data[0][j] 26 if data[1][1] != 0: 27 if data[0][0] == data[1][1] and data[0][0] == data[2][2]: 28 return data[1][1] 29 elif data[0][2] == data[1][1] and data[0][2] == data[2][0]: 30 return data[1][1] 31 for i in range(3): 32 for j in range(3): 33 if data[j][i] == 0: 34 return 0 35 return -2 36 37 def turn(): 38 global player 39 return player * (-1) 40 def mark(e): 41 global date, player 42 data = [[init for i in range(3)] for j in range(3)] 43 for i in range(3): 44 for j in range(3): 45 if e.widget == btn[j][i]: 46 if player == 1: 47 e.widget["text"] = "〇" 48 data[j][i] = 1 49 elif player ==-1: 50 e.widget["text"] = "×" 51 data[j][i] = -1 52 player = turn() 53 54 if judge() == 1: 55 print("先行プレイヤーの勝利") 56 init_data() 57 init_text() 58 elif judge() == -1: 59 print("後攻プレイヤーの勝利") 60 init_data() 61 init_text() 62 elif judge() == -2: 63 print("引き分けです") 64 init_data() 65 init_text() 66 67#ボタンのテキストを初期化 68 def init_text(): 69 global btn 70 for i in range(3): 71 for j in range(3): 72 btn[i][j]["text"] = "" 73 win.title("〇×ゲーム") 74 player = 1 75 init = 0 76 data = [[init for i in range(3)] for j in range(3)] 77 w = 20 78 h = 5 79 btn = [[tk.Button(win, width=w, height=h) for i in range(3)] for j in range(3)] 80 for i in range(3): 81 for j in range(3): 82 btn[j][i].grid(column=j, row=i) 83 win.bind("<1>", mark) 84 win.mainloop() 85 86 87#-------------------------------------------------------------------------- 88# rootメインウィンドウの設定 89root = tk.Tk() 90root.geometry("600x600") 91root.title("シュミレーションゲーム") 92canvas0= tk.Canvas(background="#cea", width=600, height=600) 93canvas0.place(x=0, y=0) 94label0= tk.Label(canvas0, text="ゲーム施策") 95label0.place(x=300,y=450,anchor=tk.CENTER) 96button = tk.Button(canvas0, text="サブウィンドウ生成", command=sub_window) 97button.place(x=300,y=500) 98root.mainloop()

line41の global date, player で
playerと定義してるのにplayerが見つからないといわれてしまうのはなぜでしょうか。

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

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

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

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

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

guest

回答2

0

line41の global date, player で宣言する前に
player = 1などと定義して実行してみて下さい。

投稿2021/11/12 04:21

ekTJ

総合スコア109

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

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

0

  • line41の global date, player でplayerと定義してるのにplayerが見つからないといわれてしまうのはなぜでしょうか。

グローバル文は、その名前が出てきたらグローバルだよと宣言しているだけで、定義はしていないからです。

公式ドキュメント 7.12. global 文をお読みください。

投稿2021/11/10 07:29

ppaul

総合スコア24670

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問