<p>对代码进行了一些改进:</p>
<pre class="lang-py prettyprint-override"><code>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()
</code></pre>
<p>首先,您不需要为每个用户选择单独的函数,您只需要一个就可以了,只需传递一个参数,您仍然可以使用一堆<code>if/elif</code>来检查用户选择与计算机选择之间的关系,但我使用了一个集合来更轻松地完成这项工作,并使其更紧凑</p>
<p>主要部分是,1秒后,使用调度函数清除标签,该函数是使用<code>.after()</code>方法调度的</p>
<p>重要提示:我强烈建议不要使用通配符(<code>*</code>)导入某些内容时,您应该导入您需要的内容,例如<code>from module import Class1, func_1, var_2</code>等等,或者导入整个模块:<code>import module</code>然后您还可以使用别名:<code>import module as md</code>或类似的内容,关键是除非您真正知道自己在做什么,否则不要导入所有内容;名字冲突是个问题</p>
<p>我还建议您遵循PEP8,使用<code>snake_case</code>作为变量和函数名,使用<code>CapitalCase</code>作为类名</p>
<p>此外,如果您想为小部件留出内部空间,您可以使用<code>ipadx</code>和<code>ipady</code>选项,但您似乎希望实际将这些小部件扩展到最大值,因为在本例中,最简单的方法是将<code>sticky='nsew'</code>添加到每个<code>.grid()</code>方法</p>
<p>资料来源:</p>
<ul>
<li><a href="https://www.geeksforgeeks.org/python-after-method-in-tkinter/" rel="nofollow noreferrer">Some info about ^{<cd2>}</a></li>
</ul>