berckut172
@berckut172
Любитель программировать на python

Почему не соответствуют координаты объекта при его прокрутке на canvas, python?

Доброго времени всем!
Сделал прокрутку объектов на canvas через метод canvas.move() - изменение координат объекта при прокрутке колесиком мышки (canvas1.bind_all("", fun_mooving)). Получилось всё хорошо, все объекты перемещаются как им и положено. Но проблема всплыла, когда добавляю на канвас несколько объектов типа Entry. Если плавно крутить колесо мышки, то заметно небольшое запаздывание при перемещение объектов Entry, при этом другие объекты (тексты, картинки) перемещаются без проблем, как им и положено. Если колесо мышки крутить резко, то перемещение Entry могут сбиваться капитально - не вставать на положенные им координаты. В чем может быть проблема?
5e101d2dade33659799678.png
Код программы ниже:

import tkinter as tk
from tkinter import*

global v_entry

root = tk.Tk()
root.geometry('600x800+10+10')
root.resizable(width=False, height=False)

def xxx():
    global v_entry, list_v
    txt1 = 'txt1txt1txt1txt1txt1txt1txt1'
    v_01 = canvas2.create_text(30, 10, text=txt1, anchor=NW)
    v_entry[0] =Entry(canvas2, bd = 0, justify = CENTER, bg = '#7F7F7F', width = 6)
    (v_entry[0]).insert(0, '000')
    (v_entry[0]).place(x=100, y=25)
    
    txt1 = 'txt2txt2txt2txt2txt2txt2txt2'
    v_02 = canvas2.create_text(30, 50, text=txt1, anchor=NW)
    v_entry[1] =Entry(canvas2, bd = 0, justify = CENTER, bg = '#7F7F7F', width = 6)
    (v_entry[1]).insert(0, '101')
    (v_entry[1]).place(x=100, y=75)
    
    txt1 = 'txt3txt3txt3txt3txt3txt3txt3'
    v_03 = canvas2.create_text(30, 100, text=txt1, anchor=NW)
    v_entry[2] =Entry(canvas2, bd = 0, justify = CENTER, bg = '#7F7F7F', width = 6)
    (v_entry[2]).insert(0, '202')
    (v_entry[2]).place(x=100, y=125)
    
    txt1 = 'txt4txt4txt4txt4txt4txt4txt4'
    v_04 = canvas2.create_text(30, 150, text=txt1, anchor=NW)
    v_entry[3] =Entry(canvas2, bd = 0, justify = CENTER, bg = '#7F7F7F', width = 6)
    (v_entry[3]).insert(0, '303')
    (v_entry[3]).place(x=100, y=175)
    
    txt1 = 'txt5txt5txt5txt5txt5txt5txt5'
    v_05 = canvas2.create_text(30, 200, text=txt1, anchor=NW)
    v_entry[4] =Entry(canvas2, bd = 0, justify = CENTER, bg = '#7F7F7F', width = 6)
    (v_entry[4]).insert(0, '404')
    (v_entry[4]).place(x=100, y=225)
    
    txt1 = 'tx6txt6txt6txt6txt6txt6txt6'
    v_06 = canvas2.create_text(30, 250, text=txt1, anchor=NW)
    v_entry[5] =Entry(canvas2, bd = 0, justify = CENTER, bg = '#7F7F7F', width = 6)
    (v_entry[5]).insert(0, '505')
    (v_entry[5]).place(x=100, y=275)
    
    txt1 = 'tx7txt7tx7txt7txt7txt7txt7'
    v_07 = canvas2.create_text(30, 300, text=txt1, anchor=NW)
    v_entry[6] =Entry(canvas2, bd = 0, justify = CENTER, bg = '#7F7F7F', width = 6)
    (v_entry[6]).insert(0, '606')
    (v_entry[6]).place(x=100, y=325)
    
    txt1 = 'tx8txt8txt8txt8txt8txt8txt8'
    v_08 = canvas2.create_text(30, 350, text=txt1, anchor=NW)
    v_entry[7] =Entry(canvas2, bd = 0, justify = CENTER, bg = '#7F7F7F', width = 6)
    (v_entry[7]).insert(0, '707')
    (v_entry[7]).place(x=100, y=375)
    
    list_v = [v_01, v_02, v_03, v_04, v_05, v_06, v_07, v_08]

def fun_mooving(event):              #прокрутка объектов на canvas2
    global v_entry, list_v
    
    y=int(event.delta/2)
    
    for i1 in list_v:
        canvas2.move(i1, 0, y)
        
        
    for i in v_entry:        
        y1 = i.winfo_y()
        y1 += y        
        i.place(x = 100, y = y1)
        

canvas1 = Canvas(root, width=600, height=800, highlightthickness=0)    #родительский канвас (общий)
canvas1.place(x=0, y=0)#  упаковка общего канваса для всех окон

canvas2 = Canvas(canvas1, width=600, height=750, highlightthickness=0)
canvas2.place(x=0, y=50)

v_entry = []
for i in range (8): 
    v_entry.append(Entry(canvas2, bd = 0, justify = CENTER, width = 6))

xxx()
canvas2.bind_all("<MouseWheel>", fun_mooving)
root.mainloop()
  • Вопрос задан
  • 38 просмотров
Пригласить эксперта
Ответы на вопрос 2
profesor08
@profesor08
Так двигай и все через move, зачем их по отдельности двигать? У тебя там два канваса разной высоты и непонято относительно чего берется y координата winfo_y(), полагают относительно окна, которое больше чем канвас, на котором расположены объекты.
Ответ написан
berckut172
@berckut172 Автор вопроса
Любитель программировать на python
entry через метод canvas.move не передвигается, пробовал - выдает ошибку :
canvas2.move(v_entry[i], 0, y):
i2 = 0
for i1 in list_v:
canvas2.move(i1, 0, y)
canvas2.move(v_entry[i2], 0, y)
i2+=1
(error: недопустимый логический оператор в выражении поиска тегов)
может чего не понимаю?)))
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Cryptopay Санкт-Петербург
от 150 000 ₽
Droice Labs Москва
от 120 000 до 220 000 ₽
25 февр. 2020, в 13:06
2000 руб./за проект
25 февр. 2020, в 12:59
50000 руб./за проект
25 февр. 2020, в 12:51
2000 руб./за проект