program tip

Python 입력에 대한 편집 기본값을 표시 할 수 있습니까?

radiobox 2020. 12. 25. 09:09
반응형

Python 입력에 대한 편집 기본값을 표시 할 수 있습니까?


파이썬이 다음과 같은 입력을 받아 들일 수 있습니까?

폴더 이름 : 다운로드

그러나 사용자가 "다운로드"를 입력하는 대신 이미 초기 값으로 있습니다. 사용자가 "다운로드"로 편집하려면 's'를 추가하고 Enter를 누르기 만하면됩니다.

일반 입력 명령 사용 :

folder=input('Folder name: ')

내가 얻을 수있는 것은 빈 프롬프트뿐입니다.

폴더 이름:

내가 놓친 간단한 방법이 있습니까?


표준 라이브러리 기능 input()raw_input()이 기능이 없습니다. Linux를 사용하는 경우 readline모듈을 사용하여 사전 채우기 값 및 고급 라인 편집을 사용하는 입력 함수를 정의 할 수 있습니다 .

import readline

def rlinput(prompt, prefill=''):
   readline.set_startup_hook(lambda: readline.insert_text(prefill))
   try:
      return input(prompt)  # or raw_input in Python 2
   finally:
      readline.set_startup_hook()

나는 당신이 명령 줄에서 의미한다고 가정하고 있습니다. 명령 줄 프롬프트의 초기 값은 본 적이 없으며 일반적으로 다음과 같은 형식입니다.

     Folder [default] : 

코드에서 간단히 :

     res = raw_input('Folder [default] : ')
     res = res or 'default'

또는 Python curses 모듈을 사용하여 무언가를 시도 할 수 있습니다 .


이것은 창에서 작동합니다.

import win32console

_stdin = win32console.GetStdHandle(win32console.STD_INPUT_HANDLE)

def input_def(prompt, default=''):
    keys = []
    for c in unicode(default):
        evt = win32console.PyINPUT_RECORDType(win32console.KEY_EVENT)
        evt.Char = c
        evt.RepeatCount = 1
        evt.KeyDown = True
        keys.append(evt)

    _stdin.WriteConsoleInput(keys)
    return raw_input(prompt)

if __name__ == '__main__':
    name = input_def('Folder name: ')
    print
    print name

최고의 (가장 쉽고 가장 이식 가능한) 솔루션은 @rlotun과 @Stephen 답변의 조합이라고 생각합니다.

default = '/default/path/'
dir = raw_input('Folder [%s]' % default)
dir = dir or default

이 문제를 해결하기 위해 클립 보드를 사용하는 것이 좋습니다. 클립 보드를 입력 줄에 붙여넣고 필요에 따라 편집 한 다음 Enter 키를 누릅니다. 변수 clpstack은 기존 클립 보드 내용을 보호하는 데 사용됩니다. 이 코드는 Windows 용입니다. Linux는 가져 오기 클립 보드를 사용할 수 있습니다.

import pyperclip as clp
clpstack=clp.paste()
clp.copy("192.168.4.1")
HOST = input("Enter telnet host: ")
clp.copy(clpstack)

마침내 Windows와 Linux에서 작동하는 간단한 대안을 찾았습니다. 기본적으로 사용자 입력을 시뮬레이션하기 위해 pyautogui 모듈을 사용하고 있습니다. 실제로는 다음과 같습니다.

from pyautogui import typewrite

print("enter folder name: ")
typewrite("Default Value")
folder = input()

Example

경고의 말씀 :

  1. 이론적으로 사용자는 typewrite완료 하기 전에 키를 눌러 "기본"입력 중간에 문자를 삽입 할 수 있습니다 .
  2. pyautogui는 헤드리스 시스템에서 신뢰할 수없는 것으로 악명 높으므로 가져 오기가 실패 할 경우 백업 솔루션을 제공해야합니다. 를 실행 No module named 'Xlib'하면 python3-xlib또는 python-xlib패키지 (또는 xlib모듈) 를 설치해보십시오 . ssh 통해 실행하는 것도 문제가 될 수 있습니다 .

대체 구현의 예 :

누락 된 x-server는 논리적으로 Linux에서만 발생할 수 있으므로 다음은 sth의 대답을 대체로 사용하는 구현입니다.

try:
    from pyautogui import typewrite
    autogui = True
except (ImportError, KeyError):
    import readline
    autogui = False

def rlinput(prompt, prefill=''):
    if autogui:
        print(prompt)
        typewrite(prefill)
        return input()
    else:
        readline.set_startup_hook(lambda: readline.insert_text(prefill))
        try:
            return input(prompt)
        finally:
            readline.set_startup_hook()

최선의 방법은 아니지만 공유를 위해 ... Javascript를 사용하여 IPython Notebook에서 모든 종류의 입력을 얻을 수 있습니다.

from IPython.display import HTML
newvar = ""
htm = """
<input id="inptval" style="width:60%;" type="text" value="This is an editable default value.">
<button onclick="set_value()" style="width:20%;">OK</button>

<script type="text/Javascript">
    function set_value(){
        var input_value = document.getElementById('inptval').value;
        var command = "newvar = '" + input_value + "'";
        var kernel = IPython.notebook.kernel;
        kernel.execute(command);
    }
</script>
"""
HTML(htm)

다음 셀에서 새 변수를 사용할 수 있습니다.

print newvar

We can use Tkinter and use a StringVar to do this. The limitation is that the input is through a Tkinter window.

from tkinter import Tk, LEFT, BOTH, StringVar
from tkinter.ttk import Entry, Frame


class Example(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.parent = parent
        self.initUI()

    def initUI(self):
        self.parent.title("Entry")
        self.pack(fill=BOTH, expand=1)
        self.contents = StringVar()
        # give the StringVar a default value
        self.contents.set('test')
        self.entry = Entry(self)
        self.entry.pack(side=LEFT, padx=15)
        self.entry["textvariable"] = self.contents
        self.entry.bind('<Key-Return>', self.on_changed)

    def on_changed(self, event):
        print('contents: {}'.format(self.contents.get()))
        return True


def main():
    root = Tk()
    ex = Example(root)
    root.geometry("250x100+300+300")
    root.mainloop()


if __name__ == '__main__':
    main()

I like this, It works on window

def inputWdefault(prompt, default):
    bck = chr(8) * len(default)
    ret = input(prompt + default + bck)
    return ret or default

This is not a very Good Answer but it is a work around for windows. As hard as I tried, I could not get Readline or pyReadline to work on my Windows10 computer with Python Ver 3.5. So I wrote this instead. Not the best code in the world since I've only been using Python for 3 months. But it works.

    import os

    def note_input(defaultvalue):
        #Create a textfile
        txtfile = open("txtfile.txt", "w")
        #
        # populate it with the default value
        txtfile.write(defaultvalue)
        txtfile.close()
        #
        # call Notepad
        os.system("notepad.exe txtfile.txt") 
        # input("Just holding until notepad is close : ") (did not need this line) 
        #
        # get the Value Entered/Changed in Notepad
        txtfile = open("txtfile.txt", "r")
        func_value = txtfile.read()
        txtfile.close()
        return func_value
    # END DEF

Notepad stopped the program from running until it was closed, so the input() line below it was not needed. Once notepad was opened the first time and placed where I wanted it on the screen, It was like a popup input window. I assume you can use any text editor like Notepad++ or Scripe or Code Writer, etc.


If you do that, the user would have to delete the existing word. What about providing a default value if the user hits "return"?

>>> default_folder = "My Documents"
>>> try: folder = input("folder name [%s]:" %default_folder)
... except SyntaxError: folder = default_folder

ReferenceURL : https://stackoverflow.com/questions/2533120/show-default-value-for-editing-on-python-input-possible

반응형