Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 1, 2016 20:12:45

vito-Z80
Зарегистрирован: 2015-09-10
Сообщения: 50
Репутация: +  0  -
Профиль   Отправить e-mail  

Как остановить событие ?

roll_pages=2
current_roll_page=[1]  
def move_right(event):
    if current_roll_page[0]!=roll_pages:
        f=open('db','r')
        lenght=len(f.readlines())
        if (ceil(lenght/20)):
            for j in range(int(con.roll_width/10)):
                for i in range(1,41):
                    roll.update()
                    roll.move(i,-10,0)
                sleep(0.002)
        current_roll_page[0]+=1
        print(current_roll_page[0])
    return current_roll_page[0]
root.bind('<Left>',move_right)

Холст с 20-ю строками (rectangke+text)
сдвигаю страницы:
roll_pages - кол-во страниц
current_roll_page - текущая страница (список) - потому что не знаю как вернуть значение из функции в событии bind по другому.
Жму вправо - 20 строк съезжают влево на ширину холста, все нормально, дальше не двигается так как current_roll_page становиться равно 2.
Но если я вдруг прокликаю несколько раз курсор ВПРАВО, в то время пока строки двигаются, скажем 4 раза, то функция и выполнится 4 раза и current_roll_page будет равен 5, то есть условие if current_roll_page!=roll_pages: в дальнейшем будет для меня бесполезным.

Как, нажав клавишу, запретить повторный нажим её-же по истечении определенного времени (в данном случае на время сдвига страницы 0.002*40) ?
Может есть функция принимающая значение - сколько раз нажата определенная клавиша?

Отредактировано vito-Z80 (Июнь 1, 2016 20:41:20)

Офлайн

#2 Июнь 2, 2016 15:35:51

vito-Z80
Зарегистрирован: 2015-09-10
Сообщения: 50
Репутация: +  0  -
Профиль   Отправить e-mail  

Как остановить событие ?

частенько простые ошибки правятся дольше сложных.
current_roll_page-=1 нужно было поднять выше

Подскажите как правильно обработать событие что бы получить результат из функции посредством return?
root.bind('<Right>',move_right)

пробовал так:
return_value=root.bind('<Right>',move_right) - не то
root.bind('<Right>',return_value=move_right) - не работает
Может использовать lambda, но не могу понять как ее прикрутить.

Отредактировано vito-Z80 (Июнь 2, 2016 15:36:08)

Офлайн

#3 Июнь 2, 2016 19:34:41

4kpt_IV
Зарегистрирован: 2016-01-08
Сообщения: 999
Репутация: +  49  -
Профиль   Отправить e-mail  

Как остановить событие ?

Это же гуй. Здесь событие не должно ничего возвращать. Оно должно просто менять состояние…

Офлайн

#4 Июнь 3, 2016 13:18:55

vito-Z80
Зарегистрирован: 2015-09-10
Сообщения: 50
Репутация: +  0  -
Профиль   Отправить e-mail  

Как остановить событие ?

4kpt_IV
Это же гуй. Здесь событие не должно ничего возвращать. Оно должно просто менять состояние…
Так и надо изменить состояние, но то что надо изменить находится в глобальной области видимости и по этому могу изменить только содержимое списков. Я так понимаю так и должно быть, или есть другой подход.

Тут в первом пункте вроде говорят о нужных вещах, но как разобраться в том что там написано ? Да, книжки читал(электронные, жуть как неудобно), но то-ли я не понимаю что читаю, то-ли полностью узнать интересующие меня вещи можно только в документации, в который нет примеров, которая на английском - и в итоге тоже ничего не понятно.

Офлайн

#5 Июнь 3, 2016 14:17:52

4kpt_IV
Зарегистрирован: 2016-01-08
Сообщения: 999
Репутация: +  49  -
Профиль   Отправить e-mail  

Как остановить событие ?

Пробрасывайте через lambda. Другого посоветовать не могу. Можно еще использовать специальные переменные tkinter типа StrVar, IntVar…

Офлайн

#6 Июнь 3, 2016 15:00:47

vito-Z80
Зарегистрирован: 2015-09-10
Сообщения: 50
Репутация: +  0  -
Профиль   Отправить e-mail  

Как остановить событие ?

4kpt_IV
Пробрасывайте через lambda. Другого посоветовать не могу. Можно еще использовать специальные переменные tkinter типа StrVar, IntVar…
Не могу привинтить к лямбде.
или даже не понимаю как.

Отредактировано vito-Z80 (Июнь 3, 2016 15:01:12)

Офлайн

#7 Июнь 3, 2016 20:45:07

vito-Z80
Зарегистрирован: 2015-09-10
Сообщения: 50
Репутация: +  0  -
Профиль   Отправить e-mail  

Как остановить событие ?

Это хоть отдаленно похоже на класс в том виде в котором его надо использовать?

import tkinter
class MyCanvas(tkinter.Canvas):
    def __init__(self,root,width=10,height=10,bg='black',**kwargs):
        super().__init__(root,width=width,height=height,bg=bg,**kwargs)
class MyBut():
    def __init__(self,my_canvas,x=10,y=10,text='',fill='black',font='arial 10',bg='white'):
        self.my_canvas=my_canvas
        self.text=text
        self.x=x
        self.y=y
        self.bg=bg
        self.font=font
        self.fill=fill
        f_width=font.split(' ')
        f_width=int(f_width[1])
        t_width=len(self.text)
        self.rect_height=f_width*2
        self.rect_width=t_width*f_width-(t_width*2)
        self.text_x=x+(self.rect_width/2)
        self.text_y=y+(self.rect_height/2)
        self.rect_ret=self.rect()
        self.txt_ret=self.txt()
        my_canvas.tag_bind(self.rect_ret,'<ButtonPress-1>',self.clickOn)
        my_canvas.tag_bind(self.txt_ret,'<ButtonPress-1>',self.clickOn)
        my_canvas.tag_bind(self.rect_ret,'<ButtonRelease-1>',self.clickOff)
        my_canvas.tag_bind(self.txt_ret,'<ButtonRelease-1>',self.clickOff)
    def rect(self):
        return my_canvas.create_rectangle(self.x,self.y,self.x+self.rect_width,self.y+self.rect_height,fill=self.bg)
    def txt(self):
        return my_canvas.create_text(self.text_x,self.text_y,text=self.text,font=self.font,anchor='center',fill=self.fill)
    def clickOn(self,event):
        my_canvas.itemconfigure(self.rect_ret,fill=self.fill)
        my_canvas.itemconfigure(self.txt_ret,fill=self.bg)
    def clickOff(self,event):
        my_canvas.itemconfigure(self.rect_ret,fill=self.bg)
        my_canvas.itemconfigure(self.txt_ret,fill=self.fill)
        return my_canvas.itemcget(self.txt_ret,option='text')
if __name__ == '__main__':
    root = tkinter.Tk()
    my_canvas=MyCanvas(root,600,500,bg='green')
    my_rect=MyBut(my_canvas,text='Hello World',fill='seagreen',bg='orange',font='arial 14')
    my_canvas.pack()
    root.mainloop()

А вообще я хотел унаследовать create_rectangle или-же create_text от Canvas, но так и не смог.
Нарисуйте пожалуйста как это унаследовать, желательно с разъяснением, буду очень благодарен.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version