Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 28, 2022 10:47:34

Simka
Зарегистрирован: 2020-02-15
Сообщения: 71
Репутация: +  1  -
Профиль   Отправить e-mail  

Tkinter - не двигается объект

Создаю объект - многоугольник. Он появляется в окне. Затем к программке добавляю фрагмент, чтобы заставить объект перемещаться в окне. И получаю сообщение об ошибке - 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 (“Межпланетная Космическая Станция”). Это мне удобнее, потому что этот фрагмент у меня идет как модуль другой, более обширной программы.
Что подправить в первом варианте? Или не заморачиваться и брать второй?

Отредактировано Simka (Окт. 28, 2022 17:34:47)

Офлайн

#2 Окт. 28, 2022 12:42:00

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

Tkinter - не двигается объект

 MKS= tk.Canvas(root, width=500, height=400, bg='black')
MKS.pack()
MKS.create_polygon



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#3 Окт. 28, 2022 13:43:32

Simka
Зарегистрирован: 2020-02-15
Сообщения: 71
Репутация: +  1  -
Профиль   Отправить e-mail  

Tkinter - не двигается объект

Спасибо за быстрый ответ!
Видимо, я нечетко описал ситуацию и ввел вас в заблуждение. Дело в том, что выше в программе ( Я только часть показал) уже создано окно и на нем размещено несколько изображений, с которыми производятся операции по смене цвета, без перемещения. Далее я создаю дополнительный, движущийся объект 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” создавать?

Отредактировано Simka (Окт. 28, 2022 17:42:49)

Офлайн

#4 Окт. 28, 2022 18:31:31

rami
Зарегистрирован: 2018-01-08
Сообщения: 281
Репутация: +  72  -
Профиль   Отправить e-mail  

Tkinter - не двигается объект

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()

Офлайн

#5 Окт. 28, 2022 19:36:22

Simka
Зарегистрирован: 2020-02-15
Сообщения: 71
Репутация: +  1  -
Профиль   Отправить e-mail  

Tkinter - не двигается объект

rami
MKS — это не сам объект, а его идентификатор.
Большое СПАСИБО! Я понял свою оплошность! Это ошибка из-за моей невнимательности! “1” - это идентификатор, присвоенный IDLE первому созданному программой объекту! Поэтому у меня и двигается не MKS, нарисованная последней, а первая размещенная на “небе” точка - “звездочка”. Буду исправлять.
Заработало. Еще раз спасибо!

Отредактировано Simka (Окт. 28, 2022 19:42:03)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version