Действительно ли там кто-либо - Высокий уровень, легкий устанавливать библиотеки GUI для языка Common LISP? [закрытый]

Пример GUI:

Предположим, что у меня есть 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.


Вызов метода ( Callback ) Когда кнопка нажата

Без аргументов

Итак, если я хотел 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, но не вне этой функции. Таким образом, вам лучше изменить объект (ы), которые доступны в текущей области.


Полный пример с global Модификация объекта (ов)

Ниже приведен вызов метода, который меняет текст 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()

Зеркало

36
задан Sébastien RoccaSerra 21 September 2008 в 00:15
поделиться

5 ответов

Ltk является довольно популярным, очень портативным, и обоснованно хорошо зарегистрированный через документы Tk. Установка на SBCL так же легка что:

(require :asdf-install)
(asdf-install:install :ltk)

существует также Ячейки-Gtk , который, как сообщают, довольно применим, но может иметь немного более крутую кривую обучения из-за ее уверенности в Ячейках.

РЕДАКТИРОВАНИЕ: Обратите внимание, что ASDF-УСТАНОВКА интегрируется это хорошо с SBCL [только 113]. Установка библиотек из других реализаций Lisp может оказаться более трудной. (Лично, я всегда устанавливаю свои библиотеки из SBCL и затем использую их от всех реализаций.) Извините за любой беспорядок это, возможно, вызвало.

25
ответ дан Matthias Benkard 8 August 2019 в 17:13
поделиться

Кроме того, просто нашел библиотеку Smoke привязка QT, названная CommonQt для CL

5
ответ дан dsm 8 August 2019 в 17:13
поделиться

clg является привязкой GTK для языка Common LISP. Оба завершаются и lispish.

, Если Вы хотите разработать графические интерфейсы в CL, Вы могли бы хотеть смотреть на CLIM также который некоторый стандартный API для графический интерфейсов пользователя. Allegro и LispWorks имеют их собственную реализацию его, и существует бесплатное программное обеспечение один, McCLIM.

7
ответ дан Nowhere man 8 August 2019 в 17:13
поделиться

Также имеется wxCL , обеспечивающий привязки CFFI для wxWidgets .

2
ответ дан 27 November 2019 в 06:12
поделиться

LispWorks поставляется с CAPI, он портативный для Mac, Windows и Linux и даже имеет немного GUI-Builder. Он бесплатен для личного использования.

2
ответ дан 27 November 2019 в 06:12
поделиться
Другие вопросы по тегам:

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