geekcomputers/Python · error · TypeError

The tk_instance argument must be an instance of Tk.

Error message

The tk_instance argument must be an instance of Tk.

What it means

The Background class constructor in this tkinter Flappy Bird clone validates that its first argument is a tkinter.Tk instance and raises TypeError otherwise. Background manages the animated background and needs the real root window to query geometry and schedule animation.

Source

Thrown at Flappy Bird - created with tkinter/Background.py:18

from tkinter import Tk, Canvas

from PIL.Image import open as openImage
from PIL.ImageTk import PhotoImage


class Background(Canvas):
    """
    Classe para gerar um plano de fundo animado
    """

    __background = []
    __stop = False

    def __init__(self, tk_instance, *geometry, fp="background.png", animation_speed=50):
        # Verifica se o parâmetro tk_instance é uma instância de Tk
        if not isinstance(tk_instance, Tk):
            raise TypeError("The tk_instance argument must be an instance of Tk.")

        # Recebe o caminho de imagem e a velocidade da animação
        self.image_path = fp
        self.animation_speed = animation_speed

        # Recebe a largura e altura do widget
        self.__width = geometry[0]
        self.__height = geometry[1]

        # Inicializa o construtor da classe Canvas
        Canvas.__init__(
            self, master=tk_instance, width=self.__width, height=self.__height
        )

        # Carrega a imagem que será usada no plano de fundo
        self.__bg_image = self.getPhotoImage(
            image_path=self.image_path,
            width=self.__width,

View on GitHub (pinned to 40f4cd2652)

Solutions

  1. Pass an instance of tkinter.Tk created via tk = Tk() before constructing Background
  2. If embedding in another app, restructure Background to accept the root Tk, not an intermediate widget
  3. In tests, patch the isinstance check or construct a real (withdrawn) Tk instance

Example fix

# before
root = SomeFrame(parent)
bg = Background(root)
# after
import tkinter as tk
root = tk.Tk()
bg = Background(root)
Defensive patterns

Strategy: type-guard

Validate before calling

import tkinter as tk
assert isinstance(root, tk.Tk), 'root must be a Tk instance'

Type guard

from tkinter import Tk
def is_tk(obj) -> bool:
    return isinstance(obj, Tk)

Try / catch

try:
    bg = Background(root)
except TypeError as e:
    print('Background needs a Tk instance:', e)

Prevention

When it happens

Trigger: Passing anything other than a Tk instance as tk_instance: a Toplevel, a Frame, a Canvas, None, or a mock in tests.

Common situations: Refactoring the game to embed it in an existing window using Frame/Toplevel; unit tests passing mocks; passing the class Tk instead of an instance.

Related errors


AI-assisted analysis of geekcomputers/Python@40f4cd2652 (2026-08-27). Data as JSON: /api/errors/4adc3eecb4eefad3. Report an issue: GitHub.