如何使用tkinter清除标签中的文本?

2024-09-27 00:19:06 发布

您现在位置:Python中文网/ 问答频道 /正文

所以,我是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()

Tags: textyouifisdefcolumnrandomroot
2条回答

要清理标签,可以使用

label_name.config(text="")

对代码进行了一些改进:

from tkinter import Tk, Label, Button
import random


player_wins = {'rs', 'pr', 'sp'}
player_draws = {'rr', 'pp', 'ss'}


def choose(choice):
    computer = random.choice(['r', 'p', 's'])
    combo = choice + computer

    if combo in player_wins:
        text = 'You won!'
    elif combo in player_draws:
        text = 'You drew!'
    else:
        text = 'You lost!'

    game_state.config(text=text)
    
    # this sets label's text to empty after about 1 second
    root.after(1000, lambda: game_state.config(text=''))


root = Tk()

# Main Label
title = Label(root, text="Rock, Paper or Scissors? Chose one!")
title.grid(row=0, column=1)

# Buttons
rock_btn = Button(root, text="Rock!", padx=20, pady=10, command=lambda: choose('r'))
paper_btn = Button(root, text="Paper!", padx=20, pady=10, command=lambda: choose('p'))
scissors_btn = Button(root, text="Scissors!", padx=20, pady=10, command=lambda: choose('s'))

scissors_btn.grid(row=1, column=2)
paper_btn.grid(row=1, column=1)
rock_btn.grid(row=1, column=0)

game_state = Label(root)
game_state.grid(row=2, column=0, columnspan=3)

root.mainloop()

首先,您不需要为每个用户选择单独的函数,您只需要一个就可以了,只需传递一个参数,您仍然可以使用一堆if/elif来检查用户选择与计算机选择之间的关系,但我使用了一个集合来更轻松地完成这项工作,并使其更紧凑

主要部分是,1秒后,使用调度函数清除标签,该函数是使用.after()方法调度的

重要提示:我强烈建议不要使用通配符(*)导入某些内容时,您应该导入您需要的内容,例如from module import Class1, func_1, var_2等等,或者导入整个模块:import module然后您还可以使用别名:import module as md或类似的内容,关键是除非您真正知道自己在做什么,否则不要导入所有内容;名字冲突是个问题

我还建议您遵循PEP8,使用snake_case作为变量和函数名,使用CapitalCase作为类名

此外,如果您想为小部件留出内部空间,您可以使用ipadxipady选项,但您似乎希望实际将这些小部件扩展到最大值,因为在本例中,最简单的方法是将sticky='nsew'添加到每个.grid()方法

资料来源:

相关问题 更多 >

    热门问题