user16435384
user16435384

Reputation:

How can I resize terminal window from Python?

I'm trying so hard and pushing myself to my limits, but I just can't figure out how to resize a terminal to my desire. Is there any way that someone can help me solve it? I would like the terminal to be solved with its unique code in different operating systems or you could just try to solve it in one or more lines of code.

#!usr/bin/python
# -*- coding: utf-8 -*-

### Requirements for default python
from __future__ import absolute_import
from __future__ import print_function
from __future__ import generators

### Available for all python sources
from sys import platform
from os import system

class MainModule(object):
    def __init__(self, terminal_name, terminal_x, terminal_y):
        self.terminal_name = terminal_name
        self.terminal_x = terminal_x
        self.terminal_y = terminal_y

        if platform == "linux" or platform == "linux2":
            # Code to resize a terminal for linux distros only
        if platform == "win32" or platform == "win64":
            # Code to resize a terminal for windows only
        if platform == "darwin":
            # Code to resize a terminal for mac only

Upvotes: 0

Views: 3050

Answers (1)

sytech
sytech

Reputation: 40861

As you seem to have discovered, the implementation is platform-specific. You'll have to write code to do this for each platform.

On Windows, there are Windows APIs that can be used to do this. You can leverage Windows APIs directly using the ctypes module. One example of this can be seen in the PyGetWindow package. Other tools like AutoHotkey (via ahk Python package), and PyWinAuto are alternative tools to do this for Windows.

# example using the AHK package on Windows
from ahk import AHK
ahk = AHK()
win = ahk.find_window(title=b'Untitled - Notepad')
win.move(x=200, y=300, width=500, height=800)

On MacOS, you can write an apple script to resize the window and launch osascript from a subprocess.

# Using applescript on MacOS
import subprocess
APPLICATION_NAME = "Safari"
X = 300
Y = 30
WIDTH = 1200
HEIGHT = 900
APPLESCRIPT = f"""\
tell application "{APPLICATION_NAME}"
    set bounds of front window to {X}, {Y}, {WIDTH}, {HEIGHT}
end tell
"""

subprocess.run(['osascript', '-e', APPLESCRIPT], capture_output=True)

For Linux, as Jeff mentions in the comments, the Linux implementation will depend on the window manager used of which there are many. But for popular platforms like Ubuntu, you may rely on existing tools like the wmctrl package or similar packages.

# ref: https://askubuntu.com/a/94866

import subprocess

WINDOW_TITLE = "Terminal"  # or substring of the window you want to resize
x = 0
y = 0
width = 100
height = 100

subprocess.run(["wmctrl", "-r", WINDOW_TITLE, "-e", f"0,{x},{y},{width},{height}"])

Though, if you are writing a game or similar, you can get around this a different way. For example, pygame lets you set your window size or in text-based terminal applications, curses (or a popular wrapper for curses, blessings) can be used to detect terminal size and you can resize your application dynamically, which may take some changing of your current code to do.

height = curses.LINES
width = curses.COLS

redraw(width, height) # you implement this to change how your app writes to the terminal

Upvotes: 1

Related Questions