tkinter: нажатие кнопки для добавления новой ошибки изображения - PullRequest
0 голосов
/ 10 января 2019

Это мой код. Я пытаюсь запрограммировать игру «4 в ряд» с графикой и хочу добавить изображение при нажатии на холст:

 def player_vs_player(self):
    self.pvp = tk.Tk()
    main_menu=tk.Button(self.pvp,text="main_menu",bg="black",fg="white",
                        command=self.main_menu)
    main_menu.grid(row=0,column=0)
    canvas = tk.Canvas(self.pvp, width=700, height=600, bg="black")
    canvas.grid(row=1, column=0, rowspan=6, columnspan=7)
    canvas.bind("<Button-1>", self.mouse_callback)
    self._root.withdraw()
    self.pvp.mainloop()

def mouse_callback(self, event):
    self.player = self.game.current_player
    ball = tk.Label(self.pvp,image=self.color_match[self.player])
    ball.image = self.color_match[self.player]
    try:
        loc = self.game.make_move(event.x // 100)
        ball.grid(row=loc[1], column=loc[0])
    except:
        tk.messagebox.showinfo("Error", "column is full")
    if self.game.get_winner() == 0:
        tk.messagebox.showinfo("Game Over!", "It's a tie")
        self.close_pvp()
    if self.game.get_winner():
        tk.messagebox.showinfo("Game Over!", 'Player' + str(self.player)
                               + 'has won')
        self.close_pvp()

Я получаю эту ошибку:

Exception in Tkinter callback
  Traceback (most recent call last):
    File "C:\Users\Adam\Downloads\WPy-3662\python-3.6.6.amd64\lib\tkinter\__init__.py", line 1702, in __call__
      return self.func(*args)
    File "C:/Users/Adam/Documents/ComputerSciense/ex12/gui.py", line 69, in mouse_callback
      ball = tk.Label(self.pvp,image=self.color_match[self.player])
    File "C:\Users\Adam\Downloads\WPy-3662\python-3.6.6.amd64\lib\tkinter\__init__.py", line 2763, in __init__
      Widget.__init__(self, master, 'label', cnf, kw)
    File "C:\Users\Adam\Downloads\WPy-3662\python-3.6.6.amd64\lib\tkinter\__init__.py", line 2296, in __init__
      (widgetName, self._w) + extra + self._options(cnf))
  _tkinter.TclError: image "pyimage3" doesn't exist

INIT: это инициация, я думаю проблема не со словарем, так как он настроен правильно:

  def __init__(self):
    self._root = tk.Tk()
    self.game = Game(Board())
    self.player = self.game.current_player
    self.blueball = ImageTk.PhotoImage(Image.open("blueball.png").
                                       resize((90, 90), Image.ANTIALIAS))
    self.boardimage = ImageTk.PhotoImage(Image.open("b.png").
                                         resize((600, 700),
                                                Image.ANTIALIAS))
    self.redball = ImageTk.PhotoImage(Image.open("redball.png").
                                      resize((90, 90), Image.ANTIALIAS))
    self.exit = ImageTk.PhotoImage(Image.open('exit.png').
                                   resize((100, 100), Image.ANTIALIAS))
    self.pvpimage = ImageTk.PhotoImage(Image.open('pp.png').
                                       resize((100, 100), Image.ANTIALIAS))
    self.pvcimage = ImageTk.PhotoImage(Image.open('pcp.png').
                                       resize((100, 100), Image.ANTIALIAS))
    self.color_match = {1: self.redball, 2: self.blueball}
    self._cv = tk.Canvas(self._root, width=700, height=600, bg="#84d0ff")

1 Ответ

0 голосов
/ 11 января 2019

Это определенно вызвано множеством экземпляров Tk(), как сказали другие. Ниже приведен демонстрационный пример с ошибкой того же типа:

from tkinter import *
from PIL import ImageTk, Image

# create the image in one Tk instance
win = Tk()
img = ImageTk.PhotoImage(Image.open('redball.png').resize((100, 100)))

# then use the image in another Tk instance
root = Tk()
Label(root, image=img).pack()
root.mainloop()

Приведенная выше программа получит следующую ошибку:

_tkinter.TclError: image "pyimage1" doesn't exist

Если вы просто хотите иметь несколько окон в своем приложении, используйте Tk() в качестве основного окна и Toplevel() в качестве других окон.

...