Skip to main content

I can't get Python and tkinter to display a photo on a canvas [duplicate]

Update: The answer by acw1668 did allow me to display the image. Thank you.

Searches for documentation for PhotoImage show it is hard to find. Online examples were easily misunderstood to indicate .jpg files were acceptable.

Previous update:

I edited the end of my explanation to show the suggested fix didn't work. I'm left wondering if people are avoiding the question because someone closed it, even though the recommended fix doesn't work or if I have a situation no one knows the answer to.

Sorry, I'm new to Stack Overflow and I am unfamiliar how the site works.

My original question begins here:

I'm trying to make python/tkinter show a photo image on a canvas. All I get is the background color.

I'm a retired programmer and now use python/tkinter to draw charts for my genealogy research and for whatever else catches my interest. This is the first time I've had trouble getting tkinter to do what I want.

I've narrowed the chunk down to a main routine that should, according to all the examples I've seen, display at least part of the photo. And because it is a main there should be no garbage collection issues.

The code:

#! python
from tkinter import *

# Program to test displaying a photo in Tkinter

cwidth = 500
cheight = 500
cback = '#353575'
tkx = Tk()

mycanvas = Canvas( tkx, width=cwidth, height=cheight, bg=cback)
mycanvas.pack()

# This image is 1400 x 1239
imag = PhotoImage( 'C:\\Users\\Owner\\Documents\\HouseStuff\\Shutters\\MapleLeaf.jpg' )
print( 'image', imag )
imgid = mycanvas.create_image( (50, 50), image=imag, anchor=NW )
print( 'imgid', imgid )
mycanvas.pack()

print('Bottom of main')
input()

The first print statement echoed the image path. The second printed "1".

I have no buttons or other widgets. All I do is display. The input() at the bottom is to hold the canvas in place because it disappears when the program exits. This is my standard method when displaying charts.

I've seen examples that say: "import tkinter as tk' and when I do that the canvas instantiation isn't found. Examples also show "tk.PhotoImage" but when I do that I get the error message "'_tkinter.tkapp' has no attribute 'PhotoImage'" I've seen documentaton saying "tk.PhotoImage" but don't define what kind of thing "tk" is.

What I get when I run this is a canvas window of the appropriate size with a uniform background color of blue. I don't get the photo.

I'm aware the photo is much bigger than the canvas I'm using for display. Once I get a bit of the image I'll worry about scaling the window and the photo.

I'm not so interested of redoing this in Pillow because I'm familiar with tkinter and not Pillow and want to draw on the photo after I display it.

Thanks for your help.

The first response suggested I add mainloop() at the bottom of the routine.

  1. I did add mainloop() at the bottom. It didn't help.

  2. There are no other GUI related events. This program just displays.



source https://stackoverflow.com/questions/76887153/i-cant-get-python-and-tkinter-to-display-a-photo-on-a-canvas

Comments

Popular posts from this blog

ValueError: X has 10 features, but LinearRegression is expecting 1 features as input

So, I am trying to predict the model but its throwing error like it has 10 features but it expacts only 1. So I am confused can anyone help me with it? more importantly its not working for me when my friend runs it. It works perfectly fine dose anyone know the reason about it? cv = KFold(n_splits = 10) all_loss = [] for i in range(9): # 1st for loop over polynomial orders poly_order = i X_train = make_polynomial(x, poly_order) loss_at_order = [] # initiate a set to collect loss for CV for train_index, test_index in cv.split(X_train): print('TRAIN:', train_index, 'TEST:', test_index) X_train_cv, X_test_cv = X_train[train_index], X_test[test_index] t_train_cv, t_test_cv = t[train_index], t[test_index] reg.fit(X_train_cv, t_train_cv) loss_at_order.append(np.mean((t_test_cv - reg.predict(X_test_cv))**2)) # collect loss at fold all_loss.append(np.mean(loss_at_order)) # collect loss at order plt.plot(np.log(al...

Sorting large arrays of big numeric stings

I was solving bigSorting() problem from hackerrank: Consider an array of numeric strings where each string is a positive number with anywhere from to digits. Sort the array's elements in non-decreasing, or ascending order of their integer values and return the sorted array. I know it works as follows: def bigSorting(unsorted): return sorted(unsorted, key=int) But I didnt guess this approach earlier. Initially I tried below: def bigSorting(unsorted): int_unsorted = [int(i) for i in unsorted] int_sorted = sorted(int_unsorted) return [str(i) for i in int_sorted] However, for some of the test cases, it was showing time limit exceeded. Why is it so? PS: I dont know exactly what those test cases were as hacker rank does not reveal all test cases. source https://stackoverflow.com/questions/73007397/sorting-large-arrays-of-big-numeric-stings

How to load Javascript with imported modules?

I am trying to import modules from tensorflowjs, and below is my code. test.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title </head> <body> <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@2.0.0/dist/tf.min.js"></script> <script type="module" src="./test.js"></script> </body> </html> test.js import * as tf from "./node_modules/@tensorflow/tfjs"; import {loadGraphModel} from "./node_modules/@tensorflow/tfjs-converter"; const MODEL_URL = './model.json'; const model = await loadGraphModel(MODEL_URL); const cat = document.getElementById('cat'); model.execute(tf.browser.fromPixels(cat)); Besides, I run the server using python -m http.server in my command prompt(Windows 10), and this is the error prompt in the console log of my browser: Failed to loa...