所以,我是python新手,我正在用tkinter制作这个石头剪刀游戏。我有一个问题,清除文字说,如果你赢或输后,你玩一次。我试着用destroy()
来做,但我无法让它工作。问题是,当你第一次选择石头布或剪刀时,它会起作用,但下次你玩的每一个游戏都会覆盖旧的分数
from tkinter import *
import random
root = Tk()
#Functions
def Rock():
user = "r"
computer = random.choice(['r', 'p', 's'])
if user == computer:
UsedLabel = Label(root, text="You Tied!")
UsedLabel.grid(row=2 , column=1)
if is_win(user, computer):
UsedLabel = Label(root, text="You Have Won!")
UsedLabel.grid(row=2 , column=1)
else:
UsedLabel = Label(root, text="You Lost!")
UsedLabel.grid(row=2 , column=1)
def Paper():
user = "p"
computer = random.choice(['r', 'p', 's'])
if user == computer:
UsedLabel = Label(root, text="You Tied!")
UsedLabel.grid(row=2 , column=1)
if is_win(user, computer):
UsedLabel = Label(root, text="You Have Won!")
UsedLabel.grid(row=2 , column=1)
else:
UsedLabel = Label(root, text="You Lost!")
UsedLabel.grid(row=2 , column=1)
def Scissors():
user = "s"
computer = random.choice(['r', 'p', 's'])
if user == computer:
UsedLabel = Label(root, text="You Tied!")
UsedLabel.grid(row=2 , column=1)
if is_win(user, computer):
UsedLabel = Label(root, text="You Have Won!")
UsedLabel.grid(row=2 , column=1)
else:
UsedLabel = Label(root, text="You Lost!")
UsedLabel.grid(row=2 , column=1)
#def iswin
def is_win(player, opponent):
if (player == 'r' and opponent == 's') or (player == 's' and opponent == 'p') or (player == 'p' and opponent == 'r'):
return True
# Main Label
MainLabel = Label(root, text="Rock Paper or Scissors? Chose one!")
MainLabel.grid(row=0, column=1)
#Buttons
RockB = Button(root, text=" Rock! ", padx=20, pady=10, command=Rock)
PaperB = Button(root, text=" Paper! ", padx=20, pady=10, command=Paper)
ScissorsB = Button(root, text=" Scissors! ", padx=20, pady=10, command=Scissors)
ScissorsB.grid(row=1, column=2)
PaperB.grid(row=1, column=1)
RockB.grid(row=1, column=0)
root.mainloop()
要清理标签,可以使用
对代码进行了一些改进:
首先,您不需要为每个用户选择单独的函数,您只需要一个就可以了,只需传递一个参数,您仍然可以使用一堆
if/elif
来检查用户选择与计算机选择之间的关系,但我使用了一个集合来更轻松地完成这项工作,并使其更紧凑主要部分是,1秒后,使用调度函数清除标签,该函数是使用
.after()
方法调度的重要提示:我强烈建议不要使用通配符(
*
)导入某些内容时,您应该导入您需要的内容,例如from module import Class1, func_1, var_2
等等,或者导入整个模块:import module
然后您还可以使用别名:import module as md
或类似的内容,关键是除非您真正知道自己在做什么,否则不要导入所有内容;名字冲突是个问题我还建议您遵循PEP8,使用
snake_case
作为变量和函数名,使用CapitalCase
作为类名此外,如果您想为小部件留出内部空间,您可以使用
ipadx
和ipady
选项,但您似乎希望实际将这些小部件扩展到最大值,因为在本例中,最简单的方法是将sticky='nsew'
添加到每个.grid()
方法资料来源:
相关问题 更多 >
编程相关推荐