Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 14, 2017 14:59:13

FrakeStolsTM
Зарегистрирован: 2017-06-20
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Присвоение уникальных тегов примитивам в цикле for (canv в tkinter)

Здравствуйте, имеется такие куски кода:

 def __init__(self):
    self.canv = Canvas(root,width=800,height=600, bg='white')
    self.canv.pack()
    
    for self.i in range(3): #в цикле for создается 3 квадрата с текстом в виде цифр 1, 2, 3 в каждом
            self.canv.create_rectangle(x,y, x+ 25, y+25)
            self.canv.create_text(x + 18, y + 10, text=(1 + self.i),
                             font="Verdana 12", anchor="e", justify=CENTER, fill="black", tag = "self.i") #присвоение тега
    self.canv.pack()
def clean(self): #метод для удаления цифры 
        self.canv.delete("self.i")

метод clean() привязан на button, в общем логика была такая, в цикле for для каждого text, присвоится уникальный тэг, соответствующий переменной i, но на деле выходит так, что они имеют один и тот же тэг, и все цифры удаляются при нажатии кнопки,а не одна как я предполагал. Посоветуйте как присвоить уникальный тэг каждому text? Спасибо

Отредактировано FrakeStolsTM (Окт. 14, 2017 15:00:12)

Офлайн

#2 Окт. 14, 2017 16:04:24

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Присвоение уникальных тегов примитивам в цикле for (canv в tkinter)

FrakeStolsTM
но на деле выходит так, что они имеют один и тот же тэг
а какой тег они должны иметь? если вы пишете tag = “self.i” то все они и будут иметь тег “self.i”. “self.i” это строка , а отнюдь не ссылка на счетчик. пишите что нить типа tag = ‘text’+str(i), у каждого текста будет уникальный тег.
 from tkinter import *
class Rects:
    def __init__(self, root):
        self.canv = Canvas(root,width=800,height=600, bg='white')
        self.canv.pack()
        b=Button(self.canv, text='clear', width=15, height=2)
        b.place(anchor='se',relx=1, x=-5, rely=1, y=-1)
        b.configure(command=self.clean)
        self.cleared = 1
        for i in range(3): #в цикле for создается 3 квадрата с текстом в виде цифр 1, 2, 3 в каждом
            x=10
            y=i*30+10
            self.canv.create_rectangle(x,y, x+ 25, y+25)
            self.canv.create_text(x + 18, y + 10, text=(1 + i),
                                 font="Verdana 12", anchor="e", justify=CENTER, fill="black", tag = 'text'+str(i+1)) #присвоение тега
    def clean(self): #метод для удаления цифры
        print('deleting ', self.cleared)
        self.canv.delete('text'+str(self.cleared))
        self.cleared += 1
            
root = Tk()
r= Rects(root)
root.mainloop()



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#3 Окт. 14, 2017 21:12:02

FrakeStolsTM
Зарегистрирован: 2017-06-20
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Присвоение уникальных тегов примитивам в цикле for (canv в tkinter)

PEHDOM
Спасибо большое, действительно об этом я не подумал

Офлайн

#4 Окт. 16, 2017 22:13:17

FrakeStolsTM
Зарегистрирован: 2017-06-20
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Присвоение уникальных тегов примитивам в цикле for (canv в tkinter)

Не стал создавать новую тему, хотелось спросить следующее: Имеется метод change с двумя аргументами помимо self, в виджете button я обрабатываю событие нажатия на кнопку, и вызываю данный метод, передавая ему значение двух переменных. В случае, когда я не передаю никаких аргументов, все срабатывает как надо, как только я вношу в метод аргументы происходит сследующее: кнопка не дожидается нажатия на нее, а сразу переходит к выполнению условия. Укажите пожалуйста на ошибку и объясните логику.

 from tkinter import *
class GUI():
    def __init__(self):
        x = 35
        y = 35
        root = Tk()
        self.lol = True # Переменная, для того чтобы понять сосотояние кнопки
        self.canv = Canvas(root, width = 800, height = 600, bg = "white")
        test_var = "one" # АРГУМЕНТЫ КОТОРЫЕ БУДУ ПЕРЕДАВАТЬ
        test_var2 = "two"
        test_var3 = "three"
        self.canv.create_rectangle(x,y,x+15,y+15,  fill = "blue",tag = test_var)
        self.canv.create_rectangle(x+15,y+15, x+30,y, fill="blue", tag= test_var2)
        self.canv.create_rectangle(x+30,y, x+45,y+15, fill="blue", tag= test_var3)
        self.canv.pack()
        # ВОТ ТУТ ПЕРЕДАЮ ДВА АРГУМЕНТА
        self.bttn = Button(root, width = 15, height = 15, bg = "red", command = self.change(test_var,test_var3))
        
        self.bttn.pack()
        root.mainloop()
    def change(self,first,second):
        """Метод, который будет изменять цвет квадратов"""
        if self.lol == True:
            self.canv.itemconfig(first,fill="red")
            self.canv.itemconfig(second, fill="red")
            self.lol = False
        else:
            self.canv.itemconfig(first, fill="blue")
            self.canv.itemconfig(second, fill="blue")
            self.lol = True
var = GUI()





Офлайн

#5 Окт. 16, 2017 23:58:11

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Присвоение уникальных тегов примитивам в цикле for (canv в tkinter)

вот тут …command = self.change(test_var,test_var3)
ты связываешь событие нажатие клавиши с результатом выполнения комманды self.change(test_var,test_var3), а нужно с самой коммандой, для этого можно исппользовать анонимную функцию lambda
…command = lambda: self.change(test_var,test_var3)
Ну или обернуть функцию или использовать partial из functools.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Окт. 17, 2017 00:54:10)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version