New Self New Life
No Result
View All Result
  • Home
  • Entertainment
  • Celebrity
  • Cinema
  • Music
  • Digital Lifestyle
  • Social Media
  • Softwares
  • Devices
  • Home
  • Entertainment
  • Celebrity
  • Cinema
  • Music
  • Digital Lifestyle
  • Social Media
  • Softwares
  • Devices
New Self New Life
No Result
View All Result
Home Softwares

How to Create a Python curses-enabled Application

by admin
3 years ago
in Softwares
Python: How to Use Tkinter’s Grid Manager
Share on FacebookShare on Twitter


Within the first a part of this programming tutorial sequence, we realized the right way to set up and setup the Python curses module, which is expounded to the C ncurses library. In the present day, we are going to proceed that dialogue as we create our first “Howdy, World” instance utilizing the curses library.

In the event you missed the primary a part of this sequence, you’ll be able to learn it right here: Python curses: Drawing with Textual content.

Making a Howdy, World! Utility with Python curses

With the entire formalities concluded, it’s now time to create a easy program that may exhibit fundamental ncurses performance by way of a Python curses-enabled program. The code beneath will write a customary “Howdy, world!” message to the terminal:

# demo-ncurses-hello-world.py

import curses
import sys

def fundamental(argv):
  # BEGIN ncurses startup/initialization...
  # Initialize the curses object.
  stdscr = curses.initscr()

  # Don't echo keys again to the shopper.
  curses.noecho()

  # Non-blocking or cbreak mode... don't await Enter key to be pressed.
  curses.cbreak()

  # Flip off blinking cursor
  curses.curs_set(False)

  # Allow colour if we will...
  if curses.has_colors():
    curses.start_color()

  # Optionally available - Allow the keypad. This additionally decodes multi-byte key sequences
  # stdscr.keypad(True)

  # END ncurses startup/initialization...

  caughtExceptions = ""
  strive:
    # Coordinates begin from high left, within the format of y, x.
    stdscr.addstr(0, 0, "Howdy, world!")
    screenDetailText = "This display screen is [" + str(curses.LINES) + "] excessive and [" + str(curses.COLS) + "] throughout."
    startingXPos = int ( (curses.COLS - len(screenDetailText))/2 )
    stdscr.addstr(3, startingXPos, screenDetailText)
    stdscr.addstr(5, curses.COLS - len("Press a key to stop."), "Press a key to stop.")

    # Really attracts the textual content above to the positions specified.
    stdscr.refresh()

    # Grabs a price from the keyboard with out Enter having to be pressed (see cbreak above)
    stdscr.getch()
  besides Exception as err:
   # Simply printing from right here is not going to work, as this system remains to be set to
   # use ncurses.
   # print ("Some error [" + str(err) + "] occurred.")
   caughtExceptions = str(err)

  # BEGIN ncurses shutdown/deinitialization...
  # Flip off cbreak mode...
  curses.nocbreak()

  # Flip echo again on.
  curses.echo()

  # Restore cursor blinking.
  curses.curs_set(True)

  # Flip off the keypad...
  # stdscr.keypad(False)

  # Restore Terminal to unique state.
  curses.endwin()

  # END ncurses shutdown/deinitialization...

  # Show Errors if any occurred:
  if "" != caughtExceptions:
   print ("Obtained error(s) [" + caughtExceptions + "]")

if __name__ == "__main__":
  fundamental(sys.argv[1:])


The primary line in fundamental, stdscr = curses.initscr(), exhibits that the curses treats the display screen as a curses window object that occurs to cowl the complete display screen. All the different features that write textual content to the display screen are members of the curses object. Nonetheless, stdscr = curses.initscr() goes additional by initializing the ncurses module in order that it may do its work on the terminal.

Textual content Positioning with curses in Python

The code above makes use of ncurses’ positioning grid to position the textual content on the display screen. ncurses makes use of a zero-indexed grid system, represented by X and Y values, to place components on the display screen:

Python ncurses text positioning

The 2 values, curses.COLS and curses.LINES seek advice from the utmost variety of columns within the terminal and the utmost variety of strains within the terminal, respectively.

The “Howdy, World!” program above makes use of three totally different coordinate positions within the terminal to be able to show textual content. The primary place, 0, 0, merely writes “Howdy, World!” to the top-left nook of the terminal. Whereas ncurses, normally, may be very delicate to writing textual content exterior of its containing window, the code makes the belief that the terminal is extensive sufficient to accommodate the textual content. Bear in mind that operating the “Howdy, World!” program above with a really slim house (lower than the size of “Howdy, World!”) will trigger an exception.

The second place, which is calculated primarily based on the width of a string, is an approximation of the middle of the terminal on a hard and fast line. Be aware that, not like a really graphical program, the place is all the time going to be both 1 over, 1 much less, or precisely on the width of the terminal. This variance is as a result of the terminal width have to be an integer, as cursor positions can’t be fractional. The code even casts the results of the calculation to an integer for this very motive.

The third place right-justifies the textual content literal with the directions to press a (any) key to stop. As with the second place, the beginning X coordinate is calculated relative to the curses.COLS, besides that there isn’t a division by 2.

Be aware: the exception messages returned by the Python curses module as a result of incorrect sizing of strings, home windows, or different objects typically make no point out of a dimension drawback. One option to mitigate that is to examine all of those calculations earlier than passing any values into any curses object, and, if the mathematics doesn’t enable for a match, then prematurely elevate an exception with an appropriate error message.

Learn: High On-line Programs to Study Python Programming

How you can Draw or Place Textual content with Python curses

Because the remark above the stdscr.refresh() code signifies, that is the place all of the textual content is definitely drawn to the display screen. This means that, ought to alternate textual content should be positioned at a location through which textual content already exists, then one other name to stdscr.refresh() is important. If the textual content that replaces current textual content isn’t lengthy sufficient to utterly cowl the prevailing textual content, then areas will should be appended to the brand new textual content to be able to cowl up the prevailing textual content. Calls to stdscr.addstr(…) usually don’t overwrite current textual content.

Person Enter and Python curses

The stdscr.getch() code works in tandem with the curses.cbreak(), curses.curs_set(False), and curses.noecho() calls above it. With out curses.cbreak(), it might be essential to press Enter after urgent another key. For this instance, that will not be the specified operation. With out curses.noecho(), the worth of no matter key was pressed could be echoed again to the terminal. That echoing would have the potential to undesirably change the textual content on the display screen. Lastly, with out curses.curs_set(False), the blinking cursor would nonetheless be displayed on the display screen, and this will probably confuse customers in functions with extra advanced interfaces.

Home windows and Python curses

As 99% of the “promoting level” of ncurses is the flexibility to show home windows in a text-based terminal interface it begs the purpose of really creating some. And, why not make this a bit of extra fascinating by including some colours to the output too?

The code beneath makes additional use of the Python curses.window object, together with the colours outlined within the curses module to create three randomly generated home windows on the terminal. Now, a extra seasoned developer would possibly name out the “non-usage” of object-oriented code right here, as this code could be an excellent use case for that, however for the needs of an introductory demonstration, it’s simpler to focus extra on the curses objects themselves, versus how Python calls them, even when it makes for longer code:

# demo-3-windows2.py

# Makes use of the curses library to create 3 randomly sized home windows with totally different colour
# backgrounds on the display screen.

# Be aware that this isn't probably the most environment friendly option to code this, however I wish to get away
# the person objects in order that it's simpler to hint what's going on.

import curses
import math
import random
import sys

# A set of layouts, to be randomly chosen.
layouts = ['2 top, 1 bottom', '2 left, 1 right', '1 top, 2 bottom', '1 left, 2 right']

def fundamental (argv):
  # Initialize the curses object.
  stdscr = curses.initscr()

  # Don't echo keys again to the shopper.
  curses.noecho()

  # Non-blocking or cbreak mode... don't await Enter key to be pressed.
  curses.cbreak()

  # Flip off blinking cursor
  curses.curs_set(False)

  # Allow colour if we will...
  if curses.has_colors():
    curses.start_color()

  # Optionally available - Allow the keypad. This additionally decodes multi-byte key sequences
  # stdscr.keypad(True)

  # Starting of Program... 
  # Create an inventory of all the colours aside from black and white. These will server as 
  # the background colours for the home windows. As a result of these constants are outlined in 
  # ncurses,
  # we won't create the record till after the curses.initscr name:
  bgColors = [curses.COLOR_BLUE, curses.COLOR_CYAN, curses.COLOR_GREEN, 
   curses.COLOR_MAGENTA, curses.COLOR_RED, curses.COLOR_YELLOW]
  colours = random.pattern(bgColors, 3)

  # Create 3 ncurses colour pair objects.
  curses.init_pair(1, curses.COLOR_WHITE, colours[0])
  curses.init_pair(2, curses.COLOR_WHITE, colours[1])
  curses.init_pair(3, curses.COLOR_WHITE, colours[2])

  caughtExceptions = ""
  strive:
   # Be aware that print statements don't work when utilizing ncurses. If you wish to write
   # to the terminal exterior of a window, use the stdscr.addstr methodology and specify
   # the place the textual content will go. Then use the stdscr.refresh methodology to refresh the 
   # show.
   #stdscr.addstr(0, 0, "Gonna make some home windows.")
   #stdscr.refresh()

   # The lists beneath will finally maintain 4 values, the X and Y coordinates of the 
   # top-left nook relative to the display screen itself, and the variety of characters
   # going proper and down, respectively.
   window1 = []
   window2 = []
   window3 = []

   # The variables beneath will finally include the window objects.
   window1Obj = ""
   window2Obj = ""
   window3Obj = ""

   # The variables beneath will correspond roughly to the X, Y coordinates of the 
   # of every window.
   window1 = []
   window2 = []
   window3 = []

   # There's going to be a caption on the backside left of the display screen, however it must
   # go within the correct window.
   window1Caption = ""
   window2Caption = ""
   window3Caption = ""


   # The randomly sized home windows that do not take up one aspect of the display screen should not 
   # be lower than 1/3 the display screen dimension, or multiple third of the display screen dimension on 
   # both edge.
   minWindowWidth = math.flooring(curses.COLS * 1.0/3.0)
   maxWindowWidth = math.flooring(curses.COLS * 2.0/3.0)
   minWindowHeight = math.flooring(curses.LINES * 1.0/3.0)
   maxWindowHeight = math.flooring(curses.LINES * 2.0/3.0)
   # Decide a structure. The random.randrange command will return a price between 0 and three.
   chosenLayout = layouts[random.randrange(0,4)]
   if '2 high, 1 backside' == chosenLayout:
    # Home windows 1 and a couple of would be the high, Window 3 would be the backside.
    window1Width = random.randrange(minWindowWidth, maxWindowWidth)
    window1Height = random.randrange(minWindowHeight, maxWindowHeight)
    window1 = [0, 0, window1Width, window1Height]

    window2Width = curses.COLS - window1Width
    window2Height = window1Height
    window2 = [window1Width, 0, window2Width, window2Height]

    window3 = [0, window1Height, curses.COLS, curses.LINES - window1Height]
    window3Caption = chosenLayout + " - Press a key to stop."

   elif '2 left, 1 proper' == chosenLayout:
    # Home windows 1 and a couple of shall be on the left, Window 3 shall be on the fitting.
    window1Width = random.randrange(minWindowWidth, maxWindowWidth)
    window1Height = random.randrange(minWindowHeight, maxWindowHeight)
    window1 = [0, 0, window1Width, window1Height]

    window2Width = window1Width
    window2Height = curses.LINES - window1Height
    window2 = [0, window1Height, window2Width, window2Height]
    window2Caption = chosenLayout + " - Press a key to stop."

    window3Width = curses.COLS - window1Width
    window3Height = curses.LINES
    window3 = [window1Width, 0, window3Width, window3Height]

   elif '1 high, 2 backside' == chosenLayout:
    # Window 1 shall be on the highest, Home windows 2 and three shall be on the underside.
    window1Width = curses.COLS
    window1Height = random.randrange(minWindowHeight, maxWindowHeight)
    window1 = [0, 0, window1Width, window1Height]

    window2Width = random.randrange(minWindowWidth, maxWindowWidth)
    window2Height = curses.LINES - window1Height
    window2 = [0, window1Height, window2Width, window2Height]
    window2Caption = chosenLayout + " - Press a key to stop."

    window3Width = curses.COLS - window2Width
    window3Height = window2Height
    window3 = [window2Width, window1Height, window3Width, window3Height]

   elif '1 left, 2 proper' == chosenLayout:
    # Window 1 shall be on the left, Home windows 2 and three shall be on the fitting.
    window1Width = random.randrange(minWindowWidth, maxWindowWidth)
    window1Height = curses.LINES
    window1 = [0, 0, window1Width, window1Height]
    window1Caption = chosenLayout + " - Press a key to stop."

    window2Width = curses.COLS - window1Width
    window2Height = random.randrange(minWindowHeight, maxWindowHeight)
    window2 = [window1Width, 0, window2Width, window2Height]

    window3Width = window2Width
    window3Height = curses.LINES - window2Height
    window3 = [window1Width, window2Height, window3Width, window3Height]

   # Create and refresh every window. Put the caption 2 strains up from backside
   # in case it wraps. Placing it on the final line with no room to wrap (if
   # the window is just too slim for the textual content) will trigger an exception.

   window1Obj = curses.newwin(window1[3], window1[2], window1[1], window1[0])
   window1Obj.bkgd(' ', curses.color_pair(1))
   # Calculate tough middle...
   window1Center = [math.floor(window1[2]/2.0), math.flooring(window1[3]/2.0)]
   # Add the string to the middle, with BOLD flavoring.
   window1Obj.addstr(window1Center[1], window1Center[0] - 4, "Window 1", 
    curses.color_pair(1) | curses.A_BOLD)
   if "" != window1Caption:
    window1Obj.addstr(curses.LINES - 2, 0, window1Caption, 
     curses.color_pair(1) | curses.A_BOLD)
   window1Obj.refresh()

   window2Obj = curses.newwin(window2[3], window2[2], window2[1], window2[0])
   window2Obj.bkgd(' ', curses.color_pair(2))
   # Calculate tough middle...
   window2Center = [math.floor(window2[2]/2.0), math.flooring(window2[3]/2.0)]
   # Add the string to the middle, with BOLD flavoring.
   window2Obj.addstr(window2Center[1], window2Center[0] - 4, "Window 2", 
    curses.color_pair(2) | curses.A_BOLD)
   if "" != window2Caption:
    # The "Y coordinate" right here is the underside of the *window* and never the display screen.
    window2Obj.addstr(window2[3] - 2, 0, window2Caption, 
     curses.color_pair(2) | curses.A_BOLD)
   window2Obj.refresh()

   window3Obj = curses.newwin(window3[3], window3[2], window3[1], window3[0])
   window3Obj.bkgd(' ', curses.color_pair(3))
   # Calculate tough middle...
   window3Center = [math.floor(window3[2]/2.0), math.flooring(window3[3]/2.0)]
   # Add the string to the middle, with BOLD flavoring.
   window3Obj.addstr(window3Center[1], window3Center[0] - 4, "Window 3", 
    curses.color_pair(3) | curses.A_BOLD)
   if "" != window3Caption:
    # The "Y coordinate" right here is the underside of the *window* and never the display screen.
    window3Obj.addstr(window3[3] - 2, 0, window3Caption, 
     curses.color_pair(3) | curses.A_BOLD)
   window3Obj.refresh()

   # Mandatory so we will "pause" on the window output earlier than quitting.
   window3Obj.getch()

   # Debugging output.
   #stdscr.addstr(0, 0, "Chosen structure is [" + chosenLayout + "]")
   #stdscr.addstr(1, 10, "Window 1 params are [" + str (window1)+ "]")
   #stdscr.addstr(2, 10, "Window 2 params are [" + str(window2) + "]")
   #stdscr.addstr(3, 10, "Window 3 params are [" + str(window3)+ "]")
   #stdscr.addstr(4, 10, "Colours are [" + str(colors) + "]")
   #stdscr.addstr(5, 0, "Press a key to proceed.")
   #stdscr.refresh()
   #stdscr.getch()
  besides Exception as err:
   caughtExceptions = str(err)

  # Finish of Program...
  # Flip off cbreak mode...
  curses.nocbreak()

  # Flip echo again on.
  curses.echo()

  # Restore cursor blinking.
  curses.curs_set(True)

  # Flip off the keypad...
  # stdscr.keypad(False)

  # Restore Terminal to unique state.
  curses.endwin()

  # Show Errors if any occurred:
  if "" != caughtExceptions:
   print ("Obtained error(s) [" + caughtExceptions + "]")
  return 0

if __name__ == "__main__":
  fundamental(sys.argv[1:])

The colour constants, together with the formatting constants for the bolded textual content, are all outlined at curses — Terminal dealing with for character-cell shows — Python 3.10.5 documentation.

There are 4 attainable forms of outputs to this program, as indicated by the layouts record on the high of the code:

Learn: The High On-line Programs to Study Linux

The Window Object

Every window within the output above is represented by a definite instantiation of the curses window object. The window object is returned by every name to curses.newwin(…) perform. Be aware that, whereas every of the three home windows above is instantiated by way of the curses.newwin(…) perform, this perform by itself doesn’t initialize the ncurses module (nor do they de-initialize the identical for return to the immediate). That also needs to be accomplished with curses.initscr(), though the stdscr window object returned by this name isn’t going for use on this code.

The curses.newwin(…) perform has two overloads, the second of which is getting used because it permits for the position of the top-left nook anyplace on the display screen, along with specifying the dimensions of the window:

curses.newwin(number-of-lines, number-of-columns, starting-column-position, starting-row-position)

All 4 parameters are non-negative integers.

The primary two values number-of-lines and number-of-columns are calculated as “random” integers that vary in between ⅓ and ⅔ the peak and width of the terminal window, respectively.

On this explicit instance, no matter what the worth of one of many randomly chosen layouts is, the primary window is all the time the one which occupies the top-left nook of the terminal. The opposite two home windows’ sizes and positions are calculated relative to the primary window.

Textual content Inside Home windows

Any textual content that’s positioned inside a window created utilizing the curses.newwin(…) perform should absolutely match throughout the window. Any textual content that ends exterior of the bounds of the window will trigger an exception to be raised. The code above creates a caption that’s positioned in no matter window finally ends up occupying the bottom-left nook of the display screen. Relying on what width is calculated for the dimensions of this window, it’s attainable that the size of the caption might exceed the width of the window. If this isn’t accounted for, an exception shall be raised.

Within the above code instance, it may be seen that the caption isn’t on the bottom-most line. It is because this explicit implementation of curses will wrap the textual content to the subsequent line ought to it overshoot the sting of the window, as proven beneath:

Python curses tutorial

For this explicit instance, the terminal window was shrunk down considerably.

Nonetheless, if there isn’t a additional line to which the rest of the textual content might be wrapped, an exception shall be raised. Be aware: this line-wrapping conduct might not be constant throughout all implementations of ncurses. In a manufacturing atmosphere, additional code ought to be used to separate the road into separate calls to window.addstr(…).

Shade Pairs

The Python curses module offers with colours in pairs. Every Python color_pair object comprises a foreground textual content colour and a background colour. The rationale for it’s because for any textual content that’s drawn to the display screen, a foreground and background colour have to be specified, and for the sake of a “good look,” the background colour of any textual content drawn or positioned in a window ought to match the background colour of the window.

It could be famous that the examples earlier to this itemizing presumed that the foreground textual content colour was white and the background colour was black. Relying on the terminal, and the way meticulous a programmer could also be, this might not be a smart presumption.

Ultimate Ideas on Drawing Textual content with Python curses

That’s it for half two of this three-part programming tutorial sequence discussing the right way to work with the Python curses library to attract textual content in Linux. We’ll wrap up the ultimate half on this sequence in our remaining piece. Examine again right here for the hyperlink as soon as it’s printed!



Source link

Tags: ApplicationCreatecursesenabledPython
Previous Post

A Look at the Top Costume Themes and Trends for Halloween 2022

Next Post

Twitter Tests New Tweet View Count Display to Better Highlight Content Reach

Related Posts

User Guide For UnoPim PDF Generator
Softwares

User Guide For UnoPim PDF Generator

by admin
May 31, 2025
Infragistics Ultimate 25.1 includes updates across several of its UI toolkit components
Softwares

Infragistics Ultimate 25.1 includes updates across several of its UI toolkit components

by admin
May 29, 2025
Qt bridges the language barrier gap
Softwares

Qt bridges the language barrier gap

by admin
May 28, 2025
Find the Best Rust Software Developers for Your Project
Softwares

Find the Best Rust Software Developers for Your Project

by admin
May 26, 2025
Verification framework uncovers safety lapses in open-source self-driving system
Softwares

Verification framework uncovers safety lapses in open-source self-driving system

by admin
May 23, 2025
Next Post
Elon Musk Raises More Questions About Twitter’s Approach, Which Could Lead to a Big Shake-Up

Twitter Tests New Tweet View Count Display to Better Highlight Content Reach

Lizzo Played James Madison’s Flute

Lizzo Played James Madison's Flute

  • Trending
  • Comments
  • Latest
Anant Ambani wedding: Celebs, wealthy elite attend lavish billionaire festivities – National

Anant Ambani wedding: Celebs, wealthy elite attend lavish billionaire festivities – National

March 1, 2024
10 really good gadgets that cost less than $100 – TechCrunch

10 really good gadgets that cost less than $100 – TechCrunch

December 17, 2021
Every Kathryn Hahn Film Performance, Ranked

Every Kathryn Hahn Film Performance, Ranked

December 24, 2022
Best Coding Practices For Rest API Design

Django Form | Data Types and Fields

June 9, 2023
Advancement in predicting software vulnerabilities

Advancement in predicting software vulnerabilities

May 21, 2022
Most Useful Gadgets in 2021 – Nogentech.org

Most Useful Gadgets in 2021 – Nogentech.org

July 29, 2021
Deployment Diagrams Explained in Detail, With Examples

Deployment Diagrams Explained in Detail, With Examples

August 11, 2021
The 8 Most Underrated Mayhem Festival Bands, Year by Year

The 8 Most Underrated Mayhem Festival Bands, Year by Year

May 19, 2021
‘The Black Phone 2’ Dials In Some Ominous Teasers

‘The Black Phone 2’ Dials In Some Ominous Teasers

May 31, 2025
Nicola Peltz Beckham shares cryptic Instagram story amid ongoing rumours of a Beckham family feud

Nicola Peltz Beckham shares cryptic Instagram story amid ongoing rumours of a Beckham family feud

May 31, 2025
THE PHOENICIAN SCHEME Hilariously Quriky and One of Wes Anderson’s Best Movies — GeekTyrant

THE PHOENICIAN SCHEME Hilariously Quriky and One of Wes Anderson’s Best Movies — GeekTyrant

May 31, 2025
Mama June and Daughters Address Family Feud, Money Dispute and Raising Chickadee’s Kid

Mama June and Daughters Address Family Feud, Money Dispute and Raising Chickadee’s Kid

May 31, 2025
Insane Clown Posse Name Favorite Rock Bands, Best Nu-Metal Rapper

Insane Clown Posse Name Favorite Rock Bands, Best Nu-Metal Rapper

May 31, 2025
The Clipse’s ‘Ace Trumpets’: The 12 Best Lines

The Clipse’s ‘Ace Trumpets’: The 12 Best Lines

May 30, 2025
Google Maps falsely told drivers in Germany that roads across the country were closed

Google Maps falsely told drivers in Germany that roads across the country were closed

May 30, 2025
Indigenous Sex Worker Drama Seventeen Begins Production, Unveils Cast

Indigenous Sex Worker Drama Seventeen Begins Production, Unveils Cast

May 30, 2025
New Self New Life

Your source for entertainment news, celebrities, celebrity news, and Music, Cinema, Digital Lifestyle and Social Media and More !

Categories

  • Celebrity
  • Cinema
  • Devices
  • Digital Lifestyle
  • Entertainment
  • Music
  • Social Media
  • Softwares
  • Uncategorized

Recent Posts

  • ‘The Black Phone 2’ Dials In Some Ominous Teasers
  • Nicola Peltz Beckham shares cryptic Instagram story amid ongoing rumours of a Beckham family feud
  • THE PHOENICIAN SCHEME Hilariously Quriky and One of Wes Anderson’s Best Movies — GeekTyrant
  • Home
  • Disclaimer
  • DMCA
  • Privacy Policy
  • Cookie Privacy Policy
  • Terms and Conditions
  • Contact us

Copyright © 2021 New Self New Life.
New Self New Life is not responsible for the content of external sites. slotsfree  creator solana token

No Result
View All Result
  • Home
  • Entertainment
  • Celebrity
  • Cinema
  • Music
  • Digital Lifestyle
  • Social Media
  • Softwares
  • Devices

Copyright © 2021 New Self New Life.
New Self New Life is not responsible for the content of external sites.

777 slot machine