मेरे पास कई छवियां हैं जिन्हें मैं उपयोगकर्ता को पायथन के साथ दिखाना चाहता हूं। उपयोगकर्ता को कुछ विवरण दर्ज करना चाहिए और फिर अगली छवि दिखाई जानी चाहिए।

यह मेरा कोड है:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import os, glob
from PIL import Image

path = '/home/moose/my/path/'
for infile in glob.glob( os.path.join(path, '*.png') ):
    im = Image.open(infile)
    im.show()
    value = raw_input("Description: ")
    # store and do some other stuff. Now the image-window should get closed

यह काम कर रहा है, लेकिन उपयोगकर्ता को छवि को स्वयं बंद करना होगा। विवरण दर्ज करने के बाद क्या मुझे छवि को बंद करने के लिए अजगर मिल सकता है?

मुझे पीआईएल की जरूरत नहीं है। यदि आपके पास किसी अन्य पुस्तकालय/बैश-प्रोग्राम (सबप्रोसेस के साथ) के साथ एक और विचार है, तो यह भी ठीक रहेगा।

16
Martin Thoma 17 जुलाई 2011, 20:08

3 जवाब

सबसे बढ़िया उत्तर

show विधि "मुख्य रूप से डिबगिंग उद्देश्यों के लिए अभिप्रेत है" और एक बाहरी प्रक्रिया को जन्म देती है जिसके लिए आपको एक हैंडल नहीं मिलता है, इसलिए आप इसे उचित तरीके से नहीं मार सकते।

जनहित याचिका के साथ, आप इसके किसी GUI मॉड्यूल का उपयोग करना चाह सकते हैं, जैसे कि ImageTk, ImageQt या ImageWin.

अन्यथा, केवल subprocess मॉड्यूल के साथ पायथन से एक छवि दर्शक को मैन्युअल रूप से स्पॉन करें:

for infile in glob.glob( os.path.join(path, '*.png')):
    viewer = subprocess.Popen(['some_viewer', infile])
    viewer.terminate()
    viewer.kill()  # make sure the viewer is gone; not needed on Windows
15
Fred Foo 18 जुलाई 2011, 12:31
हाय लार्समैन, ठीक यही मैंने खोजा है। क्या आप कृपया सूची में पॉपन का इनपुट ([] जोड़कर) बना सकते हैं? इसके बिना यह काम नहीं करता है। ImageTk और ImageQt का उल्लेख करने के लिए भी धन्यवाद, मैं उन पर एक नज़र डालूंगा।
 – 
Martin Thoma
18 जुलाई 2011, 12:13
@moose: हाँ, [] भूल गए, क्षमा करें।
 – 
Fred Foo
18 जुलाई 2011, 12:31
3
मैं OSX पर some_viewer के रूप में पूर्वावलोकन का उपयोग कैसे करूं?
 – 
eye_mew
25 जुलाई 2015, 01:01
दस्तावेज़ीकरण लिंक टूटा हुआ है
 – 
ijuneja
24 मई 2019, 04:30

psutil im.show() द्वारा बनाई गई display प्रक्रिया की जानकारी प्राप्त कर सकते हैं और प्रत्येक ऑपरेटिंग सिस्टम पर उस पिड के साथ प्रक्रिया करें:

import time

import psutil
from PIL import Image

# open and show image
im = Image.open('myImageFile.jpg')
im.show()

# display image for 10 seconds
time.sleep(10)

# hide image
for proc in psutil.process_iter():
    if proc.name() == "display":
        proc.kill()
16
Bengt 27 जुलाई 2015, 23:03
Psutil को OS X के तहत काम करना चाहिए। कृपया प्रोजेक्ट के इश्यू ट्रैकर पर अपनी समस्या का वर्णन करें।
 – 
Bengt
23 नवम्बर 2014, 19:58
proc.name एक विधि के बाद आप इसे proc.name() की तरह कॉल कर सकते हैं और उसके बाद ही काम करेगा। कृपया इसे ठीक करें और आप और आपको वोट मिले।
 – 
Geeocode
27 जुलाई 2015, 12:19
पिछली टिप्पणी देखें।
 – 
Geeocode
27 जुलाई 2015, 12:19
2
@IDelgadoYes, psutil के नए संस्करणों में proc.name एक स्ट्रिंग गुण के बजाय एक विधि है। यदि कोई नाम संपत्ति की जांच करता है, तो स्क्रिप्ट बिना प्रभाव के बाहर निकल जाती है, क्योंकि वे कुछ इस तरह दिखती हैं: <bound method Process.name of <psutil.Process(pid=14358,name='display') at 19774288>> इसे इंगित करने के लिए धन्यवाद, मैंने अपना उत्तर अपडेट कर दिया। उम्मीद है, भविष्य में कोई भी इस पर आगे नहीं बढ़ेगा।
 – 
Bengt
27 जुलाई 2015, 23:05

मैंने इससे पहले इस रेसिपी को संशोधित किया है पायथन में कुछ छवि कार्य करें। यह Tkinter का उपयोग करता है, इसलिए इसे जनहित याचिका के अलावा किसी मॉड्यूल की आवश्यकता नहीं है।

'''This will simply go through each file in the current directory and
try to display it. If the file is not an image then it will be skipped.
Click on the image display window to go to the next image.

Noah Spurrier 2007'''
import os, sys
import Tkinter
import Image, ImageTk

def button_click_exit_mainloop (event):
    event.widget.quit() # this will cause mainloop to unblock.

root = Tkinter.Tk()
root.bind("<Button>", button_click_exit_mainloop)
root.geometry('+%d+%d' % (100,100))
dirlist = os.listdir('.')
old_label_image = None
for f in dirlist:
    try:
        image1 = Image.open(f)
        root.geometry('%dx%d' % (image1.size[0],image1.size[1]))
        tkpi = ImageTk.PhotoImage(image1)
        label_image = Tkinter.Label(root, image=tkpi)
        label_image.place(x=0,y=0,width=image1.size[0],height=image1.size[1])
        root.title(f)
        if old_label_image is not None:
            old_label_image.destroy()
        old_label_image = label_image
        root.mainloop() # wait until user clicks the window
    except Exception, e:
        # This is used to skip anything not an image.
        # Warning, this will hide other errors as well.
        pass
5
Nick T 18 जुलाई 2011, 06:01
इसके लिए ImageTK की आवश्यकता है। लेकिन मुझे अभी उचित उबंटू-पैकेज मिला है: sudo apt-get install python-इमेजिंग-tk। क्या मुझे कुछ याद आ रहा है या उपयोगकर्ता के लिए इनपुट देना संभव नहीं है? मैं वर्तमान विंडो को बंद करना चाहता था और अगले को खोलना चाहता था (या बस वर्तमान विंडो में अगला खोलें) बिना किसी अन्य उपयोगकर्ता इंटरैक्शन के विवरण लिखने के (एंटर के साथ समापन)।
 – 
Martin Thoma
18 जुलाई 2011, 12:01
ImageTK को जनहित याचिका के साथ आना चाहिए... यदि आप चाहें तो आप विंडो को संशोधित कर सकते हैं और टेक्स्ट फ़ील्ड और बटन पर टैकल कर सकते हैं। मेरा Tkinter बहुत पुराना है, आमतौर पर मैं wx का उपयोग करता हूं।
 – 
Nick T
18 जुलाई 2011, 15:35