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.

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.

Understand the failure class

Background: "Must be a positive integer", "Invalid value", "Unsupported": the invalid-argument-value error family, when a library rejects the value you pass — this error's family across 35 libraries.

Related errors


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

Appendix: 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)