2013-05-30 2 views
3

Я пытаюсь отобразить изображение на python, используя опцию tkinter canvas. Однако, если я ввожу его в класс, как показано ниже, он не дает ошибку, но также не показывает мое изображение. Кнопки отображаются правильно. Кроме того, если я возьму код для создания этого изображения из класса, он работает правильно. Кажется, я не могу понять, в чем проблема.Изображение tkinter canvas не отображается в классе

import Tkinter as tk 
from Tkinter import * 

class Board(tk.Frame): 
    def __init__(self,parent): 

     frame = Frame(parent) 
     frame.pack() 
     tk.Frame.__init__(self,parent) 

     frame2 = Frame(frame) 
     frame2.pack() 

     c=Canvas(frame2) 
     c.pack(expand=YES,fill=BOTH) 
     background=PhotoImage(file='Board.gif') 
     c.create_image(100,100,image=background,anchor='nw') 

     button = Button(frame, text="Next turn", command=self.next_turn) 
     button.pack() 

     button = Button(frame, text="Roll the dice", command=self.roll) 
     button.pack() 

     .... 

root = Tk() 
board = Board(root) 
board.pack() 
root.mainloop() 
+0

почему вы делаете как 'импорта Tkinter как tk' И' от Tkinter импорта * '? –

+0

Мой учитель сказал мне сделать это, чтобы убедиться, что все было импортировано или что-то в этом роде. Я знаю, что это не секретно, но теперь есть несколько строк, которые имеют tk.'something ', и если я просто удалю tk. моя программа волнуется. Вы думаете, что это может быть проблемой? – konovalov100

+0

Это, вероятно, из-за 'tk.Frame .__ init __ (self, parent)' и 'class Board (tk.Frame)'. Вы можете изменить это на «Frame .__ init __ (self, parent)» и «class Board (Frame)», который должен работать, хотя я не уверен, почему вы прямо вызываете метод '__init__'; Я не вижу, какой целью служит Frame, потому что вы не ссылаетесь на него. –

ответ

5

Вы должны оставить ссылку на PhotoImage. Это просто и пример (вы также можете использовать self.background вместо c.background):

c = Canvas(frame2) 
    c.pack(expand=YES,fill=BOTH) 
    c.background = PhotoImage(file='Board.gif') 
    c.create_image(100,100,image=c.background,anchor='nw') 
+0

Спасибо большое! Это решило проблему, на самом деле ее не удалось найти. – konovalov100

+0

@ user2438352 Добро пожаловать, рад помочь;) Не стесняйтесь принять ответ, если он решит вашу проблему. –

+0

Любая идея, почему 'Canvas.create_image()' увеличивает счетчик ссылок 'image =', он передается, поэтому он не будет уничтожен при возврате функции? Похоже, это должно соответствовать обычным правилам управления памятью Python. – martineau

Смежные вопросы