2015-05-15 4 views
10

इसलिए मैं एक प्रोजेक्ट लिख रहा हूं जहां मैं एक प्रोग्राम चलाता हूं जो लगातार उसी प्रोग्राम चलाने वाले अन्य कंप्यूटरों को संदेश भेजता/भेजता है।टर्मिनल स्क्रीन के शीर्ष या निचले हिस्से में stdin लाइन रखें

डेटा का रिसीवर/प्रेषक धागे पर चल रहा है और प्रिंट को stdout पर चल रहा है। मैं इस तरह सामान मिलता है:

[INFO] User 'blah' wants to send message to you. 
[INFO] some other info 
[MSG REC] Message 'hello' received from blah. 

अब मुद्दा है कि कभी कभी मैं इनपुट करना चाहते हैं टर्मिनल में आदेश, समस्या यह है कि जब मैं एक कमांड और एक नया की जानकारी संदेश या MSG REC में प्रवेश करने की कोशिश stdout में छपा है । मेरे पास quit और status आदि जैसे आदेश हैं

>> इनपुट लाइन इंगित करता है।

कुछ इस तरह हो सकता है:

[INFO] User 'blah' wants to send message to you. 
[INFO] some other info 
[MSG REC] Message 'hello' received from blah. 
>> stat[MSG REC] Message 'sup' received from Bob. 
us 

तब मैं दर्ज करें और आदेश status मार डाला लेकिन टर्मिनल में इतना गरीब लग रहा है हो जाता है प्रेस होगा। एक संदेश हर 2-4 सेकंड में दिखाई देता है, इसलिए यह एक मुद्दा है। क्या इसे हल करने का कोई अच्छा तरीका है? मैंने अंतिम पंक्ति से पहले एक नई लाइन को आज़माने और डालने के लिए एएनएसआई कर्सर कमांड का उपयोग करने की कोशिश की ताकि अंतिम पंक्ति हमेशा इनपुट लाइन के रूप में रहेगी और मैं "स्टेट" टाइप कर सकता हूं, थोड़ी देर प्रतीक्षा कर सकता हूं और बिना किसी के "इसे" मुद्दे।

मैंने यह भी देखा कि लोग curses की सलाह देते हैं लेकिन मेरे प्रोग्राम के साथ इसे एकीकृत करने का प्रयास करने से अन्य चीजों के बीच मेरे आउटपुट की स्वरूपण पूरी तरह से गड़बड़ हो गई है (और मुझे लगता है कि यह शायद अधिक हो सकता है)।

तो वहाँ एक आसान तरीका धागा डालने अंतिम पंक्ति के ऊपर स्थित नया MSG REC लाइनों 1 लाइन तो अंतिम पंक्ति हमेशा साथ इनपुट लाइन >> और जो कुछ भी मैं लिख दिया के रूप में रहते हैं बनाने के लिए है।

लिनक्स पर पायथन 2.7 का उपयोग करना।

संपादित करें: जेम्स मिल्स ने काम का जवाब दिया: जब भी मेरा धागा एक नई रेखा मुद्रित कर रहा था तब मुझे इसका उपयोग करना पड़ा।

myY, myX = stdscr.getyx();   
str = "blah blah"; #my message I want to print 
stdscr.addstr(len(lines), 0, str) 
lines.append(str) 
stdscr.move(myY, myX) #move cursor back to proper position 

उत्तर

7

यहाँ एक बुनियादी उदाहरण है:

कोड:

#!/usr/bin/env python 

from string import printable 
from curses import erasechar, wrapper 

PRINTABLE = map(ord, printable) 

def input(stdscr): 
    ERASE = input.ERASE = getattr(input, "ERASE", ord(erasechar())) 
    Y, X = stdscr.getyx() 
    s = [] 

    while True: 
     c = stdscr.getch() 

     if c in (13, 10): 
      break 
     elif c == ERASE: 
      y, x = stdscr.getyx() 
      if x > X: 
       del s[-1] 
       stdscr.move(y, (x - 1)) 
       stdscr.clrtoeol() 
       stdscr.refresh() 
     elif c in PRINTABLE: 
      s.append(chr(c)) 
      stdscr.addch(c) 

    return "".join(s) 

def prompt(stdscr, y, x, prompt=">>> "): 
    stdscr.move(y, x) 
    stdscr.clrtoeol() 
    stdscr.addstr(y, x, prompt) 
    return input(stdscr) 

def main(stdscr): 
    Y, X = stdscr.getmaxyx() 

    lines = [] 
    max_lines = (Y - 3) 

    stdscr.clear() 

    while True: 
     s = prompt(stdscr, (Y - 1), 0) # noqa 
     if s == ":q": 
      break 

     # scroll 
     if len(lines) > max_lines: 
      lines = lines[1:] 
      stdscr.clear() 
      for i, line in enumerate(lines): 
       stdscr.addstr(i, 0, line) 

     stdscr.addstr(len(lines), 0, s) 
     lines.append(s) 

     stdscr.refresh() 

wrapper(main) 

यह मूलतः एक डेमो सेट जो इनपुट के लिए उपयोगकर्ता को संकेत देता और (24, 0) पर शीघ्र प्रदर्शित करता एप्लिकेशन शाप । डेमो उपयोगकर्ता को :q दर्ज करने पर समाप्त करता है। किसी भी अन्य इनपुट के लिए यह स्क्रीन के शीर्ष पर इनपुट जोड़ता है। का आनंद लें! (<BACKSAPCE> भी काम करता है!) :)

देखें: curses; इस उदाहरण में उपयोग की गई सभी एपीआई सीधे इस मानक पुस्तकालय से है। जबकि शाप का उपयोग करना IHMO "ओवरकिल" हो सकता है या नहीं हो सकता है, मैं urwid के उपयोग की अनुशंसा करता हूं, खासकर यदि आपके आवेदन की जटिलता सादे 'ओएल शाप को आगे बढ़ना शुरू कर देती है।

+0

मुझे अपनी मशीन पर बैकस्पेस को ठीक करने के लिए 'curses.KEY_BACKSPACE' जोड़ना पड़ा। यह भी काम नहीं करता है जैसा कि मैं चाहता हूं, जबकि मेरा धागा हर सेकेंड में नई लाइनों को प्रिंट कर रहा है (मैंने इसे 'stdscr' तर्क के रूप में पारित किया है और लाइनों को वैश्विक बना दिया है), यह कर्सर को मुद्रित रेखा के अंत में ले जाता है तो क्या मैं लिख रहा हूं पिछली पंक्ति के अंत में मुद्रित है और'>> ' – Mohammad

+1

के पास नीचे नहीं है ठीक है इसे ठीक करने में कामयाब रहा है और अब मैं काम कर रहा हूं! मुझे बस अपना धागा नई लाइनों को प्रिंट करने के तरीके को बदलना पड़ा था ताकि प्रिंटिंग करने के बाद कर्सर को सही स्थिति में वापस ले जाया जा सके। मैंने मूल पोस्ट में परिवर्तन जोड़ा। – Mohammad

+0

मुझे खुशी है कि इससे आपको अपनी समस्याओं का समाधान करने में मदद मिली! 'Curses.KEY_BACKSPACE' का उपयोग करना मेरे सिस्टम पर काम नहीं करता है :) –

संबंधित मुद्दे