[Solved] Python script works differently on IDLE and command prompt | Sololearn: Learn to code for FREE!
New course! Every coder should learn Generative AI!
Try a free lesson
0

[Solved] Python script works differently on IDLE and command prompt

I made a little code today with a standard module only comes with MS Windows, winsound. The code prints a character and the make a beep. It works perfectly on IDLE. However when I run it in command prompt / powershell, it prints all the characters at once after all the beep sound finished. What's give? https://code.sololearn.com/cMsH6aKZt57E/?ref=app

24th Nov 2023, 10:35 AM
Wong Hei Ming
Wong Hei Ming - avatar
7 Answers
+ 1
Wong Hei Ming great link. The -u option and the PYTHONUNBUFFERED env variables are good to know ..👍 Also, using functools partial is a great idea. I feel it's like a quick and simple decorator when used this way. Cross-platform beep is harder. From what I found out, it seems that audio playback is the only reliable way to do it, as beeps are implemented too differently in various os. Another option seems to use Pygame, but that is just overkill...
25th Nov 2023, 4:13 AM
Bob_Li
Bob_Li - avatar
+ 3
Wong Hei Ming i found that it works like you wanted if print is used normally (terminated with '\n'). But if you use end='', all the beeps finish then the whole line is printed. so you need to do a flush operation. use print(code, end='', flush=True) https://code.sololearn.com/cR10n13WmlyV/?ref=app
24th Nov 2023, 11:37 PM
Bob_Li
Bob_Li - avatar
25th Nov 2023, 2:11 AM
Wong Hei Ming
Wong Hei Ming - avatar
+ 1
print('\a') is supposed to trigger a system beep sound. But it may have a different effect on each platform, and not possible to set the length. For a true cross platform solution... sadly, none exist. https://python-list.python.narkive.com/p9V26mRv/howto-do-a-robust-simple-cross-platform-beep https://www.reddit.com/r/learnpython/comments/k04eke/making_beeps_and_sounds_with_python_2020_still/
24th Nov 2023, 1:08 PM
Tibor Santa
Tibor Santa - avatar
+ 1
Bob_Li The nested number is fixed, probably muscle memory after keying 26 letters’ code. It does separate part with 1 unit, letter with 3 units and word with 7 units. Uncomment line 108 and 115 will reveal the action. To observe part separation, change the number from 500 to 1500 in line 71. I also added a fail-safe in case the user input a string with punctuation. It removes any punctuation from the message and reconstructs the end result.
25th Nov 2023, 10:55 AM
Wong Hei Ming
Wong Hei Ming - avatar
0
Tibor Santa The code doesn't use print('\a') to make a beep, it use winsound module and it is Windows exclusive. In line 95 and 96 it is programmed to print a dot or a dash first, and then make the beep. In IDLE it is . beep . beep _ beep In prompt it sounds all the beep, then print the dot and dash. The behaviou is different but on the same machine and same OS, only the run-time environment different.
24th Nov 2023, 1:50 PM
Wong Hei Ming
Wong Hei Ming - avatar
0
Wong Hei Ming your split does not keep the empty spaces between words maybe use re.split? also I spotted nested quotes in the MORSE dictionary '"1"': also maybe add the space as a key ' ':' ' #7 units between words? import re def beeping(msg): msg = re.split(r'(\s)', msg) for word in msg : for ch in word: print(ch, end='', flush=True) for sym in MORSE.get(ch): print(sym, end='', flush=True) sound(sym) print(' ') sound(' ')
25th Nov 2023, 9:54 AM
Bob_Li
Bob_Li - avatar