【问题标题】:how to fix spinnig beach ball of death in Tkinter?如何在 Tkinter 中修复旋转海滩死亡球?
【发布时间】:2021-03-08 18:10:59
【问题描述】:

我正在尝试在 Tkinter 中制作 RPS(石头剪刀布)。我的代码完全可以正常工作,直到我按下 OK 按钮,当我这样做时,我得到了旋转的加载图标(MacOS)。我试图在活动监视器中查看我的 cpu,它是 TROUGH THE ROOF(100% cpu 使用率)

我尝试用谷歌搜索该问题并添加了time.sleep(0.2),但没有成功

from tkinter import *
from random import randint
from tkinter import messagebox
import time

def rock():
    masterrock = Tk()

    rl = Label(masterrock, text="rock, paper or scissor")
    rl.grid(row=0, column=1)

    rb = Button(masterrock, text="OK", command=lambda: rock2())
    rb.grid(row=2, column=1)

    player1 = Entry(masterrock)
    player1.grid(row=1, column=1)
    global player
    player = (player1.get())

    t = ["rock", "paper", "scissor"]

    global computer
    computer = t[randint(0, 2)]
    
def rock2():
    s = True
    while s == True:

        if player == computer:
            gllabel = Label(masterrock, text="tie")
            gllabel.grid(row=2, column=1)

        elif player == "rock":

            if computer == "paper":
                gllabel1 = Label(masterrock, text="you lose!")
                gllabel1.grid(row=2, column=1)

            else:
                gllabel2 = Label(masterrock, text="You win!")
                gllabel2.grid(row=2, column=1)


        elif player == "paper":
            if computer == "scissor":
                gllabel3 = Label(masterrock, text="You lose")
                gllabel3.grid(row=2, column=1)

            else:
                gllabel4 = Label(masterrock, text="You win!")
                gllabel4.grid(row=2, column=1)

        elif player == "scissor":

            if computer == "rock":

                gllabel5 = Label(masterrock, text="You lose")
                gllabel5.grid(row=2, column=1)

            else:
                gllabel6 = Label(masterrock, text="You win!")
                gllabel6.grid(row=2, column=1)

    time.sleep(0.2)

mainloop()

我只有 14 岁,所以我的代码可能有点草率。提前谢谢

【问题讨论】:

  • 使用<tkinter.Tk>.after(time_in_ms, function)创建一个tkinter循环
  • 听起来不错,但我应该把它放在哪里?

标签: python macos loops tkinter


【解决方案1】:

试试这个:

from tkinter import *
from random import randint
from tkinter import messagebox
import time

options = ["rock", "paper", "scissor"]

def rock():
    global computer, masterrock, player_entry, ok_button
    masterrock = Tk()

    options_label = Label(masterrock, text="rock, paper or scissor")
    options_label.grid(row=0, column=1)

    ok_button = Button(masterrock, text="OK", command=rock2)
    ok_button.grid(row=2, column=1)

    player_entry = Entry(masterrock)
    player_entry.grid(row=1, column=1)

    computer = options[randint(0, 2)]

def rock2():
    player = player_entry.get()
    if player in options:
        player_entry.config(bg="white")
    else:
        player_entry.config(bg="red")
        return None # Stop if the user input was invalid
    ok_button.destroy()
    if player == computer:
        gllabel = Label(masterrock, text="tie")
        gllabel.grid(row=2, column=1)

    elif player == "rock":
        if computer == "paper":
            gllabel1 = Label(masterrock, text="you lose!")
            gllabel1.grid(row=2, column=1)
        else:
            gllabel2 = Label(masterrock, text="You win!")
            gllabel2.grid(row=2, column=1)

    elif player == "paper":
        if computer == "scissor":
            gllabel3 = Label(masterrock, text="You lose")
            gllabel3.grid(row=2, column=1)
        else:
            gllabel4 = Label(masterrock, text="You win!")
            gllabel4.grid(row=2, column=1)

    elif player == "scissor":
        if computer == "rock":
            gllabel5 = Label(masterrock, text="You lose")
            gllabel5.grid(row=2, column=1)

        else:
            gllabel6 = Label(masterrock, text="You win!")
            gllabel6.grid(row=2, column=1)


global masterrock
rock()
masterrock.mainloop()

您的代码有一些问题。

首先,直接致电mainloop() 不是一个好习惯。最好使用<tkinter.Tk>.mainloop()

同样在您的代码中,player1.get()player1 = Entry(masterrock) 之后运行,因此用户没有足够的时间来实际编写他们的响应。

你从来没有考虑过用户给你错误的输入,比如"#"。永远不要相信用户输入。始终检查它是否符合您的预期。

您实际上并不需要循环。 <tkinter.Tk>.mainloop() 是一个循环。更多信息请阅读this

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-08
    • 1970-01-01
    • 2021-09-26
    • 2018-12-26
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    • 2015-01-13
    相关资源
    最近更新 更多