2017-05-11 16 views
7

Mam czytnik QR. Kiedy czytnik QR skanuje, chcę monitorować to, co skanuje, Ale wpadłem na dziwny problem, a ponieważ jestem tak nowy w Pythonie, naprawdę nie mam pojęcia, dlaczego tak się dzieje. Okay, poniżej są dwa pozornie (dla mnie) identyczne programy, poza linią. Kiedy ta linia zostanie usunięta, otrzymuję inne wyniki (pozornie zmienia się zestaw znaków). NAPRAWDĘ nie rozumiem dlaczego.Dziwne zachowanie w Pythonie, Brak linii, różne wyjścia

test2.py:

# -*- coding: utf-8 -*- 

import pyHook 
import pythoncom 
import re 
import webbrowser 

chars = "" 
def pressed_chars(event): 
    global chars 
    if event.Ascii: 
     char = chr(event.Ascii) 
     if event.Ascii == 3: 
      quit() 
     else: 
      chars += char 
      print chars 

proc = pyHook.HookManager() 
proc.KeyDown = pressed_chars 
proc.HookKeyboard() 
pythoncom.PumpMessages() 

Produkuje następujący wynik podczas skanowania kodu QR z treścią http://google.com:

H 
HT 
HTT 
HTTP 
HTTP: 
HTTP:? 
HTTP:?? 
HTTP:??G 
HTTP:??GO 
HTTP:??GOO 
HTTP:??GOOG 
HTTP:??GOOGL 
HTTP:??GOOGLE 
HTTP:??GOOGLE> 
HTTP:??GOOGLE>C 
HTTP:??GOOGLE>CO 
HTTP:??GOOGLE>COM 
HTTP:??GOOGLE>COM 

A teraz test3.py:

# -*- coding: utf-8 -*- 

import pyHook 
import pythoncom 
import re 
import webbrowser 
endDomains = ".com|.net|.org|.edu|.gov|.mil|.aero|.asia|.biz|.cat|.coop|.info|.int|.jobs|.mobi|.museum|.name|.post|.pro|.tel|.travel".split("|") 
chars = "" 
def pressed_chars(event): 
    global chars 
    if event.Ascii: 
     char = chr(event.Ascii) 
     if event.Ascii == 3: 
      quit() 
     else: 
      chars += char 
      print chars 

proc = pyHook.HookManager() 
proc.KeyDown = pressed_chars 
proc.HookKeyboard() 
pythoncom.PumpMessages() 

produkuje następujący wynik:

h 
ht 
htt 
http 
http; 
http;/ 
http;// 
http;//g 
http;//go 
http;//goo 
http;//goog 
http;//googl 
http;//google 
http;//google. 
http;//google.c 
http;//google.co 
http;//google.com 
http;//google.com 

Po usunięciu dowolnej części zmiennej endDomains program zmienia się. Czy są jakieś postacie, których nie widzę, usuwam lub coś, co zmienia rzeczy? Dlaczego u licha jest pyton wytwarzający te dwa zupełnie różne wyniki przy usuwaniu zmiennej, której program nawet nie używa?

Edytuj: Wygląda na to, że jest podłączony do .split("|"), a raczej nie do zmiennej. Jeśli usuniemy program .split("|"), program ponownie się zepsuje.

Druga Edycja Kredyt dla oryginalnego źródła, które użyłem idzie Janekmuric from their answer here.

+0

Może jakiś inny plik zaimportował ten plik i w tym pliku użyto 'endDomains'. – ZdaR

+0

@ZdaR, oh? Jak to przetestować? – Chud37

+0

Zmiana 'endDomains' na inną nazwę, np.' End_domains' w celu ponownego sprawdzenia danych wyjściowych. –

Odpowiedz

1

drodze trzeba zdefiniowany endDomains nie jest bardzo „pythonic”

byłoby lepiej po prostu zdefiniować go jako listę .

endDomains = [ 
    ".com", ".net", ".org", ".edu", ".gov", ".mil", ".aero", ".asia", 
    ".biz", ".cat", ".coop", ".info", ".int", ".jobs", ".mobi", ".museum", 
    ".name", ".post", ".pro", ".tel", ".travel" 
] 

Czy jesteś w stanie zwrócić wartość i odebrać ją, aby konstrukcja została wykonana poza wydarzeniem? Niestety nie ma mnie w systemie Windows, więc nie mogę tego przetestować. Napisałem to:

"""Mock.""" 

endDomains = [ 
     ".com", ".net", ".org", ".edu", ".gov", ".mil", ".aero", ".asia", 
     ".biz", ".cat", ".coop", ".info", ".int", ".jobs", ".mobi", ".museum", 
     ".name", ".post", ".pro", ".tel", ".travel" 
    ] 
chars = "" 
def pressed_chars(event): 
    global chars 
    char = chr(ord(event)) 
    if event == '3': 
     return False 
    else: 
     chars += char 
     print(chars) 
     return True 


result = True 
while result: 
    string = input("Some input please: ") 
    for character in string: 
     result = pressed_chars(character) 

print("Done") 

To nie cierpi z powodu tego samego problemu. Tak więc oczekiwałbym tego problemu w pyHook lub pythoncom. Warto również zauważyć, że globale nie są zwykle używane i dlatego, że wprowadza zamieszanie: Use of "global" keyword in Python

nadzieję, że pomaga.

+0

Hej Matt! Problem polegał na tym, że chciałem uruchomić program * bez * 'endDomains', ponieważ nie był używany, ale usunięcie go spowodowało dwa różne wyjścia i nie mogłem zrozumieć dlaczego. – Chud37

+0

Rozumiem. Aby było jasne ... Moduły, z których korzystasz, muszą jakoś wpływać na kontekst. W zwykłym pythonie nie ma mowy, aby tak się stało. Zobacz przykład, który dałem. Musi istnieć coś, co zmienia użycie dzielenia (dziedziczone) lub coś podobnego. Nie rozumiem, dlaczego w takim przypadku wpłynęłoby na znaki, chyba że moduł używa również znaków globalnych. – Matt