首页 > 解决方案 > 有没有办法不在我的代码中使用全局变量?

问题描述

我对 Python 比较陌生,所以请忍受我的代码效率低下。这是我的第一个 Tkinter 应用程序之一,它非常简单。这是一个密码猜谜游戏,用户尝试猜测随机生成的 4 位密码。该代码当前打印随机生成的数字,以便更容易查看代码是否有效。但是有没有办法在这段代码中不使用全局变量。此外,如果有人告诉我如何使我的代码高效,那将会很有帮助。提前致谢。代码:

import random
import tkinter as tk

number_of_tries = 0


def tries():
    global number_of_tries
    number_of_tries += 1
    comment.configure(state="normal")
    comment.delete(0, "end")
    comment.insert(0, "Not quite! Keep trying!")
    comment.configure(state="disabled")
    if str(guess) == str(random_number):
        comment.configure(state="normal")
        comment.delete(0, "end")
        comment.insert(0, "You guessed it in " + str(number_of_tries) + " tries!")
        comment.configure(state="disabled")
        guess_entry.configure(state="disabled")
        go.configure(state="disabled")


def character_check():
    global guess
    guess = guess_entry.get()
    if len(guess) != 4:
        comment.configure(state="normal")
        comment.delete(0, "end")
        comment.insert(0, "Guess must be 4 digits! ")
        comment.configure(state="disabled")
    else:
        for char in guess:
            if char.isalpha():
                comment.configure(state="normal")
                comment.delete(0, "end")
                comment.insert(0, "Guess must only include integers! ")
                comment.configure(state="disabled")
            else:
                digit_check()


def digit_check():
    global guess
    guess = guess_entry.get()

    for i in range(0, 4):
        if str(guess)[i] == str(random_number)[i]:
            digits[i] = str(guess)[i]
            digit_display.configure(state="normal")
            digit_display.delete(0, "end")
            digit_display.insert(0, digits)
            digit_display.configure(state="disabled")
        elif str(guess)[i] != str(random_number)[i]:
            digits[i] = "?"
            digit_display.configure(state="normal")
            digit_display.delete(0, "end")
            digit_display.insert(0, digits)
            digit_display.configure(state="disabled")


def initialise():
    global number_of_tries, digits
    global random_number
    digits = ["?"] * 4
    random_number = random.randrange(1000, 9999)
    number_of_tries = 0
    digit_display.configure(state="normal")
    comment.configure(state="normal")

    digit_display.delete(0, "end")
    digit_display.insert(0, digits)
    comment.delete(0, "end")
    comment.insert(0, "Good luck!")

    digit_display.configure(state="disabled")
    comment.configure(state="disabled")
    guess_entry.configure(state="normal")
    go.configure(state="normal")
    print(random_number)


screen = tk.Tk()
screen.geometry("400x400")
screen.title("Code Crunchers")

heading = tk.Label(text="Welcome to Code Crunchers!", font="Montserrat 15")
heading.place(relx=0.5, rely=0.1, anchor="center")

instruction_1 = tk.Label(text="Enter your guess below: ", font="Montserrat 10")
instruction_1.place(relx=0.5, rely=0.2, anchor="center")

guess_entry = tk.Entry(screen, width=4)
guess_entry.place(relx=0.5, rely=0.25, anchor="center")

go = tk.Button(text="Go", font="Montserrat 10", command=lambda: [character_check(), tries()])
go.place(relx=0.6, rely=0.27, anchor="center")

instruction_2 = tk.Label(text="Digits correct: ", font="Montserrat 10")
instruction_2.place(relx=0.5, rely=0.35, anchor="center")

digit_display = tk.Entry(screen, width=10)
digit_display.place(relx=0.5, rely=0.4, anchor="center")

comment = tk.Entry(screen, width=40)
comment.place(relx=0.5, rely=0.45, anchor="center")

restart = tk.Button(text="Restart", font="Montserrat 10", command=lambda: initialise())
restart.place(relx=0.5, rely=0.55, anchor="center")

initialise()

screen.mainloop()

标签: pythontkinter

解决方案


我要做的只是向用户显示尝试次数,然后从该对象中读取以查看尝试次数。如果您不想向用户显示它,您可以随时将其隐藏,使其不显示。如果您根本不想在您的 GUI 上使用它,那么您应该将此变量作为参数传递给您的函数。


推荐阅读