首页 > 解决方案 > 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()

标签: pythontkinter

解决方案


restart_button看不到里面main()main()由于某种原因,您在函数中定义了一堆函数,包括reset_game,因此不在范围内的任何内容main()都看不到这些函数。解决方案是将函数移到main().


推荐阅读