Печать Python после нажатия горячей клавиши [дубликат]

Чтобы получить максимальный ключ / значение словаря stats:

stats = {'a':1000, 'b':3000, 'c': 100}
  • На основе клавиш

>>> max(stats.items(), key = lambda x: x[0]) ('c', 100)

  • На основании значений

>>> max(stats.items(), key = lambda x: x[1]) ('b', 3000)

Конечно, если вы хотите получить только ключ или значение из результата, вы можете используйте индексирование кортежей. Например, чтобы получить ключ, соответствующий максимальному значению:

>>> max(stats.items(), key = lambda x: x[1])[0] 'b'

Объяснение

Метод словаря items() в Python 3 возвращает объект view словаря. Когда этот объект представления итерируется, функцией max, он выводит словарные элементы как кортежи формы (key, value).

>>> list(stats.items()) [('c', 100), ('b', 3000), ('a', 1000)]

Когда вы используете lambda выражение lambda x: x[1], на каждой итерации x является одним из этих наборов (key, value). Таким образом, выбрав правильный индекс, вы выбираете, хотите ли вы сравнивать по ключам или значениям.

Python 2

Для релизов Python 2.2+ будет работать тот же код. Однако лучше использовать словарь iteritems() вместо items() .

Примечания

  • Этот ответ основан на комментариях к ответу Climbs_lika_Spyder .
  • Используемый код был протестирован на Python 3.5.2 и Python 2.7.10.

18
задан eyllanesc 29 April 2018 в 21:17
поделиться

5 ответов

Поскольку OP упоминает о raw_input, это означает, что он хочет решение cli. Linux: curses - это то, что вы хотите (windows PDCurses). Curses, является графическим API-интерфейсом для программного обеспечения cli, вы можете добиться большего, чем просто обнаружить ключевые события.

Этот код будет обнаруживать клавиши до тех пор, пока не будет нажата новая строка.

import curses

def main(win):
    win.nodelay(True)
    key=""
    win.clear()                
    win.addstr("Detected key:")
    while 1:          
        try:                 
           key = win.getkey()         
           win.clear()                
           win.addstr("Detected key:")
           win.addstr(str(key)) 
           if key == os.linesep:
              break           
        except Exception as e:
           # No input   
           pass         

curses.wrapper(main)
8
ответ дан Abc Xyz 16 August 2018 в 10:12
поделиться
  • 1
    Это действительно приятно. Пришлось искать вечность, прежде чем наткнуться на нее. Кажется намного чище, чем взламывать termios и так далее ... – Hugh Perkins 4 May 2016 в 10:40
  • 2
    необходимо добавить import os, чтобы иметь возможность выйти из примера. – malte 4 August 2017 в 21:17

Было бы трудно использовать tKinter или какой-либо другой графический интерфейс (например, wxPython или pyQT) для реализации прослушивателя или другого интерфейса для обнаружения нажатия клавиши.

Проверить эту тему .

9
ответ дан Community 16 August 2018 в 10:12
поделиться
  • 1
    Я не уверен в Linux, но он работает на Windows для меня. – user 26 June 2017 в 06:52
  • 2
    keyboard, по-видимому, требует root в linux: / – Inaimathi 14 November 2017 в 17:05
  • 3
    Я пробовал это решение, но когда я пытаюсь импортировать модуль после его установки, я получаю & quot; ИмпортError: Нет модуля с именем «клавиатура» & quot ;, поэтому он не работает. Я проверил в репозитории GitHub, и я нашел связанную проблему , но это не решило меня. Затем я попытался загрузить репо и выполнить некоторые из его примеров, но я получаю, и «ImportError: вы должны быть root, чтобы использовать эту библиотеку в linux», как это отмечал ранее @Inaimathi. По-видимому, это полный модуль для управления клавиатурой с Python, но требование root - большой недостаток :( – Ivanhercaz 16 May 2018 в 14:36
  • 4
    Я попробовал это решение, но некоторое время понял, что он запускается, когда ваше приложение работает в терминале, и это не в фокусе. Наверное, отлично подходит для многих приложений, но для меня это срабатывает, так как я запускаю несколько процессов. – Rob Cannon 2 June 2018 в 00:53
  • 5
    «Чтобы избежать зависимости от X, части Linux читают файлы необработанных устройств (/ dev / input / input *), но этот корень исправления. & quot; – jrouquie 6 August 2018 в 13:39

Я предлагаю вам использовать PyGame и добавить дескриптор события.

http://www.pygame.org/docs/ref/event.html

0
ответ дан Madison Spicksy Courto 16 August 2018 в 10:12
поделиться

Для Windows вы можете использовать msvcrt следующим образом:

   import msvcrt
   while True:
       if msvcrt.kbhit():
           key = msvcrt.getch()
           print(key)   # just to show the result
6
ответ дан Saravanabalagi Ramachandran 16 August 2018 в 10:12
поделиться
  • 1
    msvcrt - это только Windows-модуль. – Dunatotatos 21 November 2016 в 15:44
  • 2
    Я фактически использую pynput сейчас, это может быть лучший ответ – Benjie 5 February 2018 в 20:50
  • 3
    Обратите внимание, что pynput для работы с OS X (не знаю о Linux) должен работать как root для работы. Это может быть не-стартер для некоторых людей. – GabeWeiss 27 February 2018 в 01:59

Используйте PyGame, чтобы иметь окно, а затем вы можете получить ключевые события.

Для буквы p:

import pygame, sys
import pygame.locals

pygame.init()
BLACK = (0,0,0)
WIDTH = 1280
HEIGHT = 1024
windowSurface = pygame.display.set_mode((WIDTH, HEIGHT), 0, 32)

windowSurface.fill(BLACK)

while True:
    for event in pygame.event.get():
        if event.key == pygame.K_p:
             #Do what you want to here
             pass
        if event.type == pygame.locals.QUIT:
             pygame.quit()
             sys.exit()
2
ответ дан Serge Stroobandt 16 August 2018 в 10:12
поделиться
  • 1
    эй, я просто смотрел на pygame, прежде чем я вернулся и проверил это. Я попробую это – lobuo 6 June 2014 в 06:55
Другие вопросы по тегам:

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