Как я могу оптимизировать движение своей линии в Tkinter?

#python #function #tkinter #methods

Вопрос:

Запуск Кода

 import tkinter
from tkinter import *
import math

class Template:
    def __init__(self):
        self.window = Tk()
        self.window.title("2D Display")

        self.canvas = self.canvas_display()
        self.line1 = self.line_creation(500 * .3,0,500 * .3, 1000)
        self.line3 = self.line_movement_creation(0, 0,2000, 0)

        self.speedx = 0 # Movement of Line3
        self.speedy = 9 # Movement of line3
        self.active = True

 
         #self.move_active()  #Code that creates the problem
 

В настоящее время это создает сетку. Как только я попытаюсь заставить горизонтальные линии двигаться. Программа выходит из строя. Работает без self.move_active() , поэтому я прокомментировал это.

 
        self.canvas.update()

    def canvas_display(self):  #canvas
        canvas = Canvas(self.window, width=500, height=400, 
    background='black')
        canvas.pack(expand=True, fill="both")
        canvas.update()
        return canvas


    def line_creation(self,x,y,x1,y1): #creation of multpie lines
        spacing = 0
        for i in range(11):
            self.canvas.create_line(x   spacing, y ,x1   spacing ,y1 , 
                                           width=2, fill="white")
            spacing  = 100
    
    def line_movement_creation(self,x,y,x1,y1):
        spacing1 = 0
        for i in range(11):
            self.canvas.create_line(x, y spacing1 ,x1 ,y1   spacing1 
                                           ,width=2, fill="white")
            spacing1  = 100

 

Эти две функции line_creation и line_movement_creation создают горизонтальные и вертикальные линии. Оба работают хорошо.

     def line_update(self): #line movement method
        self.canvas.move(self.line3, self.speedx, self.speedy)
        pos = self.canvas.coords(self.line3)
        if pos[3] >= 800:                #o
            self.canvas.move(self.line3, self.speedx,self.speedy-800)

    def move_active(self):
        if self.active:
            self.line_update()
            self.window.after(40, self.move_active)

    def run(self):
        self.window.mainloop()

 

Эти две функции заставляют линии двигаться. Я думаю, что проблема в том, чтобы создать 10 строк и попытаться переместить их все сразу или только эти функции, но я понятия не имею.

 
    if __name__ == '__main__':
        Temp = Template()
        Temp.run()

 

Комментарии:

1. Я не совсем уверен, в чем здесь вопрос. Почему вы не можете сделать то же самое для горизонтальных линий, что и для вертикальных линий, но изменить координаты линий x вместо их координат? y

2. Я так и сделал, это создало сетку, похожую на узор. Затем я попытался заставить линии двигаться, но столкнулся с ошибкой. Я обновлю код.

3. Для всех, кто видит это, когда я пытаюсь запустить программу с комментарием #self.move_active (), я получаю: tkinter. TclError: неверно # аргументы: должно быть «.! перемещение холста тагОрИд xAmount ямаунт»

4. Эта ошибка возникает из line3 None -за того, что вы передаете ее self.move_active() кому-то . Это None потому , что для него установлено возвращаемое значение self.line_movement_creation() , которое ничего не возвращает. Я посмотрю, что я могу сделать, но это может занять некоторое время…

Ответ №1:

Этот код должен работать:

 import time
from tkinter import *

class Template:
    def __init__(self):
        self.window = Tk()
        self.window.title("2D Display")

        self.canvas = self.canvas_display()
        self.line1 = self.line_creation(500 * .3,0,500 * .3, 1000)
        self.line3 = self.line_movement_creation(0, 0,2000, 0)

        self.speedx = 0 # x movement of line3
        self.speedy = 9 # y movement of line3
        self.active = True

        self.move_active()  #Code that creates the problem
        self.canvas.update()

    def canvas_display(self):  #canvas
        canvas = Canvas(self.window, width=500, height=400, background='black')
        canvas.pack(expand=True, fill="both")
        canvas.update()
        return canvas

    def line_creation(self,x,y,x1,y1): #creation of multple lines
        spacing = 0
        lines = []
        for i in range(11):
            id = self.canvas.create_line(
                x   spacing,
                y,
                x1   spacing,
                y1, 
                width=2,
                fill="white",
            )
            lines.append(id)
            spacing  = 100
        return lines

    def line_movement_creation(self,x,y,x1,y1):
        spacing1 = 0
        lines = []
        for i in range(11):
            id = self.canvas.create_line(
                x,
                y spacing1,
                x1,
                y1   spacing1,
                width=2,
                fill="white"
            )
            lines.append(id)
            spacing1  = 100
        return lines

    def line_update(self): #line movement method
        for line in self.line3:
            self.canvas.move(line, self.speedx, self.speedy)
            pos = self.canvas.coords(line)
            if pos[3] >= 800:
                self.canvas.move(line, self.speedx, self.speedy - 800)

    def move_active(self):
        if self.active:
            self.line_update()
            self.window.after(40, self.move_active)

    def run(self):
        self.window.mainloop()

if __name__ == '__main__':
    Temp = Template()
    Temp.run()
 

Разница: я сделал line_creation() , и line_movement_creation() каждый возвращает список идентификаторов строк, которые они создали. line_creation() список » s «сохраняется в self.line1 , а line_movement_creation() список» s » сохраняется в self.line3 . line_update() затем используется self.line3 для перемещения горизонтальных линий.

Вот старый line_update() метод:

 def line_update(self): #line movement method
    self.canvas.move(self.line3, self.speedx, self.speedy)
    pos = self.canvas.coords(self.line3)
    if pos[3] >= 800:                #o
        self.canvas.move(self.line3, self.speedx,self.speedy-800)
 

…и вот новый line_update() метод:

 def line_update(self): #line movement method
    for line in self.line3:
        self.canvas.move(line, self.speedx, self.speedy)
        pos = self.canvas.coords(line)
        if pos[3] >= 800:
            self.canvas.move(line, self.speedx, self.speedy - 800)
 

Как вы можете видеть, единственное отличие здесь в том, что он перебирает все строки self.line3 и перемещает каждую по отдельности. Координаты движения точно такие же.