python - tkinter - 未定义按钮中的函数调用
问题描述
我迷路了!我正在尝试编写某种与原始游戏相比有一些变化的二十一点游戏。如果您注意到在代码的末尾,我创建了一个名为 restart_button 的按钮。
他调用的函数是reset_game。当我尝试运行代码时,我收到错误消息 - NameError: name 'reset_game' is not defined
你们知道我该如何解决吗?提前致谢
附言。我在 2 个月前开始编码,所以请不要对我不那么漂亮的代码生气。
import random
from tkinter import *
window = Tk()
window.title("Black Jack (made by ziv)")
icon = PhotoImage(file='icon.png')
window.iconphoto(True, icon)
window.config(background='#696868')
window.geometry("670x600")
window.resizable(False, False)
player1_cards_total = 0
player2_cards_total = 0
main_label = Label(window, text='Player 1 Turn!', font=('Ariel', 40, 'bold'), fg='Black', bg="#696868")
player1_card_count_label = Label(window, text="Card Count: 0", font=('Ariel', 30, 'bold'), pady=30, fg='black', bg='#696868')
player2_card_count_label = Label(window, text="Card Count: 0", font=('Ariel', 30, 'bold'), pady=30, fg='black', bg='#696868')
def welcome_screen():
global welcome_label
global instruction_label
global rules_label
global move_to_instructions_button
global move_to_game_button
global move_to_welcome_button
label_remover()
welcome_label.grid(row=0, column=0, columnspan=2, sticky="e")
move_to_instructions_button.grid(row=1, column=0, padx=20)
move_to_game_button.grid(row=1, column=1)
def instructions_maker():
global welcome_label
global instruction_label
global rules_label
global move_to_instructions_button
global move_to_game_button
global move_to_welcome_button
label_remover()
instruction_label.grid(row=0, column=0, columnspan=2)
rules_label.grid(row=1, column=0, columnspan=2)
move_to_welcome_button.grid(row=2, column=0)
move_to_game_button.grid(row=2, column=1)
def main():
global instruction_label
global rules_label
global move_to_game_button
global move_to_welcome_button
global move_to_instructions_button
label_remover()
move_to_welcome_button.grid(row=4, column=0)
move_to_instructions_button.grid(row=4, column=1)
def player1_draw_card():
global player1_cards_total
player1_cards_total += random.randint(1, 13)
player1_card_count_label.config(text="Card Count: " + str(player1_cards_total))
if player1_cards_total == 21:
main_label.config(text="Player 2 Turn!")
player1_draw_card_button.config(state=DISABLED)
player1_999.config(state=DISABLED)
player2_draw_card_button.config(state=NORMAL)
player2_999.config(state=NORMAL)
if player1_cards_total > 21:
main_label.config(text="Player 2 Won!")
stop_game()
def player1_stop_play(p1_entry_input):
if player1_999.get()[len(player1_999.get()) - 1] != '9':
x = player1_999.get()
player1_999.delete(0, END)
player1_999.insert(0, x[0:len(x) - 1])
elif player1_999.get() == '999':
player1_draw_card_button.config(state=DISABLED)
player1_999.config(state=DISABLED)
player2_draw_card_button.config(state=NORMAL)
player2_999.config(state=NORMAL)
main_label.config(text="Player 2 Turn!")
def player2_draw_card():
global player1_cards_total
global player2_cards_total
player2_cards_total += random.randint(1, 13)
player2_card_count_label.config(text="Card Count: " + str(player2_cards_total))
if player1_cards_total < player2_cards_total <= 21:
main_label.config(text="Player 2 Won!")
player1_draw_card_button.config(state=DISABLED)
player1_999.config(state=DISABLED)
player2_draw_card_button.config(state=DISABLED)
player2_999.config(state=DISABLED)
stop_game()
elif player1_cards_total == player2_cards_total == 21:
main_label.config(text="Draw! Lets Reset!")
player2_draw_card_button.config(state=DISABLED)
player2_999.config(state=DISABLED)
window.after(2500, reset_game)
elif player2_cards_total > 21:
main_label.config(text="Player 1 Won!")
stop_game()
def player2_stop_play(p2_entry_input):
if player2_999.get()[len(player2_999.get()) - 1] != '9':
x = player2_999.get()
player2_999.delete(0, END)
player2_999.insert(0, x[0:len(x) - 1])
elif player2_999.get() == '999':
global player1_cards_total
global player2_cards_total
if player1_cards_total < player2_cards_total <= 21:
main_label.config(text="Player 2 Won!")
player1_draw_card_button.config(state=DISABLED)
player1_999.config(state=DISABLED)
player2_draw_card_button.config(state=DISABLED)
player2_999.config(state=DISABLED)
stop_game()
restart_button.grid(row=5, column=0, columnspan=2, pady=10)
elif player1_cards_total == player2_cards_total and player2_cards_total <= 21:
main_label.config(text="Draw! Lets Reset!")
player2_draw_card_button.config(state=DISABLED)
player2_999.config(state=DISABLED)
window.after(3500, reset_game)
elif player2_cards_total < player1_cards_total <= 21:
main_label.config(text="Player 1 Won!")
stop_game()
def reset_game():
global player1_cards_total
global player2_cards_total
main_label.config(text="Player 1 Turn")
player1_cards_total = 0
player2_cards_total = 0
player1_card_count_label.config(text="Card Count: " + str(player1_cards_total))
player2_card_count_label.config(text="Card Count: " + str(player2_cards_total))
player1_draw_card_button.config(state=NORMAL)
player1_999.config(state=NORMAL)
player2_draw_card_button.config(state=DISABLED)
player2_999.config(state=NORMAL)
player1_999.delete(0, END)
player2_999.delete(0, END)
player2_999.config(state=DISABLED)
try:
restart_button.grid_remove()
except:
pass
def stop_game():
global player1_cards_total
global player2_cards_total
global restart_button
player1_draw_card_button.config(state=DISABLED)
player1_999.config(state=DISABLED)
player2_draw_card_button.config(state=DISABLED)
player2_999.config(state=DISABLED)
restart_button.grid(row=5, column=0, columnspan=2, pady=10)
player1_draw_card_button = Button(text="player 1" + "\n" + "draw card", padx=80, pady=50, bg="#212121", fg="#FFFFFF",
command=player1_draw_card, font=('Ariel', 20, 'bold'), state=NORMAL)
player2_draw_card_button = Button(text="player 2" + "\n" + "draw card", padx=80, pady=50, bg="#212121", fg="#FFFFFF",
command=player2_draw_card, font=('Ariel', 20, 'bold'), state=DISABLED)
player1_999 = Entry(window, state=NORMAL, font=('Ariel', 30, 'bold'), width=5, fg='black', bg='#3b3b3b',
disabledbackground='#212121', disabledforeground='black')
player2_999 = Entry(window, state=DISABLED, font=('Ariel', 30, 'bold'), width=5, fg='black', bg='#3b3b3b',
disabledbackground='#212121', disabledforeground='black')
player1_999.bind("<KeyRelease>", player1_stop_play)
player2_999.bind("<KeyRelease>", player2_stop_play)
main_label.grid(row=0, column=0, columnspan=2)
player1_card_count_label.grid(row=1, column=0)
player1_draw_card_button.grid(row=2, column=0, padx=10)
player1_999.grid(row=3, column=0, pady=20, ipadx=30)
player2_card_count_label.grid(row=1, column=1)
player2_draw_card_button.grid(row=2, column=1, padx=10)
player2_999.grid(row=3, column=1, pady=20, ipadx=30)
def label_remover():
welcome_label.grid_remove()
instruction_label.grid_remove()
rules_label.grid_remove()
move_to_instructions_button.grid_remove()
move_to_game_button.grid_remove()
move_to_welcome_button.grid_remove()
main_label.grid_remove()
player1_card_count_label.grid_remove()
player2_card_count_label.grid_remove()
welcome_label = Label(window, text=" welcome to my Black Jack game!" + "\n" + " made by ziv lahav",
font=('Ariel', 20, 'bold'), pady=30, fg='black', bg='#696868')
move_to_instructions_button = Button(text='instructions screen', width=20, height=5, bg="#212121", fg="#FFFFFF",
command=instructions_maker, font=('Ariel', 12, 'bold'), state=NORMAL)
move_to_game_button = Button(text='start game', width=20, height=5, bg="#212121", fg="#FFFFFF", command=main,
font=('Ariel', 12, 'bold'), state=NORMAL)
instruction_label = Label(window, text=" instructions:\n the player draws cards valued at 1-13. \n"
" when the player wants to switch turns,\n he writes '999' in the input box.",
font=('Ariel', 20, 'bold'), pady=30, fg='black', bg='#696868')
rules_label = Label(window, text=" goal:\n the goal is to get as close as you get to 21.\n"
" if a player's total card count > 21, he looses", font=('Ariel', 20, 'bold'), pady=30,
fg='black', bg='#696868')
move_to_welcome_button = Button(text="welcome screen", width=20, height=5, bg="#212121", fg="#FFFFFF", command=welcome_screen,
font=('Ariel', 12, 'bold'), state=NORMAL)
restart_button = Button(text="Click Here To Restart", width=20, height=5, bg="#212121", fg="#FFFFFF", command=reset_game,
font=('Ariel', 9, 'bold'), state=NORMAL)
welcome_screen()
window.mainloop()
解决方案
restart_button
看不到里面main()
。main()
由于某种原因,您在函数中定义了一堆函数,包括reset_game
,因此不在范围内的任何内容main()
都看不到这些函数。解决方案是将函数移到main()
.
推荐阅读
- node.js - 如何通过 Node.js 运行具有不同凭据的 exchange powershell 命令?
- c# - 如何使用 IdentityServer4 将 AspNetIdentity 添加到我的 API
- r - R:将工作表添加到现有的 Excel 工作簿
- python - 在 Python 3.5+ 中将格式字符串作为关键字参数传递的替代方法
- angular - Angular 2 - 如何在 TinyMCE 编辑器中初始设置内容
- string - SAS:选择末尾有空格的字符串
- c# - ffmpeg 无法处理通过 ajax C# 上传的文件
- python - Pandas 在最后 n 行中计数大于当前行的值
- qt - 在图形场景中如何使重叠的对象透明?
- objective-c - [视图控制器保留]:关闭视图控制器后发送到已释放实例错误的消息