python - 有没有办法不在我的代码中使用全局变量?
问题描述
我对 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()
解决方案
我要做的只是向用户显示尝试次数,然后从该对象中读取以查看尝试次数。如果您不想向用户显示它,您可以随时将其隐藏,使其不显示。如果您根本不想在您的 GUI 上使用它,那么您应该将此变量作为参数传递给您的函数。
推荐阅读
- c# - 使用linq mvc c#从数据库中检索图像
- python - Jupyter Notebook:使用 %run 执行另一个 Notebook 时抑制输出?
- javascript - Firefox 和 Safari 浏览器的 Cookie 存储替代品
- groovy - 为什么metaClass.hasProperty实际上需要两个参数时允许一个参数
- javascript - 我如何以访客身份加入 Webex 会议?
- amazon-web-services - 在 AWS 中创建 IAM 策略以保护看到所有 EC2 实例
- python - 在更长的字符串中,如何在 PostgreSQL(和/或 Python 3)中将一个字符(例如,'a')和一个变音字符(例如,'U+030A')转换为单个字符('å')
- excel - 当路径和名称在工作表单元格中时,VBA迭代打开文件?
- javascript - Dialogflow Beta 集成和会话 ID
- android - 将 Datepicker 与 Firestore 集成