Форум сайта python.su
0
Здравствуйте, имеется такие куски кода:
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")
Отредактировано FrakeStolsTM (Окт. 14, 2017 15:00:12)
Офлайн
294
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]
Офлайн
0
PEHDOMСпасибо большое, действительно об этом я не подумал
Офлайн
0
Не стал создавать новую тему, хотелось спросить следующее: Имеется метод 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()
Офлайн
294
вот тут …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)
Офлайн