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()
  • Вопрос задан
  • 166 просмотров
Пригласить эксперта
Ответы на вопрос 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: недопустимый логический оператор в выражении поиска тегов)
может чего не понимаю?)))
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы