Problem With Embedded Icon and Python 3.4

Wildman best_lay at yahoo.com
Fri Mar 25 10:42:22 EDT 2016


On Fri, 25 Mar 2016 00:34:13 -0500, Zachary Ware wrote:

> On Fri, Mar 25, 2016 at 12:10 AM, Wildman via Python-list
> <python-list at python.org> wrote:
>> I have a program that I have been trying to rewrite so it will
>> run on Python 2.7 and 3.4.  It has been a pain to say the least.
>> Thank $DIETY for aliases.  Anyway, I got it all working except
>> for one thing.  The program has an embedded icon.  It is displayed
>> in the window's titlebar.  The icon is a 16x16 png that has been
>> base64 encoded using a Linux utility called memencoder.  The code
>> below works perfectly with Python 2.7.  The icon data is complete
>> for anyone that wants to try to run this code:
>>
>> encoded_icon = """\
> [...]
>> I tried converting the icon string to a byte variable like this:
>>
>> encoded_icon = bytes("""\
>> iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAALGPC/xhBQAAACBj
>>     (...)
>> ZGlmeQAyMDE2LTAzLTIxVDE1OjE5OjI3LTA1OjAwe2m2vwAAAABJRU5ErkJggg==""")
>>
>>
>> That give me a different error:
>>
>> Traceback (most recent call last):
>>   File "./myprogram.py", line 269, in <module>
>>     ZGlmeQAyMDE2LTAzLTIxVDE1OjE5OjI3LTA1OjAwe2m2vwAAAABJRU5ErkJggg==""")
>> TypeError: string argument without an encoding
>>
>> I'm not sure what that means.  I looks like it wants the string
>> to be encoded but it already is.
> 
> The bytes constructor in Python 3 requires you to provide an encoding
> (utf-8, ascii, latin-1, koi8, etc) when passing in a string, otherwise
> it doesn't know what bytes you want and refuses to guess.  You could
> fix this by adding `encoding='ascii'` to the bytes() call–but I'm not
> certain that that would work in 2.7, and there's a much easier method,
> noted later.
> 
>> And why the reference to only
>> the last line of the string?
> 
> Because the traceback would be huge if it included the entire function
> call, and there's no need to.  You can find the error from just that
> line.  It would be arguably more useful to show the first line, but
> that's more difficult to do.
> 
>> I am at a loss here.  Any help would be greatly appreciated.
> 
> What you need here is a bytes literal, which is accomplished by
> prepending a 'b' to the string literal.   Your `encoded_icon = """\`
> just needs to become `encoded_icon = b"""\`.  See here [1] for more
> information.

Thanks for the info and the link.  That fixed the problem.

-- 
<Wildman> GNU/Linux user #557453
The cow died so I don't need your bull!



More information about the Python-list mailing list