diff --git a/.pylintrc b/.pylintrc index 8927640..1dc498d 100644 --- a/.pylintrc +++ b/.pylintrc @@ -1,4 +1,5 @@ [MASTER] +extension-pkg-whitelist = PySide init-hook = import sys; sys.path.append('./selenium.egg') [MESSAGES CONTROL] diff --git a/client.py b/client.py index 56c4734..fb3f6cc 100755 --- a/client.py +++ b/client.py @@ -19,31 +19,77 @@ # along with this program. If not, see . -import sys -from threading import Thread import configparser +import errno +import os +from PySide.QtCore import QObject, Qt, Signal +from PySide.QtGui import QApplication +from PySide.QtWebKit import QWebView +from threading import current_thread, main_thread, Thread +from time import sleep -sys.path.append("./selenium.egg") -from selenium.webdriver import Firefox +def current_thread_is_main(): + return current_thread() is main_thread() -def load_config(): - config = configparser.ConfigParser() - config.read('config') - return config['Terminal'] +class Browser(QObject): + # pylint: disable=too-many-public-methods + __execute_script_called = Signal(str) -def user_scanner(driver, package): - config = load_config() - scanner = open(config["user_scanner"]) + def __init__(self): + super().__init__() + + self.app = QApplication([]) + + self.webview = QWebView() + self.webview.setAttribute(Qt.WA_DeleteOnClose) + self.webview.destroyed.connect(self.app.quit) + + self.__execute_script_called.connect(self.__execute_script) + + def __execute_script(self, javascript_code: str): + assert current_thread_is_main() + self.webview.page().mainFrame().evaluateJavaScript(javascript_code) + + def execute_script(self, javascript_code: str): + if current_thread_is_main(): + self.__execute_script(javascript_code) + else: + self.__execute_script_called.emit(javascript_code) + + def run(self, url): + assert current_thread_is_main() + self.webview.show() + self.webview.load(url) + self.app.exec_() + + +def opener_nonblock(path, mode): + return os.open(path, mode | os.O_NONBLOCK) + + +def readline_nonblock(fileobject) -> 'Optional[str]': + try: + return fileobject.readline() or None + except OSError as err: + if err.errno == errno.EAGAIN or err.errno == errno.EWOULDBLOCK: + return None + + +def user_scanner(config, browser): + scanner = open(config["user_scanner"], opener=opener_nonblock) while True: - new_user = scanner.read().strip("\2\3\r\n") - driver.execute_script("user(" + new_user + ")") + data = readline_nonblock(scanner) + if data is not None: + new_user = data.strip("\2\3\r\n") + browser.execute_script("user(" + new_user + ")") + else: + sleep(0.1) -def book_scanner(driver, package): - config = load_config() +def book_scanner(config, browser): while True: scanner = open(config["book_scanner"], "rb") i = 0 @@ -61,21 +107,26 @@ def book_scanner(driver, package): break print(number % 10) barcode += str(number % 10) - driver.execute_script("barcode(" + barcode + ")") + browser.execute_script("barcode(" + barcode + ")") def main(): - driver = Firefox() - driver.get("http://yandex.ru/") - package = { - "user": "", - "book": "", - } - user = Thread(target=user_scanner, args=(driver, package)) - book = Thread(target=book_scanner, args=(driver, package)) + def load_config(): + config = configparser.ConfigParser() + config.read('config') + return config['Terminal'] + + config = load_config() + + browser = Browser() + + user = Thread(target=user_scanner, args=(config, browser), daemon=True) + book = Thread(target=book_scanner, args=(config, browser), daemon=True) user.start() book.start() + browser.run(config['operations_url']) + if __name__ == '__main__': main() diff --git a/config b/config index 3ad0bf4..201a8c0 100644 --- a/config +++ b/config @@ -6,6 +6,6 @@ librarian_pages = ["handed", "journal", "add", "operations", "users", "books"] student_pages = ["handed", "books"] [Terminal] -user_scanner = "" -book_scanner = "/dev/input/by-id/usb-WIT_Electron_Company_WIT_122-UFS_V2.03-event-kbd" -operations_url = "http://localhost" +user_scanner = user_scanner +book_scanner = /dev/input/by-id/usb-WIT_Electron_Company_WIT_122-UFS_V2.03-event-kbd +operations_url = http://localhost:1303 diff --git a/selenium-2.48.0-py3.4.egg b/selenium-2.48.0-py3.4.egg deleted file mode 100644 index 7e3aab4..0000000 Binary files a/selenium-2.48.0-py3.4.egg and /dev/null differ diff --git a/selenium.egg b/selenium.egg deleted file mode 120000 index f96ae5a..0000000 --- a/selenium.egg +++ /dev/null @@ -1 +0,0 @@ -selenium-2.48.0-py3.4.egg \ No newline at end of file diff --git a/test.py b/test.py index 55b9676..4bc7d71 100755 --- a/test.py +++ b/test.py @@ -28,8 +28,6 @@ "--show-source", "--ignore=" + ','.join([ 'E251', # unexpected spaces around keyword / parameter equals - 'E402', # module level import not at top of file - # for import selenium.egg 'W503', # line break before binary operator ]), ]