print редактируемый текст для raw_input python [duplicate]

A NullReferenceException бросается, когда мы пытаемся получить доступ к свойствам нулевого объекта или когда значение строки становится пустым, и мы пытаемся получить доступ к строковым методам.

Например:

  1. При использовании метода string пустой строки:
    string str = string.Empty;
    str.ToLower(); // throw null reference exception
    
  2. Когда свойство нулевого объекта доступно:
    Public Class Person {
        public string Name { get; set; }
    }
    Person objPerson;
    objPerson.Name  /// throw Null refernce Exception 
    
48
задан sth 28 March 2010 в 15:23
поделиться

10 ответов

Стандартные функции библиотеки input() и raw_input() не имеют этой функции. Если вы используете Linux, вы можете использовать модуль readline для определения функции ввода, которая использует значение предварительной заливки и расширенное редактирование линии:

def rlinput(prompt, prefill=''):
   readline.set_startup_hook(lambda: readline.insert_text(prefill))
   try:
      return raw_input(prompt)
   finally:
      readline.set_startup_hook()
55
ответ дан sth 27 August 2018 в 20:11
поделиться

Не лучший подход, но ради совместного использования ... Вы можете использовать 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
0
ответ дан lalengua 27 August 2018 в 20:11
поделиться

Мы можем использовать Tkinter и использовать StringVar для этого. Ограничение состоит в том, что вход осуществляется через окно Tkinter.

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()
0
ответ дан Oppy 27 August 2018 в 20:11
поделиться

Я хотел бы предложить использовать буфер обмена для решения этой проблемы. Вставьте буфер обмена в строку ввода, отредактируйте по мере необходимости, нажмите 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)
1
ответ дан pdbperks 27 August 2018 в 20:11
поделиться
  • 1
    Это приятное и простое решение. В примере, возможно, следует указать, что пользователю необходимо выполнить CTRL-V, чтобы поместить значение по умолчанию в строку ввода, сделав его доступным для возможного редактирования. – Steve Lockwood 14 August 2018 в 19:56

Это не очень хороший ответ, но это работа для окон. Насколько я старался, я не мог заставить Readline или pyReadline работать на моем компьютере с Windows 10 с Python Ver 3.5. Поэтому я написал это вместо этого. Не лучший код в мире, так как я только использовал Python в течение 3 месяцев. Но он работает.

    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 ++ или Scripe или Code Writer, и т. Д.

-1
ответ дан Phantom 27 August 2018 в 20:11
поделиться

Это работает в окнах.

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
10
ответ дан qtwtetrt 27 August 2018 в 20:11
поделиться
  • 1
    это только для python 3, правда? – sfranky 28 February 2012 в 15:55
  • 2
    Я думаю, что вышеупомянутый ответ предназначен только для Python 2. print name является мертвой поддачей;) Для решения Python 3 для Windows см. Мой ответ на аналогичный вопрос с слегка измененным кодом: stackoverflow.com/a/ 32156249/4973698 – mbdevpl 22 August 2015 в 12:54

Я предполагаю, что вы имеете в виду из командной строки. Я никогда не видел начальных значений для подсказок в командной строке, они обычно имеют форму:

     Folder [default] : 

, которая в коде просто:

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

Кроме того, вы можете попытайтесь что-то сделать, используя модуль curses в Python.

17
ответ дан rlotun 27 August 2018 в 20:11
поделиться

Мне это нравится, он работает на окне

def inputWdefault(prompt, default):
    bck = chr(8) * len(default)
    ret = input(prompt + default + bck)
    return ret or default
0
ответ дан Rody From Argentina 27 August 2018 в 20:11
поделиться

Если вы это сделаете, пользователю придется удалить существующее слово. Как насчет предоставления значения по умолчанию, если пользователь нажимает «return»?

>>> default_folder = "My Documents"
>>> try: folder = input("folder name [%s]:" %default_folder)
... except SyntaxError: folder = default_folder
-3
ответ дан Stephen 27 August 2018 в 20:11
поделиться

Я думаю, что лучшее (самое простое и самое портативное) решение представляет собой комбинацию ответов @rlotun и @Stephen:

default = '/default/path/'
dir = raw_input('Folder [%s]' % default)
dir = dir or default
2
ответ дан uolot 27 August 2018 в 20:11
поделиться
  • 1
    Мне нравится этот метод, потому что он позволяет изменять значение по умолчанию. – Metagrapher 28 February 2011 в 02:10
  • 2
    он не позволяет редактировать значение по умолчанию. – jfs 22 August 2015 в 13:24
Другие вопросы по тегам:

Похожие вопросы: