Установить максимальный размер окна

Как я могу установить максимальный размер окна LTK?

(ql:quickload "ltk")

(defpackage :pub-quiz
  (:use :ltk :cl))

(in-package :pub-quiz)

(defun pub-quiz-window ()
  (with-ltk ()
    (let* ((f (make-instance 'frame :relief :groove :height 500 :width 300))
           (pub (make-instance 'label :master f :text "Pub Quiz"))
           (outtext (make-instance 'text :font "monospaced" :wrap :word))
           (tf (make-instance 'text  :font "monospaced")))
      (pack f)
      (pack pub :side :left)
      (pack outtext :ipady 100)
      (pack tf))))

Если я установлю размер кадра в высоту и ширину, как в приведенном выше примере кода, мое окно wm не будет учитывать эти значения вообще.

Документы Tk имеют это

wm maxsize .window 500 500

но я не знаю, как перевести это в то, что понимает LTK.

1 ответ

Я не использовал LTK, поэтому я не могу утверждать, что это должно быть сделано; Я просто отвечаю на основании того, что я нашел в Интернете. В разделе 3.7 руководства LTK упоминается, что существует maxsize функция:

(maxsize toplevel width height)

Установите максимальный размер окна в пикселях.

призвание (maxsize f 500 500) не работает, хотя Реализация maxsize является:

(defgeneric maxsize (widget x y))
(defmethod maxsize ((w widget) x y)
  (format-wish "wm maxsize ~a ~a ~a" (widget-path w) (tk-number x) (tk-number y))
  w)

Перевод номера работает просто отлично, я думаю (ltk::tk-number 500) => 500, Тем не мение, (widget-path f), для f в вашем коде возвращается .wc не .window, как показывает фрагмент кода TK, который вы опубликовали. Вы можете запустить этот код напрямую с

(format-wish "wm maxsize .window 500 500")

но это тоже вызывает ошибку:

Tcl/Tk error: bad window path name ".window"

Я не уверен, какой путь элемента будет работать для вас в этом случае, но, кажется, как только вы нашли это, maxsize будет делать то, что вам нужно. E сть toplevel класс и вызов maxsize с экземплярами, кажется, работает, поэтому, возможно, вам следует изучить

(let* ((f (make-instance 'toplevel :relief :groove :height 500 :width 300))
       ...)
  ...
  (maxsize f 500 500))

Поэкспериментируя с этим, я могу заставить это работать, хотя этот ярлык "Pub Quiz", похоже, продолжает появляться как отдельное окно…

Я не уверен, что правильно понимаю ваш запрос, но, учитывая заголовок, я полагаю, вы хотите убедиться, что открытое окно не должно выходить за пределы заданного измерения?

Если это так, вам необходимо установить главное окно . который доступен через *tk*:

(defun pub-quiz-window ()
  (maxsize *tk* 300 300)
  (minsize *tk* 300 300)
  (let* ((f (make-instance 'frame :relief :groove :height 50 :width 30))
         (pub (make-instance 'label :master f :text "Pub Quiz"))
         (outtext (make-instance 'text :font "monospaced" :width 10 :height 10))
         (tf (make-instance 'text  :font "monospaced" :height 10 :width 10)))
    (pack f :side :left)
    (pack pub :side :left)
    (pack outtext :side :left)
    (pack tf :side :left)))

(defun create-local-view ()
  (with-ltk ()
    (pub-quiz-window)))
Другие вопросы по тегам