On 2018-01-23 23:29, Virgil Stokes wrote:
Another follow-up question:
How would this code be modified to handle using the "Esc" key instead of
the "Enter" key?
This version uses msvcrt on Windows:
import msvcrt
import threading
import time
shutdown = False
def wait_for_enter():
global shutdown
print("Hit Enter to quit.")
# b'\x0D' is the bytestring produced by the Enter key.
# b'\x1B' is the bytestring produced by the Esc key.
if msvcrt.getch() == b'\x1B':
shutdown = True
threading.Thread(target=wait_for_enter).start()
while "more work to do":
print("Getting data...")
time.sleep(1)
print("Saving data to file...")
time.sleep(1)
if shutdown:
print("Pre-termination...")
time.sleep(1)
raise SystemExit("exit")
Another function of note is "msvcrt.kbhit()", which will tell you if
there's a key waiting to be read.
This is all in the docs for the msvcrt module.
On 2018-01-23 20:15, Chris Angelico wrote:
On Wed, Jan 24, 2018 at 5:50 AM, Virgil Stokes <v...@it.uu.se> wrote:
I would appreciate help on finding a solution to following problem. This is
the general structure of the "problem" code:
while True
# Get some data from the web and process it
...
...
# Write these data to a file
...
...
# Check if a_key has been pressed in the command window
...
...
if a_key_pressed:
# Perform some pre-termination tasks
...
...
# Close the output data file
...
...
raise SystemExit('Exit')
I am running the code with Python 3.6 on a windows 10 platform. I have tried
many approaches (mainly those posted on stackoverflow) but I have yet to
find an approach that works for this structure.
Note:
1) The code is executed in the windows 10 command window
2) I am not using wxPython, IDLE, or pyGame in this application.
3) The time to get the data, process it and write it to a file can
take from 0.5 sec to 1.5 sec
4) The key hit need not be echoed to the command window
Are you okay with demanding a specific key, rather than simply "press
any key"? Even better, key combination? Handle Ctrl-C by catching
KeyboardInterrupt and you can take advantage of Python's existing
cross-platform handling of the standard interrupt signal.
If Ctrl-C won't work for you, how about stipulating that it be Enter?
"Press Enter to quit" isn't too much worse than "Press any key to
quit" (plus you have less chance of accidentally terminating the
program when you don't want to). Spin off a thread to wait for enter.
I've tested this only on Linux, but it ought to work:
import threading
import time
shutdown = False
def wait_for_enter():
print("Hit Enter to quit.")
input()
global shutdown; shutdown = True
threading.Thread(target=wait_for_enter).start()
while "more work to do":
print("Getting data...")
time.sleep(1)
print("Saving data to file...")
time.sleep(1)
if shutdown:
print("Pre-termination...")
time.sleep(1)
raise SystemExit("exit")
If it doesn't, try switching around which is the secondary thread and
which is the primary - spin off a thread to do the work, then call
input() in the main thread.
ChrisA
--
https://mail.python.org/mailman/listinfo/python-list