سؤال

يجب أن أعرف ما هو الضغط الذي يتم الضغط عليه، ولكن لا يحتاج إلى رمز الشخصية، أريد أن أعرف عندما يضغط شخص ما على مفتاح "A" حتى إذا كان المفتاح الذي تم الحصول عليه هو "A" أو "A"، وهكذا مع جميع المفاتيح الأخرى وبعد

لا يمكنني استخدام Pygame أو أي مكتبة أخرى (بما في ذلك Tkinter). فقط مكتبة بايثون القياسية. وهذا يجب القيام به في محطة، وليس واجهة رسومية.

لا تحتاج إلى رمز الشخصية. أحتاج إلى معرفة رمز المفتاح.

السابق:

ord('a') != ord('A')                      # 97 != 65
someFunction('a') == someFunction('A')    # a_code == A_code
هل كانت مفيدة؟

المحلول

يرى واهن الوحدة القياسية. يسمح بالتبديل من الوضع الافتراضي الموجه (الطهي) إلى وضع شامل موجه (CCRACE) مع tty.setcbreak (sys.stdin). وبعد سيؤدي قراءة سحر واحد من syss.stdin إلى مفتاح لوحة المفاتيح المضغوط المقبل (إذا قمت بإنشاء التعليمات البرمجية):

import sys
import tty
tty.setcbreak(sys.stdin)
while True:
    print ord(sys.stdin.read(1))

ملاحظة: الحل هو UNIX (بما في ذلك Linux) فقط.

تحرير: على Windows جرب msvcrt.getche ()/getwche (). وبعد / لي ليس لديه مكان لمحاولة ...


تحرير 2: الاستفادة Win32 وحدة التحكم LOW-LOW-LOVE CONSOLE VIA ctypes.windll. (يرى مثال على ذلك) مع ReadConsoleInput وظيفة. يجب عليك تصفية Keypresses - e.EventType==KEY_EVENT والبحث عن e.Event.KeyEvent.wVirtualKeyCode القيمة. مثال على التطبيق (وليس في بيثون، فقط للحصول على فكرة) يمكن العثور عليها في http://www.benryves.com/tutorials/؟t=winconsole&c=4..

نصائح أخرى

اعتمادا على ما تحاول إنجازه، ربما باستخدام مكتبة مثل Pygame. سوف تفعل ما تريد. يحتوي Pygame على معالجة كويبيس متقدمة أكثر مما يتوفر عادة مع المكتبات القياسية في بيثون.

ربما سوف تضطر إلى استخدام tkinter., ، وهو ما هو "ستاندرد" بيثون واجهة المستخدم الرسومية، وقد تم تضمينه مع بيثون لسنوات عديدة.

من المحتمل أن يكون حل سطر الأوامر غير متوفر، نظرا لأن الطريقة التي يمر بها البيانات داخل وخارج عمليات سطر الأوامر. تقوم برامج واجهة المستخدم الرسومية (من بعض النكهات أو غيرها) جميعها تلقي إدخال المستخدم من خلال مجرى الحدث المحتمل (ربما مكتبة ملفوفة). سيكون كل حدث سجل تفاصيل الحدث. بالنسبة لأحداث ضغط المفاتيح، قد يحتوي السجل على أي من Keycode أو Bitfield مفتاح المعدل، أو حرف نصي في بعض الترميز. أي الحقول، وكيف يتم تسميتها يعتمد على مكتبة الأحداث التي تتصل بها.

تقوم برامج سطر الأوامر بإلقاء إدخال المستخدم من خلال تدفقات الأحرف. لا توجد وسيلة للقبض على البيانات ذات المستوى الأدنى. كما أوضح myroslav في منصبه، يمكن أن يكون TTY's في وضع مطبوخ أو غير مطبوخ، والفرق الوحيد يجري في الوضع المطبوخ ستعالج الطرف (بعض) أحرف التحكم لك، مثل حذف وإدخال بحيث تستقبل العملية خطوط الإدخال، بدلا من ذلك من حرف واحد في وقت واحد.

معالجة أي شيء أقل من ذلك يتطلب مكالمات نظام (OSE التابعة OS) أو فتح أجهزة الأحرف في / dev. لا توفر مكتبة Python القياسية أي منشأة قياسية لهذا.

إذا كنت بحاجة إلى العمل في Windows فقط، يجب أن تحاول msvcrt..

الجواب الواضح:

someFunction = string.upper

ord('a') != ord('A')                      # 97 != 65
someFunction('a') == someFunction('A')    # a_code == A_code

أو، في كلمات أخرى (مفتاح):

char_from_user = getch().upper() # read a char converting to uppercase
if char == 'Q':
    # quit
    exit = True # or something
elif char in ['A', 'K']:
    do_something()

إلخ...

فيما يلي تنفيذ لوظيفة Getch، من شأنها أن تعمل في كل من منصات Windows و Linux، بناء على هذه الوصفة:

class _Getch(object):
    """Gets a single character from standard input.  
       Does not echo to the screen."""
    def __init__(self):
        try:
            self.impl = _GetchWindows()
        except ImportError:
            self.impl = _GetchUnix()

    def __call__(self): 
        return self.impl()

class _GetchUnix(object):
    def __init__(self):
        import tty, sys

    def __call__(self):
        import sys, tty, termios
        fd = sys.stdin.fileno()
        old_settings = termios.tcgetattr(fd)
        try:
            tty.setraw(sys.stdin.fileno())
            ch = sys.stdin.read(1)
        finally:
            termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
        return ch


class _GetchWindows(object):
    def __init__(self):
        import msvcrt

    def __call__(self):
        import msvcrt
        return msvcrt.getch()


getch = _Getch()

ستقوم هذه الوظيفة بإرجاع التعليمات البرمجية للشخصية الكبيرة:

def upCcode( ch ):
    if(len(ch) == 1):
        return ord(ch.upper())

وهذا هو رمز الحرف الصغير:

def lowCcode( ch ):
        if(len(ch) == 1):
            return ord(ch.lower())

بهذه الطريقة أسهل بكثير، ولن تحتاج إلى استيراد المكتبات الخارجية.

ستحتاج إلى اختيار أحد الطريقتين ليكون "منصفة" التي وصفتها في سؤالك. إليك مثال:

انتاج:

# when using upCode():
>> upCcode('a')
65

>> upCcode('A')
65

# when using lowCode():
>> lowCcode('a')
97

>> lowCcode('A')
97

إلقاء نظرة على pynput. وحدة في بيثون. كما أن لديها لطيفة الدورة التعليمية باستخدام ما يمكنك بسهولة إنشاء مستمعي لوحة المفاتيح للحصول على التعليمات البرمجية الخاصة بك.

المثال الرسمي للمستمعين هو:

from pynput.keyboard import Key, Listener

def on_press(key):
    print('{0} pressed'.format(
        key))

def on_release(key):
    print('{0} release'.format(
        key))
    if key == Key.esc:
        # Stop listener
        return False

# Collect events until released
with Listener(on_press=on_press,
              on_release=on_release) as listener:
    listener.join()

أتمنى أن يساعدك هذا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top