Найти - Пользователи
Полная версия: Присвоение уникальных тегов примитивам в цикле for (canv в tkinter)
Начало » Python для новичков » Присвоение уникальных тегов примитивам в цикле for (canv в tkinter)
1
FrakeStolsTM
Здравствуйте, имеется такие куски кода:
 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? Спасибо
PEHDOM
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()
FrakeStolsTM
PEHDOM
Спасибо большое, действительно об этом я не подумал
FrakeStolsTM
Не стал создавать новую тему, хотелось спросить следующее: Имеется метод 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()





PEHDOM
вот тут …command = self.change(test_var,test_var3)
ты связываешь событие нажатие клавиши с результатом выполнения комманды self.change(test_var,test_var3), а нужно с самой коммандой, для этого можно исппользовать анонимную функцию lambda
…command = lambda: self.change(test_var,test_var3)
Ну или обернуть функцию или использовать partial из functools.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB