如何设置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所理解的内容。
答案 0 :(得分:1)
我没有使用过LTK,所以我无法对如何假设做出怎样的声明;我只是根据我在网上找到的内容回答。 LTK manual在第3.7节中提到有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
就会做你需要的。有一个toplevel
类,调用maxsize
的实例似乎有效,所以也许你应该探索
(let* ((f (make-instance 'toplevel :relief :groove :height 500 :width 300))
...)
...
(maxsize f 500 500))
玩弄它,我可以那种让它起作用,虽然“Pub Quiz”标签似乎一直显示为一个单独的窗口......
答案 1 :(得分:0)
我不确定我是否正确理解了您的查询,但是给定标题后,我假设您想确保打开的窗口一定不能超出给定的尺寸?
如果是这样,则必须设置主窗口.
,可通过*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)))