2013-12-18 87 views
0

嘗試更改tk標籤的文本屬性時,我一直在獲取屬性錯誤。 我聲明它,它使用臨時圖像,所以它確實存在,但當我試圖改變它時,我得到的錯誤。如果有人知道更好的方式來改變圖像或以更好的方法顯示它,我會非常喜歡這裏。Python 3.3無法更改Tkinter標籤文本屬性

這裏是培訓相關代碼

self.threadLabelImage = tk.Label(self.threadFrame,image=self.threadImage,wraplength=400,padx=20,pady=5).grid(row=7,column=10,sticky = tk.EW) 

    self.threadFrame.grid(row=0,column=10,sticky=tk.EW,rowspan=8) 

    self.threadFrame.grid_propagate(0) 

    self.QUIT = tk.Button(self, text="QUIT", fg="red", command=main.destroy,padx=5, pady=5).grid(row=7) 


def updateSelected(self, event): 
    # getting selected listbox item 
    i=self.thread_lb.curselection() 
    # Returns tuple that must be split 
    x,self.y,z = re.split("\D+",str(i)) 
    self.y=int(self.y) 
    print(self.threadTitleList[self.y]) 
    print(self.threadPubDateList[self.y]) 
    print(self.threadLinkList[self.y]) 
    print(self.threadDescList[self.y]) 
    self.threadTitle.set(self.threadTitleList[self.y]) 
    self.threadAuth.set(self.threadAuthList[self.y]) 
    self.threadPub.set(self.threadPubDateList[self.y]) 
    self.threadArtLink.set(self.threadLinkList[self.y]) 
    self.threadLink.set(self.threadDescList[self.y]) 
    self.threadImg.set('Will put image here') 
    if self.threadLinkList[self.y].find('imgur') != -1: 
     url = self.threadLinkList[self.y]+'.GIF' 
     imageName=self.threadLinkList[self.y][-11:-4] 

     urllib.request.urlretrieve(self.threadLinkList[self.y],imageName+'.jpg') 
     imgfile = Image.open(imageName+'.jpg') 
     imgfile = imgfile.resize((150,150),Image.ANTIALIAS) 
     # img = Image.open(file) 


     self.threadImage = ImageTk.PhotoImage(imgfile) 

     self.threadLabelImage.config(text = self.threadImage) 
     self.threadImage.image = imgfile 

這裏是整個程序,這樣可以在運行它需要be.import xml.etree.ElementTree作爲ET

import webbrowser,time,urllib.request,re 
import tkinter as tk 
import urllib 
from PIL import Image,ImageTk 

main = tk.Tk() 
class Application(tk.Frame): 


    def __init__(self, master=None): 
     self.threadTitle = tk.StringVar() 
     self.threadAuth = tk.StringVar() 
     self.threadPub = tk.StringVar() 
     self.threadArtLink = tk.StringVar() 
     self.threadLink = tk.StringVar() 
     self.threadImg = tk.StringVar() 
     self.threadArtLink.set('Click something to display thread info') 
     photo = Image.open("temp.png") 
     photo = photo.resize((150,150), Image.ANTIALIAS) 
     self.threadImage = ImageTk.PhotoImage(photo) 

     # Intializes tkinter gui framework 
     tk.Frame.__init__(self, master) 
     # Packs widgets needed 
     self.grid() 
     # Creates the widgets functions 
     self.createWidgets() 
     # Intializes the man rss.xml 
     self.initial() 
     # self.threadLabelArtLink = None 
     # self.threadLabelTitle = None 
     # self.threadLabelThreadLink = None 
     # self.threadLabelArtLink = None 
     # self.threadImgLink = None 

    def createWidgets(self): 
     # Create entrybox and align to grid 
     self.send_entry = tk.Entry(self) 
     self.send_entry.grid(row=0,column=0) 
     # Create button,allign to grid, get xml 
     self.change_sub = tk.Button(self,text='Change Subreddit',padx=5, pady=5, command=lambda :self.getXML(self.send_entry.get())).grid(row=0 , column=3) 
     # Create scrollbar on Y-Axis 
     self.lb_scrollY = tk.Scrollbar(self,orient=tk.VERTICAL) 
     # On grid next to Listbox(sticky means fill whole row 
     self.lb_scrollY.grid(row=1,column=4,sticky=tk.NS,rowspan=6) 
     # Create Listbox and get Y from scrollbar 
     self.thread_lb = tk.Listbox(self,yscrollcommand=self.lb_scrollY.set,height=20) 
     # Calls function whenever a new item is selected 
     self.thread_lb.bind('<<ListboxSelect>>',self.updateSelected) 
     self.thread_lb.bind('<Double-Button-1>',self.openPage) 
     # scrolly will change the view of listbox 
     self.lb_scrollY['command']=self.thread_lb.yview 
     self.thread_lb.grid(row=1,column=0,sticky=tk.NS+tk.EW,columnspan=4) 
     self.threadFrame = tk.LabelFrame(main,text='Reddit',width=450,height=350,labelanchor='n') 

     self.threadLabelTitle = tk.Label(self.threadFrame,textvariable=self.threadTitle,wraplength=400,padx=20, pady=5).grid(row=1,column=10,sticky= tk.EW) 
     self.threadLabelAuth = tk.Label(self.threadFrame, textvariable=self.threadAuth,wraplength=400,padx=20, pady=5).grid(row=2,column=10,sticky = tk.EW) 
     self.threadLabelPub = tk.Label(self.threadFrame, textvariable=self.threadPub,wraplength=400,padx=20, pady=5).grid(row=3,column=10,sticky = tk.EW) 
     self.threadLabelArtLink = tk.Label(self.threadFrame, textvariable=self.threadArtLink,wraplength=400,padx=20, pady=5).grid(row=4,column=10,sticky = tk.EW) 
     self.threadLabelThreadLink = tk.Label(self.threadFrame, textvariable=self.threadLink,wraplength=400,padx=20, pady=5).grid(row=5,column=10,sticky = tk.EW) 
     self.threadImgLink = tk.Label(self.threadFrame, textvariable=self.threadImg,wraplength=400,padx=20, pady=5).grid(row=6,column=10,sticky = tk.EW) 
     self.threadLabelImage = tk.Label(self.threadFrame,image=self.threadImage,wraplength=400,padx=20,pady=5).grid(row=7,column=10,sticky = tk.EW) 

     self.threadFrame.grid(row=0,column=10,sticky=tk.EW,rowspan=8) 

     self.threadFrame.grid_propagate(0) 

     self.QUIT = tk.Button(self, text="QUIT", fg="red", command=main.destroy,padx=5, pady=5).grid(row=7) 


    def updateSelected(self, event): 
     # getting selected listbox item 
     i=self.thread_lb.curselection() 
     # Returns tuple that must be split 
     x,self.y,z = re.split("\D+",str(i)) 
     self.y=int(self.y) 
     print(self.threadTitleList[self.y]) 
     print(self.threadPubDateList[self.y]) 
     print(self.threadLinkList[self.y]) 
     print(self.threadDescList[self.y]) 
     self.threadTitle.set(self.threadTitleList[self.y]) 
     self.threadAuth.set(self.threadAuthList[self.y]) 
     self.threadPub.set(self.threadPubDateList[self.y]) 
     self.threadArtLink.set(self.threadLinkList[self.y]) 
     self.threadLink.set(self.threadDescList[self.y]) 
     self.threadImg.set('Will put image here') 
     if self.threadLinkList[self.y].find('imgur') != -1: 
      url = self.threadLinkList[self.y]+'.GIF' 
      imageName=self.threadLinkList[self.y][-11:-4] 

      urllib.request.urlretrieve(self.threadLinkList[self.y],imageName+'.jpg') 
      imgfile = Image.open(imageName+'.jpg') 
      imgfile = imgfile.resize((150,150),Image.ANTIALIAS) 
      # img = Image.open(file) 


      self.threadImage = ImageTk.PhotoImage(imgfile) 

      self.threadLabelImage.config(text = self.threadImage) 
      self.threadImage.image = imgfile 


     # # threadTitle = self.threadTitleList[y] 
     # print(self.threadLabelTitle["text"]) 
     # # self.threadLabelTitle['text']=threadTitle 
     # self.threadLabelAutPub['text']=self.threadPubDateList[y] 
     # self.threadImgLink['text']=self.threadLinkList[y] 
     # self.threadLabelThreadLink['text']=self.threadDescList[y] 
     # main.update() 

    def openPage(self,event): 
     webbrowser.get('windows-default').open_new(self.threadLinkList[self.y]) 

    def descStripper(self,desc): 
     # Intialize values 
     l1,l2,l2Start = 0,0,0 
     t1,t2,t2start = 0,0,0 
     link = "" 
     thread = "" 

     # Where to start looking for each in description element 
     l1=int(desc.find('<br/> <a href="')) 
     t1=int(desc.find('</a> <a href="')) 
     a1=int(desc.find('"> ')) 

     # If both of the tags are found then continue 
     if l1 != -1 and t1 != -1 and a1 != 1: 
      # Start looking for end of quotes 16 characters from beginning of tag 
      l2Start = l1+16 
      l2=int(desc.find('"',l2Start)) 
      # Link is created from what is in the quotes 
      link = desc[l1+15:l2] 

      # Same as above but to find thread link 
      t2start = t1+15 
      t2=int(desc.find('"',t2start)) 
      thread = desc[t1+14:t2] 

      a2start = a1+4 
      a2 = int(desc.find(' <',a2start)) 
      author = desc[a1+3:a2] 
      return link,thread,author 
     else: 
      # If it can't find one it will return an error 
      link = "Couldn't find the stuff :(" 
      thread = "Couldn't find the thread link :(" 
      return link, thread 

    def lbPopulator(self,title,pub,link): 
     # Delete old entries from listbox 
     self.thread_lb.delete(0,tk.END) 
     # Iterate through all the items and append them to the listbox 
     for item in title: 
      self.thread_lb.insert(tk.END,item) 

    def getXmlData(self): 
     # Intialize lists 
     self.threadPubDateList = [] 
     self.threadTitleList = [] 
     self.threadLinkList = [] 
     self.threadDescList = [] 
     self.threadThumbNailList = [] 
     self.threadAuthList = [] 
     # Use the downloaded rss.xml for XML parsing 
     tree=ET.parse('rss.xml') 
     # define root as the base of the XML parsing tree 
     root=tree.getroot() 
     for channel in root: 
      # Iterate through all the channels 
      for SubChannel in channel: 
       # Iterate through all the items in the channel 
       if SubChannel.tag == 'item': 
        # If the SubChannel is called item then search for the items below 
        for threadInfo in SubChannel: 
         # iterate through all the items in the 'item' 
         if threadInfo.tag == 'title': 
          # append the tag from the title to the list 
          self.threadTitleList.append(threadInfo.text) 
         if threadInfo.tag == 'pubDate': 
          # Append the pubdate info to the list but remove excess characters 
          self.threadPubDateList.append(threadInfo.text[:-6]) 
         if threadInfo.tag == 'description': 
          # Pass all the information from the description to the stripper to get the useful 
          # information and links 
          link,thread,author = self.descStripper(threadInfo.text) 
          self.threadLinkList.append(link) 
          self.threadDescList.append(thread) 
          self.threadAuthList.append(author) 
         # if threadInfo.tag == '' 
      # Populate the listbox with the newly generated lists 
     self.lbPopulator(self.threadTitleList,self.threadPubDateList,self.threadLinkList) 

    def getXML(self,subreddit): 
     try: 
      # Try to download the xml file using the user input subreddit 
      url = 'http://www.reddit.com'+subreddit+'.rss' 
      source = urllib.request.urlretrieve(url,'rss.xml') 
      self.getXmlData() 
     except urllib.error.HTTPError as err: 
      # Error caused by reddit API limiting connections 
      print('Too many requests-Try again') 

    def initial(self): 
     try: 
      # Same as above but downloads the front page 
      source = urllib.request.urlretrieve('http://www.reddit.com/.rss','rss.xml') 
      self.getXmlData() 
     except urllib.error.HTTPError as err: 
      print('Too many requests-Trying again 3') 
      # If error occurs program waits 3 seconds and then restarts 
      time.sleep(3) 
      self.__init__() 

# main.geometry("350x400") 
app = Application(master=main) 
# Begins the applications GUI loop 

app.mainloop() 

回答

1

grid方法一個Tkinter小部件總是返回None。所以,任何對它的呼叫都必須放在他們自己的路線上。

含義,所有被寫成這樣的線路:

self.threadLabelTitle = tk.Label(self.threadFrame,textvariable=self.threadTitle,wraplength=400,padx=20, pady=5).grid(row=1,column=10,sticky= tk.EW) 

需要重寫這樣的:

self.threadLabelTitle = tk.Label(self.threadFrame,textvariable=self.threadTitle,wraplength=400,padx=20, pady=5) 
self.threadLabelTitle.grid(row=1,column=10,sticky= tk.EW) 
+0

我更新的代碼,但現在我得到'_tkinter.TclError:圖像「pyimage1」不存在「作爲錯誤。它追溯到'self.threadImage = ImageTk.PhotoImage(imgfile)'。我試圖宣佈主人,但沒有改變任何東西。 – ddaniels

+0

@ddaniels - 我很抱歉,但這是一個完全獨立的問題。從我所知道的問題是,PIL無法找到指定的圖像文件。不幸的是,我無法幫助您調試此問題,因爲我沒有安裝PIL。我確實找到了一個[參考](http://www.daniweb.com/software-development/python/threads/154237/tkinter-problem),雖然這可能會有所幫助。如果不是,那麼您將需要等待其他人回答您的問題,或者提出有關該問題的新問題。 – iCodez