Python tk嵌入式xterm的大小如何是动态的?
可以编写一个简单的python脚本,将Python tk嵌入式xterm的大小如何是动态的?,python,tkinter,xterm,Python,Tkinter,Xterm,可以编写一个简单的python脚本,将xterm嵌入到tk框架中: from Tkinter import * import subprocess root = Tk() termf = Frame(root, height=800, width=1000) termf.pack(fill=BOTH, expand=YES) wid = termf.winfo_id() 窗口建立后 proc = subprocess.Popen('xterm -into %d -sb ' % wid,sh
xterm
嵌入到tk
框架中:
from Tkinter import *
import subprocess
root = Tk()
termf = Frame(root, height=800, width=1000)
termf.pack(fill=BOTH, expand=YES)
wid = termf.winfo_id()
窗口建立后
proc = subprocess.Popen('xterm -into %d -sb ' % wid,shell=True)
root.mainloop()
在我的电脑上看起来像
如何使嵌入的xterm动态调整为termf
帧的大小,即使在调整帧大小时(通过拖动角点)
对@tinmarino回答的回应
正如上面评论中所指出的,您可以在
Tk()
窗口上使用.bind()
,以便在每次配置窗口时获得回调
from tkinter import *
root = Tk()
def callback(event):
print(event.width, event.height)
root.bind("<Configure>", callback)
root.mainloop()
从tkinter导入*
root=Tk()
def回调(事件):
打印(事件宽度、事件高度)
root.bind(“,回调)
root.mainloop()
我没有能力测试如何使用它在Windows10上调整xterm窗口的大小。因此,我将把这个答案留给任何想编辑它或使用这个答案来构建自己的答案的人。
执行。3项职能:
将tkinter作为tk导入
将子进程作为sp导入
从重新导入匹配
从线程导入线程
从队列导入队列
def main():
#初始化
root=tk.tk()
队列=队列()
#包装主机架
termf=tk.框架(根部,宽度=800,高度=800)
termf.pack(填充=tk.BOTH,扩展=tk.YES,padx=0,pady=0)
wid=termf.winfo_id()
#允许调整窗口大小
sp.Popen(““echo”*VT100.allowindowops:true”| xrdb-merge”“,shell=true)
#工艺指挥部
cmd=(
#创造我
f'xterm-到{wid}-几何体100x50'
#登录到标准输出
r'-sb-l-lc-lf/dev/stdout'
#启动`ps`命令:输出,tty,=用于删除标头
“-e/bin/bash-c”ps-o tt=;bash”
r'| tee'
)
打印('启动:',cmd)
#繁殖Xterm
进程=sp.Popen(
cmd,shell=True,stdout=sp.PIPE,stderr=sp.PIPE)
打印('Xterm pid:',process.pid)
#获取pts
线程=线程(目标=lambda:get\u xterm\u pts(termf、进程、队列))
thread.start()
#设置大小回调
bind(“,lambda事件:on_resize(事件,队列))
#开始
root.mainloop()
def on_resize(事件、队列):
“”“调整大小时:将转义序列发送到pts”“”
#魔术&检查
魔法x,魔法y=6.1,13
打印('Resize(w,h):',event.width,event.height)
如果不是queue.queue:返回
#算计
宽度=int(event.width/magic_x)
高度=整数(event.height/magic_y)
打印(‘到(林,柱):’,高度,宽度)
ctl=f“\u001b[8;{height};{width}t”
#发送给临时秘书处
将open(queue.queue[0],“w”)作为f:
f、 写入(ctl)
def get_xterm_pts(父级、进程、队列):
“”“检索pts(`process`)->`queue`”“”
尽管如此:
out=process.stdout.readline().decode()
打印('Xterm out'+输出)
match_pts=match(r'pts/\d+',out)
如果匹配,则:
pts='/dev/'+match_pts.group(0)
打印('----------->pts:',pts)
队列.放置(pts)
打破
如果out==b'',并且process.poll()不是None:
打破
#立即调整大小
假事件=tk.event()
fake_event.width=parent.winfo_width()
fake_event.height=parent.winfo_height()
调整大小(假事件、队列)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()
在一个新线程中搜索新shell的pts似乎很多,但我们想要的是交互式shell的pts,而不是产生它的sh
。我实际上用一些Popen-p尝试了pip->pts,但弹性较差
11844 pts/1 00:00:00 sh <- pid returned to Popen
11847 pts/1 00:00:00 xterm <- then ...
11848 pts/1 00:00:00 tee <- that is how a pipe work, first plug, then spawn (apparently) (seems logical)
11854 pts/35 00:00:00 bash <- then favorite shell is Michel
11844 pts/1 00:00:00 sh询问根目录的大小,并将这些大小与调整一起用作Frame()的参数?我编辑了我的问题,以反映虽然我可以实例化xterm到框架的正确大小,正如您所建议的@wallyk,但我想知道如何在通过拖动其角来调整框架大小时继续使其达到框架的大小。您需要使用事件绑定来不断更新大小。虽然不像我所希望的那样是动态的,但xt可以在xterm本身中使用诸如echo-e'\e[4;600;800t'
之类的命令来调整erm的大小。请参阅窗口操作。我了解如何编写回调。该回调如何与打开的xterm通信?回调会给出小部件的大小。当然,您可以使用它来更改xterm的大小?谢谢,这很有帮助(特别是从Windows计算机上的某个人那里,你无论如何都不会正确地理解它)!我不会编辑它,因为我的工作代码较长(转义序列、同步、打印)。将fake\u event=Namespace()
替换为fake\u event=tk.event()
不完全正确。我的窗口仍然没有以正确的大小开始,因此无法正确调整大小(尽管它得到了调整大小命令,这是一个好的开始)。我将在原始问题中添加一张图片,因为这里似乎不可能粘贴它。它是否以某种方式调整大小(即xterm大小正在更改)?我放了一些魔法magic\u x,magic\u y=6.1,13
。在你的情况下,你必须像这样增加:magic\u x,magic\u y=7,15
你可以改变。也许应该在开始时放。谢谢你的反馈。