tkinter的Text组件有一个方法yview(),可以获取滚动条的位置。通过比较滚动条的位置与1.0(表示在最顶部)和END(表示在最底部)的位置,可以确定是否需要自动滚动。
在你的代码中,self.output_text.see(tk.END)总是使文本框自动滚动到底部,但你可以将其替换为以下代码来实现自动滚动的条件控制:
def scroll_to_bottom_if_needed(self):
# 获取滚动条位置
scrollbar_position = self.output_text.yview()[1]
# 检查滚动条是否在最底部
if scrollbar_position == 1.0:
# 在最底部时,执行自动滚动
self.output_text.see(tk.END)
然后,在需要执行自动滚动的地方,可以调用scroll_to_bottom_if_needed方法来判断是否需要滚动:
def execute_remote_script(self, script_path):
try:
# 执行脚本
stdin, stdout, stderr = self.ssh.exec_command('/bin/bash ' + script_path)
# 读取并显示脚本输出
for line in iter(stdout.readline, ""):
self.output_text.insert(tk.END, line)
self.scroll_to_bottom_if_needed() # 检查是否需要滚动
self.output_text.update_idletasks() # 立即更新界面显示
except Exception as e:
self.output_text.insert(tk.END, f"Error executing remote script: {str(e)}\n")
通过这样的修改,文本框只会在滚动条位于最底部时才自动滚动,否则将保持滚动位置不变。