python + cmd

  • warning: realpath() [function.realpath]: SAFE MODE Restriction in effect. The script whose uid is 1005 is not allowed to access /tmp owned by uid 0 in /var/www/sites/sugree/codenone.com/subdomains/www/html/includes/file.inc on line 190.
  • warning: realpath() [function.realpath]: SAFE MODE Restriction in effect. The script whose uid is 1005 is not allowed to access /tmp owned by uid 0 in /var/www/sites/sugree/codenone.com/subdomains/www/html/includes/file.inc on line 190.

คือผมสร้าง app ของ python ในหน้าจอ dos นะครับ แต่เวลาที่ โปรแกรมกำลังทำงานอยากให้มันแสดงตัวอักษร อะไรสักอย่างที่อยู่กับที่ โดยที่ไม่เคลื่อนที่ไปบรรทัดไหนนะครับ เพื่อบอกว่ายังทำงานตรงนี้อยู่นะอย่าทำอะไร

เช่น >>> \ แล้วเป็น >>> / สลับไปมา

ผมไม่รู้ว่าจะทำอย่างไร หรือใช้เทคนิดอะไรนะครับ เพราะส่วนใหญ่ ผมก็วนลูปแล้วก็แสดงเลยทำให้เวลามี error ขึ้นมันก็จะไม่เก็บไว้ใน หน้าจอ dos นะครับ หรือว่าหน้า โปรแกรมของผมก็ยาวมากเพราะมัน แสดงวนที่ละบรรทัดนะครับ

ไม่ได้เล่นนานแล้วครับ ไม่รู้ว่า Dos รุ่นใหม่ ๆ ยังใช้ ansi escape character control cursor ได้อยู่หรือเปล่า แต่ก็คิดว่าน่าลองนะครับ

http://en.wikipedia.org/wiki/ANSI_escape_code

เป็นลูกเล่นที่แต่ก่อนใช้ตอนเขียนภาษาเบสิคใน Dos ครับ

ที่คุณ khao_lek อยากได้คงแค่ขยับ cursor ไปทางซ้ายทีนึง แล้วก็เขียนใหม่ทับลงไป

อันที่จริง ในกรณีนี้ คุณ khao_lek ส่งรหัส backspace ออกไปให้ลบ character ก็น่าจะได้นะครับ

ตอนเขียนข้อมูล อาจจะต้องใช้ stdout.write แทนคำสั่ง print

ลองดูนะครับ ได้ผลอย่างไร ช่วยบอกด้วยนะครับ ^___^

khao_lek's picture

ใช่แบบนี้เปล่าครับ หากใช่ผมรันมันแสดงติดกันหมดเลยนะครับ (ไม่รู้รหัส backspace ครับ)

from sys import stdout
n = 0
b = 1
while n <= 100000:
    if b == 1:
        stdout.write("\\")
        b = 0
    else:
        stdout.write("/")
        b = 1
    n -= 1

code ที่เขียนมา คงวนลูปไม่สิ้นสุด เพราะคุณ khao_lek ลดค่า n จากคำสั่ง n -= 1 แล้วในเงื่อนไข while เปรียบเทียบค่า n น้อยกว่า 100000 ซึ่งวนลูปไปเท่าไหร่ ก็น้อยกว่า 100000 อยู่แล้วครับ ถ้าจะแก้ตรงนี้ ก็เปลี่ยนจาก n -= 1 เป็น n += 1 ครับ

รหัส backspace คือ 08 ครับ เราพิมพ์ได้โดยใช้คำสั่ง

print chr(8)

จากตัวอย่างที่ให้มา พอจะเขียนได้อย่างนี้มั้งครับ

from sys import stdout
from time import sleep
numloop = 10
time_delay = 0.2 #second
backspace = chr(8)
for i in xrange(numloop):
    if i % 2 == 0:
        stdout.write('\\')
    else:
        stdout.write('/')
    stdout.flush() # to guarantee immediate print out
    sleep(time_delay) # add delay to allow animation effect
    stdout.write(backspace) # send out backspace to remove the previous letter
khao_lek's picture

ได้แล้วเรียบร้อยครับ ขอบคุณครับ

อันนี้ แถมครับ ไหน ๆ ลองเขียนดูแล้ว ไม่ค่อยได้ใช้ function ใน itertools เท่าไหร่ ก็เลยเอามาลองซะเลย คราวนี้ จะวนลูปกี่ symbol ก็ได้ละครับ แต่ว่า symbol มีขนาดได้แค่ 1 character นะครับ ถ้าต้องการให้ยาวกว่านั้น ต้องแก้ code นะครับ ให้ back space กลับไปลบได้หมด

from sys import stdout
from time import sleep
from itertools import cycle
symbol = ['\\','|','/','-']
numloop = 10
time_delay = 0.1 #second
backspace = chr(8)
 
for count, sym in enumerate(cycle(symbol)):
    stdout.write(sym)
    stdout.flush() # to guarantee immediate print out
    sleep(time_delay) # add delay to allow animation effect
    stdout.write(backspace) # send out backspace to remove the previous letter
    if count == numloop:
        break

ย้าย Codenone

ประกาศย้าย Codenone ไปใช้ Forum ของ Blognone แทนครับ ตามไปตั้งกระทู้ต่อได้ที่ Codenone Forum (รายละเอียดอ่านจากกระทู้ ย้าย Codenone ไปรวมกับ Blognone)

กระทู้เก่าๆ จะย้ายตามไปในภายหลัง ตอนนี้ปิดการโพสต์กระทู้ไว้ เหลือไว้เฉพาะอ้างอิงเท่านั้น