Вращение куба за python с использованием tkinter - PullRequest
1 голос
/ 22 апреля 2020

Я пытаюсь повернуть куб, используя tkinter. моя стратегия состоит в том, чтобы иметь набор вершин, которые я вращаю, затем я рисую линии, соединяющие эти вершины. Однако, когда я пытаюсь запустить это, холст не открывается. Я попытался отладить, поместив условия печати в l oop, и кажется, что код вращает куб, но GUI не отображается:

from tkinter import*
import math
import time
import numpy as np

class Window(Frame):

    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.master = master

class Square():
    def __init__(self, length, cx, cy):
        self._cx = cx
        self._cy = cy
        self._length = length
        self._vertices = []
        self._vertices.append([-length/2,length/2])
        self._vertices.append([length/2, -length/2])
        self._vertices.append([length/2, length/2])
        self._vertices.append([-length/2, length/2])


    def rotate(self, theta):
        rotat_matrix = np.array([[math.cos(theta), math.sin(theta)],[-math.sin(theta), math.cos(theta)]])
        #print("rotation matrix:", rotat_matrix)
        for i in range(len(self._vertices)):
            vector = np.dot(rotat_matrix,self. _vertices[i]).tolist()
            #print("V:", vector)
            self._vertices[i] = vector

square = Square(100, 500, 500)


top = Tk()
canvas = Canvas(top,bg="#EBEDEF",height=800, width=800)
canvas.pack()



while (True):
    v0 = square._vertices[0]
    v1 = square._vertices[1]
    v2 = square._vertices[2]
    v3 = square._vertices[3]
    canvas.create_line(v0[0] + 200, v0[1] + 200, v1[0]+200,v1[1]+200)
    canvas.create_line(v1[0] + 200, v1[1] + 200, v2[0]+200,v2[1]+200)
    canvas.create_line(v2[0] + 200, v2[1] + 200, v3[0]+200,v3[1]+200)
    canvas.create_line(v3[0] + 200, v3[1] + 200, v0[0]+200,v0[1]+200)
    square.rotate(math.pi/8)
    #time.sleep(2)
    print("rotated")

top.mainloop()

1 Ответ

1 голос
/ 22 апреля 2020

while True l oop никогда не завершается и препятствует достижению кода top.mainloop(), следовательно, ваш холст никогда не отображается.

Вы можете заменить его функцией, которая вызывает себя обратно, используя top.after метод.

from tkinter import*
import math
import time
import numpy as np

class Window(Frame):

    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.master = master

class Square():
    def __init__(self, length, cx, cy):
        self._cx = cx
        self._cy = cy
        self._length = length
        self._vertices = []
        self._vertices.append([-length/2,length/2])
        self._vertices.append([length/2, -length/2])
        self._vertices.append([length/2, length/2])
        self._vertices.append([-length/2, length/2])


    def rotate(self, theta):
        rotat_matrix = np.array([[math.cos(theta), math.sin(theta)],[-math.sin(theta), math.cos(theta)]])
        #print("rotation matrix:", rotat_matrix)
        for i in range(len(self._vertices)):
            vector = np.dot(rotat_matrix,self. _vertices[i]).tolist()
            #print("V:", vector)
            self._vertices[i] = vector

square = Square(100, 500, 500)


top = Tk()
canvas = Canvas(top,bg="#EBEDEF",height=800, width=800)
canvas.pack()



def run():
    v0 = square._vertices[0]
    v1 = square._vertices[1]
    v2 = square._vertices[2]
    v3 = square._vertices[3]
    canvas.create_line(v0[0] + 200, v0[1] + 200, v1[0]+200,v1[1]+200)
    canvas.create_line(v1[0] + 200, v1[1] + 200, v2[0]+200,v2[1]+200)
    canvas.create_line(v2[0] + 200, v2[1] + 200, v3[0]+200,v3[1]+200)
    canvas.create_line(v3[0] + 200, v3[1] + 200, v0[0]+200,v0[1]+200)
    square.rotate(math.pi/8)
    print("rotated")
    top.after(100, run)


if __name__ == '__main__':
    run()
    top.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...