Как сохранить содержимое tkinter Canvas как изображение? [Дубликат]

Чувство моей кишки подкрепляется количеством ответов на эту тему - что существует практически бесконечное количество решений этой проблемы, ни одна из которых не будет элегантной.

Честно говоря, я бы рекомендуем не пытаться проверять номера телефонов. Даже если вы могли бы написать большой волосатый валидатор, который позволил бы использовать все различные законные форматы, он в конечном итоге разрешил бы практически все, даже отдаленно напоминающее номер телефона.

По моему мнению, самым элегантным решением является проверка минимальной длины, не более того.

8
задан nbro 22 March 2015 в 17:19
поделиться

3 ответа

def f(event):
    caller = event.widget
11
ответ дан cag 20 August 2018 в 23:43
поделиться

У вас есть пара вариантов. Один из способов - получить доступ к атрибуту widget объекта события. Другой способ - передать ссылку на объект в вашу функцию. Вот пример, который использует один из них.

import Tkinter as tk

def OnClickA(event):
    print "you clicked on", event.widget
    event.widget.config(text="Thank you!")


def OnClickB(event, obj):
    print "you clicked on", obj
    obj.config(text="Thank you!")

root = tk.Tk()
l1 = tk.Label(root, text="Click me")
l2 = tk.Label(root, text="No, click me!")
l1.pack()
l2.pack()

l1.bind("<1>", OnClickA)
l2.bind("<1>", lambda event, obj=l2: OnClickB(event, obj))

root.mainloop()
8
ответ дан Bryan Oakley 20 August 2018 в 23:43
поделиться

Похоже, все ваши виджеты делят обработчик событий. Этот отрывок из Tkinter 8.4 Reference Джона У. Шипмана - NM Tech может помочь.

30.7. Дополнительный аргумент trick

Иногда вам нужно передать другие аргументы обработчику, кроме события.

Вот пример. Предположим, что ваше приложение имеет массив из десяти контрольных кнопок, чьи виджеты хранятся в списке self.cbList, индексируются номером контрольной кнопки в range(10).

Предположим, что вы хотите написать один обработчик с именем .__cbHandler для событий <Button-1> во всех десяти из этих контрольных кнопок. Обработчик может получить фактический виджет Checkbutton, который вызвал его, обратившись к атрибуту .widget объекта Event, который передается, но как он узнает, что индекс контрольной кнопки в self.cbList?

Было бы неплохо написать наш обработчик с дополнительным аргументом для номера контрольной кнопки, что-то вроде этого:

    def __cbHandler ( self, event, cbNumber ):

Но обработчики событий передаются только одному аргументу - событию. Таким образом, мы не можем использовать вышеприведенную функцию из-за несоответствия количества аргументов.

К счастью, способность Python предоставлять значения по умолчанию для аргументов функции дает нам выход. Посмотрите на этот код:

    def __createWidgets ( self ):
        ?
        self.cbList = [] # Create the checkbutton list
        for i in range(10):
            cb = Checkbutton ( self, ? )
            self.cbList.append ( cb )
            cb.grid( row=1, column=i )
            def handler ( event, self=self, i=i ): # [1]
                return self.__cbHandler ( event, i )
            cb.bind ( "<Button-1>", handler )
        ?
    def __cbHandler ( self, event, cbNumber ):
        ?

# [1] Эти строки определяют новую функцию handler, которая ожидает три аргумента. Первый аргумент - это объект Event, переданный всем обработчикам событий, а второй и третий аргументы будут установлены в их значения по умолчанию - дополнительные аргументы, которые нам нужно передать.

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

Несколько более краткий способ сделать это, поскольку Брайан Оукли делает для второй кнопки в свой ответ , является для определения каждой функции обработчика в строке с помощью лямбда, т. е.

def __createWidgets ( self ):
    ?
    self.cbList = [] # Create the checkbutton list
    for i in range(10):
        cb = Checkbutton ( self, ? )
        self.cbList.append ( cb )
        cb.grid( row=1, column=i )
        cb.bind ( "<Button-1>", lambda event, self=self, i=i:
                                    self.__cbHandler( event, i ) )
    ?
def __cbHandler ( self, event, cbNumber ):
    ?
2
ответ дан Community 20 August 2018 в 23:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: