尝试在多个窗口上更改Python tkinter的背景时出现递归错误

2024-05-13 02:02:53 发布

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

昨晚我启动了一个小项目,我想用tkinter制作一个游戏(与pygame相反,主要是因为我不知道如何在pygame中创建多个窗口)

我希望用户猜测RGB值并计算其精度。然而,每当我运行我的代码时,在startgame函数中我得到一个RecursionError,并且没有任何颜色改变。我不明白为什么

from tkinter import *
import random

class multiWindow(Tk):
def __init__(self):

    # ******* CREATE WINDOWS *******

    window1 = Tk()
    window2 = Tk()
    window3 = Tk()

    # ******* WINDOW DIMENSIONS *******

    windowH = 100
    windowW = 250

    # ******* SCREEN RES *******

    screenW = 1366-windowW
    screenH = 768-windowH

    # ******* COORDINATES OF WINDOWS *******
    window1.geometry('%dx%d+%d+%d' % (windowW,windowH,screenW/6,screenH/3))
    window2.geometry('%dx%d+%d+%d' % (windowW,windowH,screenW/2,screenH/3))
    window3.geometry('%dx%d+%d+%d' % (windowW,windowH,screenW/(6/5),screenH/3))

    # ******* WINDOW TITLES *******
    window1.title("Color1")
    window2.title("Color2")
    window3.title("Color3")

    # ******** BUTTON START *******
    buttonStart = Button(window1,text="Start Game", command=lambda: self.startGame())
    buttonStart.pack()


    # ******* OPEN WINDOWS ******* 
    window1.mainloop()
    window2.mainloop()
    window3.mainloop()




# ******** PRODUCE RANDOM COLOR ********
def randomRGB(self):
    return random.randint(0,255)


def guessRed(self,window):
    while True:
        try:
            print("I want you to guess the RGB values of the colors in the windows above.")
            print("Guess the red value of the window displaying ",window)
            guess = int(input())

            if guess < 0 or guess > 255:
                raise
            else:
                return guess
                break
        except:
            print("Error")

def startGame(self):
    # ******** DETERMINE COLOR VALUES *******
    colorVal = [0,0,0,0,0,0,0,0,0]

    for x in range(0,len(colorVal)):
        colorVal[x] = self.randomRGB()

    # ******* GIVE WINDOWS COLOR *******
    self.window1.configure(background='#%02x%02x%02x'%(colorVal[0],colorVal[1],colorVal[2],))
    self.window2.configure(background='#%02x%02x%02x'%(colorVal[3],colorVal[4],colorVal[5],))
    self.window3.configure(background='#%02x%02x%02x'%(colorVal[6],colorVal[7],colorVal[8],))

multiWindow = multiWindow()
print("This comes after multiwindow class")        

我在tkinter中不是很好的对手。我两天前刚开始读这篇文章,但我觉得这个问题与我对tkinter的理解有关,而与我对python的理解有关

非常感谢您的帮助


Tags: theselftkinterwindowsdeftkguesswindow2
1条回答
网友
1楼 · 发布于 2024-05-13 02:02:53

您的程序必须正好有一个Tk实例,并且您必须恰好调用mainloop一次。如果需要其他窗口,请创建Toplevel的实例。如果有一个以上的Tk实例,则没有什么能像您期望的那样工作

您还需要删除guessRed中的无限循环以及对input的调用。GUI不应该从控制台获取输入


与任何其他问题无关,您不需要在以下情况下使用lambda

Button(window1,text="Start Game", command=lambda: self.startGame())

在本例中,lambda除了使代码稍微复杂一点之外,没有其他用途。相反,只需将引用传递给函数:

Button(window1,text="Start Game", command=self.startGame)

相关问题 更多 >