Предположим, что у меня есть GUI:
import tkinter as tk
root = tk.Tk()
btn = tk.Button(root, text="Press")
btn.pack()
root.mainloop()
См., когда btn
нажата, вызывает свою собственную функцию , которая очень похожа на button_press_handle
в следующем примере:
def button_press_handle(callback=None):
if callback:
callback() # Where exactly the method assigned to btn['command'] is being callled
с:
button_press_handle(btn['command'])
Вы может просто предположить, что параметр command
должен быть установлен как ссылка на метод, который мы хотим назвать, аналогичный callback
в button_press_handle
.
Без аргументов
Итак, если я хотел print
что-то при нажатии кнопки I необходимо установить:
btn['command'] = print # default to print is new line
Обратите внимание на недостаток в ()
с помощью метода print
, который опущен в том смысле, что: " Это имя метода, которое я хочу, чтобы вы вызывали при нажатии, но не вызываете его именно в этот момент ». Однако я не передал никаких аргументов для print
, поэтому он печатал все, что он печатает, когда без аргументов.
W ith Аргумент (ы)
Теперь Если бы я хотел также передать аргументы методу, который я хочу называть при нажатии кнопки, я мог бы использовать анонимные функции, которые могут быть созданы с помощью оператора lambda , в этом случае для встроенного метода print
, например:
btn['command'] = lambda arg1="Hello", arg2=" ", arg3="World!" : print(arg1 + arg2 + arg3)
Без Аргументы
Вы также можете добиться этого с помощью оператора lambda
, но он считается плохим и поэтому я не буду включать его здесь. Хорошей практикой является определение отдельного метода multiple_methods
, который вызывает нужные методы, а затем устанавливает его как ответ на нажатие кнопки:
def multiple_methods():
print("Vicariously") # the first inner callback
print("I") # another inner callback
С Аргумент (s)
Чтобы передать аргумент (ы) методу, который вызывает другие методы, снова используйте инструкцию lambda
, но сначала:
def multiple_methods(*args, **kwargs):
print(args[0]) # the first inner callback
print(kwargs['opt1']) # another inner callback
, а затем установите :
btn['command'] = lambda arg="live", kw="as the" : a_new_method(arg, opt1=kw)
Также обратите внимание, что callback
не может реально return
, потому что он только вызывается внутри button_press_handle
] с callback()
в отличие от return callback()
. Это делает return
, но не вне этой функции. Таким образом, вам лучше изменить объект (ы), которые доступны в текущей области.
Ниже приведен вызов метода, который меняет текст btn
при каждом нажатии кнопки:
import tkinter as tk
i = 0
def text_mod():
global i, btn # btn can be omitted but not sure if should be
txt = ("Vicariously", "I", "live", "as", "the", "whole", "world", "dies")
btn['text'] = txt[i] # the global object that is modified
i = (i + 1) % len(txt) # another global object that gets modified
root = tk.Tk()
btn = tk.Button(root, text="My Button")
btn['command'] = text_mod
btn.pack(fill='both', expand=True)
root.mainloop()
Ltk является довольно популярным, очень портативным, и обоснованно хорошо зарегистрированный через документы Tk. Установка на SBCL так же легка что:
(require :asdf-install)
(asdf-install:install :ltk)
существует также Ячейки-Gtk , который, как сообщают, довольно применим, но может иметь немного более крутую кривую обучения из-за ее уверенности в Ячейках.
РЕДАКТИРОВАНИЕ: Обратите внимание, что ASDF-УСТАНОВКА интегрируется это хорошо с SBCL [только 113]. Установка библиотек из других реализаций Lisp может оказаться более трудной. (Лично, я всегда устанавливаю свои библиотеки из SBCL и затем использую их от всех реализаций.) Извините за любой беспорядок это, возможно, вызвало.
Кроме того, просто нашел библиотеку Smoke привязка QT, названная CommonQt для CL
clg является привязкой GTK для языка Common LISP. Оба завершаются и lispish.
, Если Вы хотите разработать графические интерфейсы в CL, Вы могли бы хотеть смотреть на CLIM также который некоторый стандартный API для графический интерфейсов пользователя. Allegro и LispWorks имеют их собственную реализацию его, и существует бесплатное программное обеспечение один, McCLIM.
LispWorks поставляется с CAPI, он портативный для Mac, Windows и Linux и даже имеет немного GUI-Builder. Он бесплатен для личного использования.