Найти - Пользователи
Полная версия: Tkinter - не двигается объект
Начало » Python для новичков » Tkinter - не двигается объект
1
Simka
Создаю объект - многоугольник. Он появляется в окне. Затем к программке добавляю фрагмент, чтобы заставить объект перемещаться в окне. И получаю сообщение об ошибке - Phyton воспринимает объект как “integer”:

in <module>
MKS.move(1, 5, 0)
AttributeError: ‘int’ object has no attribute ‘move’

Программка такая:
 import tkinter as tk
root = tk.Tk()
c= tk.Canvas(root, width=500, height=400, bg='black')
c.pack()
MKS=c.create_polygon(110, 304, 110, 308, 106, 308, 106, 322, 110, 322, 110, 326,121, 326,
126, 324, 138, 327, 138, 332, 146, 332, 146, 322,138, 332, 138, 324, 131, 322, 142,
318, 142, 312, 128, 307, 128, 302, 134, 302, 134,280, 122, 280, 122, 300, 126, 302,
126, 306, 121, 304, fill='#FFD700', outline='black') #poligon MKS
for x in range(0, 60) :
    MKS.move(1, 5, 0)
    tk.update()
    time.sleep(0.05)
root.mainloop()

Ранее вот такой вариант проверял, работает:
 from tkinter import*
import time
tk= Tk()
canvas = Canvas(tk, width=500, height=400, bg='white')
canvas.pack()
canvas.create_polygon(10, 304, 10, 308, 6, 308, 6, 322, 10, 322, 10, 326,21, 326,
                      26, 324, 38, 327, 38, 332, 46, 332, 46, 322,38, 332, 38, 324, 31, 322, 42,
                      318, 42, 312, 28, 307, 28, 302, 34, 302, 34,280, 22, 280, 22, 300, 26, 302,
                      26, 306, 21, 304, fill='#FFD700', outline='black')
for x in range(0, 60) :
    canvas.move(1, 5, 0)
    tk.update()
    time.sleep(0.05)
root.mainloop()

Собственно, отличие минимальное - идентификатор MKS (“Межпланетная Космическая Станция”). Это мне удобнее, потому что этот фрагмент у меня идет как модуль другой, более обширной программы.
Что подправить в первом варианте? Или не заморачиваться и брать второй?

ZerG
 MKS= tk.Canvas(root, width=500, height=400, bg='black')
MKS.pack()
MKS.create_polygon
Simka
Спасибо за быстрый ответ!
Видимо, я нечетко описал ситуацию и ввел вас в заблуждение. Дело в том, что выше в программе ( Я только часть показал) уже создано окно и на нем размещено несколько изображений, с которыми производятся операции по смене цвета, без перемещения. Далее я создаю дополнительный, движущийся объект MKS на том же окне.
Возможно, я ошибаюсь, но скорее всего строкой MKS= tk.Canvas(root, width=500, height=400, bg='black') я удалю прежнее окно?
Вот такой у меня сейчас код:

 .........
c=Canvas(root, width=500, height=400, bg='black')
c.pack()
.........
disk=c.create_oval(180, ......
Hole=c.create_oval(190, ......
tk.update()  #оператор смены картинки
time.sleep(2.0)
c.itemconfig(disk,outline='#000080') #смена цвета диска
tk.update()
time.sleep(2.0)
c.itemconfig(disk,outline='#0000CD') #смена цвета диска
tk.update()  #оператор смены картинки
time.sleep(2.0)
.......
tk.update()
time.sleep(2.0)
c.itemconfig(disk,outline='#63B8FF') #смена цвета диска
c.create_polygon(110, 304 .....
for x in range(0, 60) :
    c.move(1, 5, 0)
    tk.update()
    time.sleep(0.05)
root.mainloop()

Изображение объекта “poligon” появляется, но - не движется. Видимо, Phyton просто не понимает, какой объект двигать, к какому относится команда c.move. Двигается не “poligon”, а объект, созданный первым, ранее объекта “disk”. Это одна из точек, случайным порядком расположенных в качестве “звездочек” на черном небе. Маленькие, потому и не сразу заметил, что одна (каждый пуск программы разная) двигается…
Залез в мурзилку Джейсона Бриггса. Похоже, нужно класс “MKS” создавать?
rami
Simka
Создаю объект - многоугольник
MKS — это не сам объект, а его идентификатор. В метод .move() нужно передавать первым параметром идентификатор нужного объекта (в данном случае MKS), а не 1
 import tkinter as tk
import time
 
 
root = tk.Tk()
 
c = tk.Canvas(root, width=500, height=400, bg='black')
c.pack()
 
MKS = c.create_polygon(110, 304, 110, 308, 106, 308, 106, 322, 110, 322, 110, 326,121, 326,
126, 324, 138, 327, 138, 332, 146, 332, 146, 322,138, 332, 138, 324, 131, 322, 142,
318, 142, 312, 128, 307, 128, 302, 134, 302, 134,280, 122, 280, 122, 300, 126, 302,
126, 306, 121, 304, fill='#FFD700', outline='black') #poligon MKS
 
for x in range(0, 60) :
    c.move(MKS, 5, 0)
    root.update()
    time.sleep(0.05)
 
root.mainloop()
Simka
rami
MKS — это не сам объект, а его идентификатор.
Большое СПАСИБО! Я понял свою оплошность! Это ошибка из-за моей невнимательности! “1” - это идентификатор, присвоенный IDLE первому созданному программой объекту! Поэтому у меня и двигается не MKS, нарисованная последней, а первая размещенная на “небе” точка - “звездочка”. Буду исправлять.
Заработало. Еще раз спасибо!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB