Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要0个以上的值才能解包(使用tkinter处理变量错误的python coords)_Python_Tkinter - Fatal编程技术网

需要0个以上的值才能解包(使用tkinter处理变量错误的python coords)

需要0个以上的值才能解包(使用tkinter处理变量错误的python coords),python,tkinter,Python,Tkinter,我想用tkinter做一个太空入侵者克隆 另一件事是,我有一个错误,上面写着ValueError:当我的“快照”因为达到画布限制而被删除时,需要超过0个值来解包变量赋值(请继续阅读),以便停止“快照”在画布的可见区域之外反复出现 我在这里发布的代码只是到目前为止我所拥有的整个游戏代码的一小部分,但它与我在实际项目中用于“拍摄”行为的代码完全相同 我知道代码正在运行,“镜头”确实消失了,换句话说。。。它正在工作,但我一直在外壳上得到这个错误,当我将这个函数与其他9个函数(使入侵者射击的函数)并排使

我想用tkinter做一个太空入侵者克隆

另一件事是,我有一个错误,上面写着ValueError:当我的“快照”因为达到画布限制而被删除时,需要超过0个值来解包变量赋值(请继续阅读),以便停止“快照”在画布的可见区域之外反复出现

我在这里发布的代码只是到目前为止我所拥有的整个游戏代码的一小部分,但它与我在实际项目中用于“拍摄”行为的代码完全相同

我知道代码正在运行,“镜头”确实消失了,换句话说。。。它正在工作,但我一直在外壳上得到这个错误,当我将这个函数与其他9个函数(使入侵者射击的函数)并排使用时,程序开始出现延迟和错误,几秒钟后它停止工作

所以我有点怀疑破坏我程序的是那个错误,不知道该怎么办

希望你能帮我。谢谢大家!

请原谅我糟糕的英语技能

from Tkinter import *
import os

def LoadImage(name):
    rute = os.path.join('Imagenes',name)
    image = PhotoImage(file=rute)
    return image

root=Tk()

DxShot= 0 #Globals of Directions on x and y
DyShot= -3

def PlayWindow():
    root.withdraw()
    VentanaPlay= Toplevel()
    VentanaPlay.title("Kill'em all!'")
    VentanaPlay.resizable(width=NO, height=NO)
    VentanaPlay.geometry("540x540")

    def Shot():
        x,y= CanvPlay.coords(Ship) #This reads the place from where the shot will have to be created
        ShotImage=LoadImage("Shot.gif")
        Shot1=CanvPlay.create_image(x, y-22, image=ShotImage)
        CanvPlay.img=ShotImage
        def ShotMove():
            global DxShot, DyShot
            x1,y1= CanvPlay.coords(Shot1) #here's where I'm getting the error...
            if y1+DyShot<=0:
                CanvPlay.delete(Shot1) #Also, if I use destroy instead of delete it says "destroy() takes exactly 1 argument (2 given)"
                print("Shot deleted")
            CanvPlay.coords(Shot1, x1+DxShot, y1+DyShot)
            CanvPlay.after(3,ShotMove)
        ShotMove()
        VentanaPlay.after(0,ShotMove)

    def Fire(event):
        Shot()

    CanvPlay= Canvas(VentanaPlay, width=540, height=540, bg="white")
    CanvPlay.config(cursor="dotbox")
    CanvPlay.place(x=-1,y=-1)
    CanvPlay.bind("<space>", Fire)
    CanvPlay.focus_set()

    ShipImage= LoadImage("Ship.gif")
    Ship= CanvPlay.create_image(260, 520, image=ShipImage)

    VentanaPlay.mainloop()

Buttun= Button(root, text= "click me", command=PlayWindow)
Buttun.pack()
root.mainloop()

您需要以某种方式存储快照列表(shot1),使用嵌套函数的方式将无法工作


嵌套函数可能会产生令人困惑的结果,因为Python不会对函数中的每个变量求值并在定义时存储它,而是在使用时访问它们。因此,当您第一次在Shot()内调用ShotMove()时,解释器将查找它找到的名为Shot1的内容。但是,当您试图将ShotMove函数传递到Shot函数之外并在那里调用它时,解释器无法找到任何Shot1(它不再存在)。我认为奇怪的错误(而不是NameError或其他错误)可能是因为python可能会在最初定义函数时检查NameErrors,而不是在每次运行时检查。

根本问题是
CanvPlay.coords(Shot1)
返回空列表或无,而您的代码不准备处理这种情况。例如,如果删除试图获取坐标的项目,可能会发生这种情况

事实上,您的
ShotMove
函数具有删除快照的代码,然后继续尝试再次移动快照。如果删除快照,您可能不想在之后使用
再次移动快照。也许简单的解决方案是将ShotMove函数更改为如下所示:

def ShotMove():
    global DxShot, DyShot
    x1,y1= CanvPlay.coords(Shot1) #here's where I'm getting the error...
    if y1+DyShot<=0:
        CanvPlay.delete(Shot1) 
        print("Shot deleted")
    else:
        CanvPlay.coords(Shot1, x1+DxShot, y1+DyShot)
        CanvPlay.after(3,ShotMove)
def ShotMove():
全球射击
x1,y1=CanvPlay.coords(Shot1)#这里是我得到错误的地方。。。

如果y1+DyShotI已经注意到错误在哪里。。。当我删除图像时,(因为完整函数是递归的),“Shot1”不再是画布上的对象,换句话说,它不再存在,因此当我调用x,y=CanvPlay.cords(Shot1)时,输入的参数并不是什么都没有,因为我在Shot1到达顶部时对它进行了擦除。无论如何谢谢!:)是的,谢谢!我注意到在我发布问题之后,顺便说一句!我在每个新窗口上都使用mainloop,因为如果我不这样做,一些图像将不会显示。。。我真的不知道为什么。。。但我就是这样设法解决的。。不管怎么说,你认为这可能是我得到的随机关闭和bug的原因吗?你认为多次调用mainloop可以修复没有显示的图像是错误的。是的,这很容易成为你的问题。您需要一个
Tk
实例和一个对
mainloop
的调用。其他任何东西都会产生意想不到的行为。好的!我已经解决了一些与图像相关的问题,所以我将尝试删除那些主循环。。。尽管如此,即使有所有这些主循环,当程序运行时(以正确的方式,我的意思是,一切正常),它似乎并不重要。但是谢谢你的解释!正如我所说,我要试着把它们去掉
def ShotMove():
    global DxShot, DyShot
    x1,y1= CanvPlay.coords(Shot1) #here's where I'm getting the error...
    if y1+DyShot<=0:
        CanvPlay.delete(Shot1) 
        print("Shot deleted")
    else:
        CanvPlay.coords(Shot1, x1+DxShot, y1+DyShot)
        CanvPlay.after(3,ShotMove)