Проблема заполнения окна Python tkinter / turtle квадратами - PullRequest
0 голосов
/ 10 мая 2018

У меня проблемы с получением команд turtle.begin_fill() / turtle.end_fill() для работы в окне tkinter.Я хочу, чтобы программа рисовала кучу цветных ячеек на экране в сетке 64x32.Это весь код для настройки окна и отрисовки, однако он просто ничего не делает после настройки окна:

import turtle as tu
import tkinter as tk

axis = []
num = -512

for i in range(0,64):
    axis.append(num)
    num = num + 16

def drawworld(*args):
    for i in range(0,64):
        for j in range(0,32):
            tu.goto(axis[i],axis[j]+256)
            tu.pd()
            tu.color=("#ffff00")
            tu.begin_fill()
            for k in range(0,4):
                tu.fd(16)
                tu.lt(90)
            tu.end_fill()
            tu.pu()

root = tk.Tk()
root.title("game")
root.resizable(False, False)
canvas = tk.Canvas(master = root, width = 1024, height = 512)
canvas.grid(row=0, column=0, columnspan=10)
tu = tu.RawTurtle(canvas)
tu.speed(50)
tu.pu()
tu.ht()

drawworld()

root.mainloop()

однако, если бы я закомментировал строки заливки, код работает отлично(без закрашивания прямоугольников), что означает, что должно быть что-то не так:

tu.color=("#ffff00")
tu.begin_fill()
for k in range(0,4):
    tu.fd(16)
    tu.lt(90)
tu.end_fill()
tu.pu()

Я просмотрел документацию, и это должен быть идеальный синтаксис.Что я делаю не так?

1 Ответ

0 голосов
/ 11 мая 2018

Я считаю, что ваша проблема в этой строке:

tu.color=("#ffff00")

что, вероятно, должно быть:

tu.color("#ffff00")

чтобы установить цвет, вы не присваиваете свойству color черепахи, а вызываете метод .color() черепахи. Ваш код с этим изменением и другой очисткой:

import tkinter as tk
from turtle import RawTurtle

axis = []
num = -512

for _ in range(64):
    axis.append(num)
    num += 16

def drawworld():
    for i in range(64):
        for j in range(32):
            tu.goto(axis[i], axis[j] + 256)
            tu.pendown()
            tu.color("#ffff00")
            tu.begin_fill()
            for _ in range(4):
                tu.forward(16)
                tu.left(90)
            tu.end_fill()
            tu.penup()

root = tk.Tk()
root.title("game")
root.resizable(False, False)

canvas = tk.Canvas(master=root, width=1024, height=512)
canvas.grid(row=0, column=0, columnspan=10)

tu = RawTurtle(canvas)
tu.speed('fastest')
tu.hideturtle()
tu.penup()

drawworld()

root.mainloop()

Однако, это мучительно медленный способ сделать это. Есть более быстрые способы, вот тот, который использует штамповку для ускорения процесса:

import tkinter as tk
from turtle import RawTurtle
from random import random

CUBE_SIZE = 16
CURSOR_SIZE = 20
WIDTH, HEIGHT = 1024, 512

axis = []
num = -HEIGHT

for _ in range(WIDTH // CUBE_SIZE):
    axis.append(num)
    num += CUBE_SIZE

def drawworld():
    for i in range(WIDTH // CUBE_SIZE):
        tu.goto(axis[i] + CUBE_SIZE // 2, axis[0] + HEIGHT // 2 + CUBE_SIZE // 2)

        for j in range(HEIGHT // CUBE_SIZE):
            tu.color(random(), random(), random())
            tu.stamp()
            tu.forward(CUBE_SIZE)

root = tk.Tk()
root.title("game")
root.resizable(False, False)

canvas = tk.Canvas(master=root, width=WIDTH, height=HEIGHT)
canvas.grid(row=0, column=0, columnspan=10)

tu = RawTurtle(canvas)
tu.shape('square')
tu.shapesize(CUBE_SIZE / CURSOR_SIZE)
tu.speed('fastest')
tu.hideturtle()
tu.setheading(90)
tu.penup()

drawworld()

root.mainloop()
...