2014-02-01 4 views
0

Вот моя программа, как еще:Нужна помощь размещения кнопки на PhotoImage .gif

from tkinter import * 
from collections import deque 

class App(): 

    def __init__(self, *images): 
     self.root = Tk() 
     self.root.title("Skin") 

     self.image_dict = {image: PhotoImage(file=image) for image in images} 
     self.image_queue = deque(images) 

     b = Button(self.root, text="Click here to see the diagram!", command=self.change_image) 
     b.pack(fill=X) 

     self.label = Label(self.root, image=self.image_dict["1.gif"]) 
     self.label.image = self.image_dict["1.gif"] 
     self.label.pack() 

    def change_image(self): 
     self.image_queue.rotate(-1) 
     next_image = self.image_queue[0] 
     self.label.configure(image=self.image_dict[next_image]) 
     self.label.image = self.image_dict[next_image] 

if __name__ == "__main__": 
    app = App('1.gif', '2.gif') 
    app.root.mainloop() 

Что это делает, когда вы запускаете scipt, окно появляется diplaying «1.gif», и кнопка. Когда вы нажимаете кнопку, «1.gif» изменяется на «2.gif». «1.gif» - это пустая диаграмма, «2.gif» - это диаграмма с метками, показывающая, что каждая часть диаграммы.

Теперь для следующего этапа моей программы мне нужно каким-то образом добавить несколько невидимых кнопок или что-то в этом роде на каждое слово на диаграмме на «2.gif», и когда вы нажмете на него, мне нужно отдельное окно, чтобы придумать текст на нем. Есть ли способ реализовать это в моей текущей программе? Я не знаю, с чего начать. Спасибо!

ответ

1

Я думаю, вам будет лучше использовать холст, чтобы держать ваши изображения, а не , чем метку. Затем вы можете поместить «горячие точки» по диаграмме и связать с ними события . например. что-то вроде:

from tkinter import * 

class App(): 

    def __init__(self): 
     self.root = Tk() 

     self.messages = {} 

     self.canvas = Canvas(self.root, bd=0, highlightthickness=0) 
     self.image = PhotoImage(file='2.gif') 
     self.canvas.create_image(0,0, image=self.image, anchor='nw') 
     w,h = self.image.width(), self.image.height() 
     self.canvas.config(width=w, height=h) 
     self.canvas.pack() 

     self.balloon = b = Toplevel(self.root) 
     b.withdraw() 
     b.wm_overrideredirect(1) 
     self.msg = Label(b, bg='black', fg='yellow', bd=2, text='') 
     self.msg.pack() 

     self.set_up_hotspots() 

    def set_up_hotspots(self): 
     box1 = self.canvas.create_polygon(50,100,100,100,100,150,50,150, 
               outline='blue', fill='') 
     #note: outline can be '' also ;) 
     self.messages[box1] = "The machine head consists of a "\ 
           "Flynn mechanism,\na Demmel crank, "\ 
           "and a heavy-duty frobulator. " 

     box2 = self.canvas.create_polygon(150,100,200,100,200,150,150,150, 
               outline='red', fill='') 
     self.messages[box2] = "And now for something completely different" 

     for item in [box1, box2]: 
      for event, handler in [('<Enter>', self.on_hotspot_enter), 
            ('<Leave>', self.on_hotspot_leave)]: 
       self.canvas.tag_bind(item, event, handler) 

    def on_hotspot_enter(self, event): 
     if not self.balloon.winfo_ismapped(): 
      txt = self.messages[event.widget.find_withtag('current')[0]] 
      self.msg.config(text=txt) 
      x,y = event.x_root, event.y_root 
      self.balloon.geometry('+%d+%d' %(x+16,y)) 
      self.balloon.deiconify() 

    def on_hotspot_leave(self, event): 
     if self.balloon.winfo_ismapped(): 
      self.balloon.withdraw() 


if __name__ == "__main__": 

    app = App() 
    app.root.mainloop()  
Смежные вопросы