#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
и перемещает каждую по отдельности. Координаты движения точно такие же.