Почему tkinter использует черный цвет заливки вместо указанного мной цвета? - PullRequest
0 голосов
/ 01 февраля 2020

Я только начал изучать tkinter, рисуя набор Мандельброта.

Я задаю цвет заливки в виде строки '#0074bf', но он отображается как black. Почему kwarg игнорируется при вызове c.create_oval(x, y, x, y, fill = '#0074bf')?

from tkinter import *

# Some globals
SIZE = 4
WIDTH = 600
HEIGHT = 600
ratio = (WIDTH / SIZE, HEIGHT / SIZE)
zmin = -SIZE / 2 - (SIZE / 2) * 1j
zmax = SIZE / 2 + (SIZE / 2) * 1j
ESCAPE_RADIUS = 4
max_iterations = 256

# Create the window with Canvas
master = Tk()
c = Canvas(master, width = WIDTH, height = HEIGHT)
c.pack()

# Define a function to iterate; here, the classic Mandelbrot set function, z -> z^2 + c
f =  lambda z, c : z * z + c

def iterate(pixel):
    """
    Given a pixel (as a complex number x + iy) return the
    number of iterations it takes to escape,
    or the final count if it doesn't.
    """
    z0 = px_to_cx(pixel)
    z = z0
    num_iterations = 0
    while abs(z) < ESCAPE_RADIUS and num_iterations < max_iterations:
        z = f(z, z0)
        num_iterations += 1
    return num_iterations - 1

def px_to_cx(pixel):
    return (pixel.real - WIDTH / 2) / ratio[0] + ((pixel.imag - HEIGHT / 2) / ratio[1]) * 1j

for y in range(HEIGHT):
    for x in range(WIDTH):
        num = iterate(x + y * 1j)
        if  num < max_iterations / 2:
            # Here, the fill argument I supply seems to be ignored:
            c.create_oval(x, y, x, y, fill = '#0074bf')

mainloop()

1 Ответ

1 голос
/ 01 февраля 2020

Вы создаете овал шириной в один пиксель и высотой в один пиксель. То, что вы видите, это цвет овального контура. С одним пикселем недостаточно места, чтобы нарисовать контур и интерьер.

Вы можете установить для атрибута outline тот же цвет, что и для цвета заливки, либо установить нулевую ширину контура (атрибут width).

Вот пример, который показывает два разных блока овалов по 1 пикселю. Один из них имеет ширину контура по умолчанию, а другой явно устанавливает ширину контура на ноль. Обратите внимание, что в первом вы видите цвет контура, а во втором вы видите цвет заливки.

import tkinter as tk
root = tk.Tk()
canvas = tk.Canvas(root, width=200, height=200, background="black")
canvas.pack(fill="both", expand=True)

for x in range(100):
    for y in range(100):
        canvas.create_oval(x, y, x, y, outline="red", fill="green")

for x in range(100, 200):
    for y in range(100, 200):
        canvas.create_oval(x, y, x, y, outline="red", fill="green", width=0)

root.mainloop()

enter image description here

...