2012-07-22 25 views
5

इस मामले का केंद्र है, मैं निम्नलिखित कोड स्निपेट में क्या गलत कर रहा हूं?मैं tkinter/ttk का उपयोग कर पायथन 3 में एक छवि कैसे प्रदर्शित कर सकता हूं?

from tkinter import * 
    from tkinter.ttk import * 

    root = Tk() 

    myButton = Button(root) 
    myImage = PhotoImage(myButton, file='myPicture.gif') 
    myButton.image = myImage 
    myButton.configure(image=myImage) 

    root.mainloop() 

त्रुटि संदेश मैं idle3 से मिलता है इस प्रकार है:

>>> 
    Traceback (most recent call last): 
     File "/home/bob/Documents/Python/tkImageTest.py", line 9, in <module> 
     myButton.configure(image=myImage) 
     File "/usr/lib/python3.2/tkinter/__init__.py", line 1196, in configure 
     return self._configure('configure', cnf, kw) 
     File "/usr/lib/python3.2/tkinter/__init__.py", line 1187, in _configure 
     self.tk.call(_flatten((self._w, cmd)) + self._options(cnf)) 
    TypeError: __str__ returned non-string (type Button) 
    >>> 

यह त्रुटि संदेश मुझे स्टंप्डया है, मैं बस समझ में नहीं आता कि यह क्या कहने की कोशिश कर रहा है। कोई विचार?

मैं भी परिवर्तन के लिए सुझाव की सराहना करेंगे ...

+0

BTW मैं पहले से ही इस संदर्भ http://effbot.org/tkinterbook/photoimage.htm जाँच की है - तुम मेरे कोड का टुकड़ा बहुत समान दिखता है देखेंगे! – Bobble

+0

त्रुटि 'MyButton' तर्क को' PhotoImage() 'पर पास करने के लिए इंगित करती है। मुझे विश्वास नहीं है कि 'PhotoImage()' एक विजेट ऑब्जेक्ट का संदर्भ लेता है, इसलिए यह त्रुटि उत्पन्न कर सकता है। इसके बिना उस लाइन को आज़माएं, जैसे 'myImage = PhotoImage (file =' myPicture.gif ')' – gary

+1

@ गैरी, ऐसा लगता है। 'फोटोइमेज' को रूट विंडो के स्पष्ट संदर्भ की आवश्यकता के बारे में सोचने के लिए मुझे कुछ दस्तावेज (और कुछ अन्य त्रुटियां उत्पन्न हुईं) द्वारा गुमराह किया गया था।कुछ और झुकाव के बाद मुझे रूट या बटन के संदर्भ में पाया गया कि इस तरह के 'फोटोइमेज' कन्स्ट्रक्टर पर एक अन्य कॉन्फ़िगरेशन विकल्प द्वारा प्रदान किया जा सकता है, 'फोटोइमेज (मास्टर = मायबटन, फ़ाइल =' myFile.gif '), लेकिन जिस तरह से मैंने इसे लिखा है, यह टिंकर को एक नाम की तरह दिखता है, जिसे एक स्ट्रिंग, सीसी माना जाता है। – Bobble

उत्तर

7

त्रुटि myButton तर्क PhotoImage के लिए पारित करने के लिए बात करने के लिए लगता है। जैसा कि आपने अपनी टिप्पणी में उल्लेख किया है, PhotoImage विजेट ऑब्जेक्ट को एक स्ट्रिंग के रूप में इलाज कर रहा था (प्रकार स्ट्रिंग के कई विकल्प हैं; PhotoImage विकल्पों की एक सूची देखें here)।

myImage = PhotoImage(file='myPicture.gif') 

मुझे विश्वास है आप PhotoImage निर्माता को बदलने की जरूरत नहीं कर रहा हूँ: अगर आप myButton वस्तु के संदर्भ के बिना है कि रेखा को लागू

आपका कोड काम करेंगे। उस वर्ग के लिए मान्य विकल्प (यानी संसाधन नाम) निर्धारित करने के लिए PhotoImage दस्तावेज़ देखें।

मॉड्यूल tkinter में वर्ग PhotoImage पर मदद: मदद फ़ाइल का हवाला देते हुए

वर्ग PhotoImage (छवि)

| Widget which can display colored images in GIF, PPM/PGM format. 
|  
| Method resolution order: 
|  PhotoImage 
|  Image 
|  builtins.object 
|  
| Methods defined here: 
|  
| __getitem__(self, key) 
|  # XXX config 
|  
| __init__(self, name=None, cnf={}, master=None, **kw) 
|  Create an image with NAME. 
| 
|  Valid resource names: data, format, file, gamma, height, palette, 
|  width. 

FYI करें: डॉक्स को पाने के लिए सबसे आसान तरीका पायथन से कमांड लाइन पर या आईडीईई से:

from tkinter import PhotoImage 
help(PhotoImage) 

और आखिरकार, इस वर्ग के बारे में एक और उपयोगी लिंक http://tkinter.unpythonic.net/wiki/PhotoImage पर है।

+1

में दिए गए कोड को देखें बहुत धन्यवाद गैरी! आप भी 'मास्टर' संदर्भ के बारे में सही हैं। यह कुछ प्रयोगों से लटका हुआ था जो मैं कई धागे के साथ कर रहा था (सबसे अच्छा नहीं पूछना!)। – Bobble

+0

@ बॉबबल बीटीडब्ल्यू, अगर इस सवाल का उत्तर दिया गया है, तो कृपया इसे स्वीकृत उत्तर के रूप में चिह्नित करें (ऐसा लगता है कि आप अपने कुछ प्रश्नों के लिए कुछ कर सकते हैं)। – gary

-1

मैंने 32 बिट और 64 बिट में पायथन 2.7.9, 3.2.5, 3.3.5, 3.4.3 के साथ उदाहरण का परीक्षण किया। (विन 8.1 64 बिट)

कोड काम करता है।

(अजगर 3.4.3 64 बिट में मैं पहली बार एक त्रुटि संदेश था।

मैं पूरी तरह से 3.4.3 अनइंस्टॉल कर दिया है और उसके बाद पुनर्स्थापित।

अब, उदाहरण के 3.4.3 64 बिट के साथ भी काम करता है)

# basic code from >> 
# http://tkinter.unpythonic.net/wiki/PhotoImage 

# extra code ------------------------------------------------------------------------- 
from __future__ import print_function 

try: 
    import tkinter as tk 
except: 
    import Tkinter as tk 

import sys 
import platform 

print() 
print ('python ', sys.version) 
print ('tkinter ', tk.TkVersion) 
print() 
print (platform.platform(),' ',platform.machine()) 
print() 


# basic code ------------------------------------------------------------------------- 

root = tk.Tk() 

def create_button_with_scoped_image(): 
    # "w6.gif" >> 
    # http://www.inf-schule.de/content/software/gui/entwicklung_tkinter/bilder/w6.gif 
    img = tk.PhotoImage(file="w6.gif") # reference PhotoImage in local variable 
    button = tk.Button(root, image=img) 
    # button.img = img # store a reference to the image as an attribute of the widget 
    button.image = img # store a reference to the image as an attribute of the widget 
    button.grid() 

create_button_with_scoped_image() 

tk.mainloop() 
+0

क्या आप वाकई एक उत्तर है, और अधिक विशेष रूप से पायथन-3.x के लिए एक जवाब है? – Deduplicator

+0

एक अच्छा जवाब न केवल एक कामकाजी उत्तर है बल्कि एक दस्तावेज भी है। यदि ओपी इसे समझ में नहीं आता है तो कोई कोड आपूर्ति कोड नहीं है। उसे केवल चिपकाने की प्रतिलिपि बनाने के बजाय उत्तर से कुछ सीखना चाहिए, इस तरह वह अगली बार एक ही प्रश्न में फिर से पूछेगा, केवल एक अलग संदर्भ में। – ShellFish

+0

बिंदु यह है कि मेरे लिए गैरी और टिंकर विकी की प्रतिक्रिया पाइथन 3.4.3 –