Задать вопрос
@lavagod

Как заставить кнопку вызвать две функции?

Здравствуйте

Полный код:
База данных wdfiles.ru/jb6d
Скрипт wdfiles.ru/jb6e

Я пишу на Python + Tkinter обработку базы данных. Почти полный код проекта вот:

# Подключение библиотек
import sqlite3                              # Подключить SQLite3
from tkinter import *                       # Подключить tkinter
from tkinter.ttk import Combobox            # Подключить раскрывающийся список
from tkinter import scrolledtext            # Подключить скроллируемый текст

# Основные параметры и переменные
root = Tk()                                 # Tk = окно приложения
root.title("База данных")                   # Определить заголовок
root.geometry("800x600")                    # Определить размеры
dbase = sqlite3.connect('users2.db')        # dbase = база данных "users.db"
cursor = dbase.cursor()                     # cursor = курсор базы данных

def return_table_name():
    number = combo.get()                                    # number = выбранная таблица (как в списке)
    if number == 'Пользователи':    table_name = 'table1'   # table_name = table1
    elif number == 'Клиенты':       table_name = 'table2'   # table_name = table2
    elif number == 'Продукты':      table_name = 'table3'   # table_name = table3
    return table_name

def show():
    table_name = return_table_name()                        # table_name = реальное имя выбранной таблицы
    sql = "SELECT * FROM {}".format(table_name)             # sql = взять все из выбранной таблицы
    data = cursor.execute(sql)                              # data = выполнить запрос (sql)
    names = list(map(lambda x: x[0], data.description))     # name = заголовки полей запроса
    temp = " \t\t".join(map(str,names)) + "\n\n"            # temp = заголовок1 \t\t заголовок2 ...
    for i in data:                                          # Пройдем в цикле по запросу
        temp += " \t\t".join(map(str,i)) + "\n"             # temp += одна запись как строка
    txt.delete(1.0, END)                                    # txt = ""
    txt.insert(INSERT, temp)                                # txt = temp

def add_line():
    pass

def del_line():
    table_name = return_table_name()
    del_id = entry1.get()
    sql = "DELETE FROM {} WHERE id={}".format(table_name, del_id)
    cursor.execute(sql)
    dbase.commit()

# Основная программа: верхние элементы управления
combo = Combobox()
combo['values'] = ('Пользователи', 'Клиенты', 'Продукты');  combo.place(x=10, y=10)
show = Button(text="Показать", command=show);               show.place(x=200, y=10)
txt = scrolledtext.ScrolledText(width=100, height=20);      txt.place(x=10, y=50)

# Основная программа: нижние элементы управления
add_line = Button(text="Добавить", command=lambda: (add_line(), show()));  add_line.place(x=10, y=370)

# ======================================================================================================
del_line = Button(text="Удалить", command=lambda: (del_line(), show()));   del_line.place(x=200, y=400)
# ======================================================================================================

entry1 = Entry(); entry1.place(x=10, y=400)
entry2 = Entry(); entry2.place(x=10, y=420)
entry3 = Entry(); entry3.place(x=10, y=440)
entry4 = Entry(); entry4.place(x=10, y=460)

root.mainloop()


При удалении записи по id хочу, чтобы кнопка "Удалить" делала две вещи: 1) вызывала del_line() и 2) вызывала show(). Нашел информацию, что это надо делать через lambda (и раньше работало в прежних проектах), но сейчас выдается ошибка

File "/usr/lib/python3.5/tkinter/__init__.py", line 1553, in __call__
return self.func(*args)
File "users2.py", line 52, in
del_line = Button(text="Удалить", command=lambda: (del_line(), show())); del_line.place(x=200, y=400)
TypeError: 'Button' object is not callable

Что-то не нравится Python в таком вызове. Глючную строку `del_line =... ` я выделил в низу кода. Пробовал без скобок после имен функции = аналогично нет. Куда думать? Что подскажите?
  • Вопрос задан
  • 405 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 1
@JktuJQ
Рискну предположить (не проверял), но ошибка в именах кнопки и функции del_line. При попытке инициализировать кнопку вызывается ошибка Button object is not callable, т.к. интерпретатор пытается вызвать саму кнопку, а не одноименную функцию. Попробуйте поменять название кнопки, или функции, должно помочь
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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