Python Forum
Problem with absolute path to file (Mr.Stickman Problems) - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: General Coding Help (https://python-forum.io/forum-8.html)
+--- Thread: Problem with absolute path to file (Mr.Stickman Problems) (/thread-11161.html)



Problem with absolute path to file (Mr.Stickman Problems) - SheeppOSU - Jun-26-2018

Right now I'm working on getting the backround. So I ran into a problem and someone said to provide the absolute value of the file of the picture so I did that but it still doesnt work can someone please tell me whats wrong with it.
from tkinter import *
import random
import time
import os

class Game:
    def __init__(self):
        self.tk = Tk()
        self.tk.title("Mr.Stickman Races for the Exit")
        self.tk.resizable(0, 0)
        self.tk.wm_attributes("-topmost", 1)
        self.canvas = Canvas(self.tk, width=500, height=500, highlightthicknes=0)
        self.canvas.pack()
        self.tk.update()
        self.canvas_height = 500
        self.canvas_width = 500
        self.bg = PhotoImage(file=os.path.abspath('Background.gif.xcf'))
        w = self.bg.width()
        h = self.gb.height()
        for x in range(0, 5):
            for y in range(0, 5):
                self.canvas.create_image_(x * w, y * h, image=self.bg, anchor='nw')
        self.sprites = []
        self.running = True

    def mainloop(self):
        while 1:
            if self.running == True:
                for sprite in self.sprites:
                    sprite.move()
            self.tk.update_idletasks()
            self.tk.update()
            time.sleepp(0.01)

g = Game()
g.mainloop
            
Error:
Traceback (most recent call last): File "C:\Users\sheep\Desktop\Ayden's Apps\Mr.Stick Man.py", line 35, in <module> g = Game() File "C:\Users\sheep\Desktop\Ayden's Apps\Mr.Stick Man.py", line 17, in __init__ self.bg = PhotoImage(file=os.path.abspath('Background.gif.xcf')) File "C:\Users\sheep\AppData\Local\Programs\Python\Python36-32\lib\tkinter\__init__.py", line 3539, in __init__ Image.__init__(self, 'photo', name, cnf, master, **kw) File "C:\Users\sheep\AppData\Local\Programs\Python\Python36-32\lib\tkinter\__init__.py", line 3495, in __init__ self.tk.call(('image', 'create', imgtype, name,) + options) _tkinter.TclError: couldn't open "C:\Users\sheep\Desktop\Ayden's Apps\Background.gif.xcf": no such file or directory >>>



RE: Mr.Stickman Problems - woooee - Jun-26-2018

This s pretty self-explanatory

Quote:_tkinter.TclError: couldn't open "C:\Users\sheep\Desktop\Ayden's Apps\Background.gif.xcf": no such file or directory

Python will use a forward slash on any OS so try

Quote:"C:/Users/sheep/Desktop/Ayden's Apps/Background.gif.xcf"



RE: Mr.Stickman Problems - buran - Jun-26-2018

@woooee - although you are 100% correct and one should use forward slash or raw string when provide path as string, in this case the path is created with this code os.path.abspath('Background.gif.xcf') and thus it is not backslash problem.

@SheeppOSU: Now if you look at the docs, you would see that os.path.abspath(path) is equivalent (on most systems) to normpath(join(os.getcwd(), path)). Given that OP provides just a file name, it will construct absolute path based on current working directory. I would guess that the file is indeed NOT in the current working directory. In other words it is a problem due to OP misunderstanding how os.path.abspath(path) works.

You should provide absolute path as a string(using forward slash)/raw string or use proper python tools to construct the correct path.


RE: Problem with absolute path to file (Mr.Stickman Problems) - Larz60+ - Jun-26-2018

Sometimes when you start a program from another directory, or call a subprogram, the working directory mat not be what you thing it is.
This can be a problem is you assume it starts with the python file directory.
You can assure a starting location with the following snippet:
import os

path = os.path.dirname(__file__)
os.chdir(path)
you can then get the absolute path to your 'Background.gif.xcf' (is that really the file name?) file by using a relative
path as argument to os.path.abspath(relative_path) (of course replacing relative path with something like 'images/Background.gif.xcf')