A NullReferenceException
бросается, когда мы пытаемся получить доступ к свойствам нулевого объекта или когда значение строки становится пустым, и мы пытаемся получить доступ к строковым методам.
Например:
string str = string.Empty;
str.ToLower(); // throw null reference exception
Public Class Person {
public string Name { get; set; }
}
Person objPerson;
objPerson.Name /// throw Null refernce Exception
Стандартные функции библиотеки 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()
Не лучший подход, но ради совместного использования ... Вы можете использовать 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
Мы можем использовать 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()
Я хотел бы предложить использовать буфер обмена для решения этой проблемы. Вставьте буфер обмена в строку ввода, отредактируйте по мере необходимости, нажмите 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)
Это не очень хороший ответ, но это работа для окон. Насколько я старался, я не мог заставить 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, и т. Д.
Это работает в окнах.
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
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.
Мне это нравится, он работает на окне
def inputWdefault(prompt, default):
bck = chr(8) * len(default)
ret = input(prompt + default + bck)
return ret or default
Если вы это сделаете, пользователю придется удалить существующее слово. Как насчет предоставления значения по умолчанию, если пользователь нажимает «return»?
>>> default_folder = "My Documents"
>>> try: folder = input("folder name [%s]:" %default_folder)
... except SyntaxError: folder = default_folder
Я думаю, что лучшее (самое простое и самое портативное) решение представляет собой комбинацию ответов @rlotun и @Stephen:
default = '/default/path/'
dir = raw_input('Folder [%s]' % default)
dir = dir or default