Могу ли я получить функцию, когда я щелкаю мышью второй раз (не в текущем окне) - PullRequest
0 голосов
/ 02 февраля 2019

Во-первых, я новичок в программировании и сейчас только изучаю основы.Я создаю «сборщик продуктов» с использованием Python 3.7 (в pycharm) и хочу щелкнуть мышью на одной из кнопок продукта, а затем при следующем щелчке мыши вставить / напечатать / вставить название продукта в мою систему выставления счетов.

В настоящее время мой код работает нормально, используя модуль 'time', чтобы установить задержку перед вводом, позволяя мне выбрать, куда он будет набирать (строка 49 кода).Вот мой код:

Я уже пробовал такие вещи, как onMouseUp или onDoubleClick (я знаю, что это не правильный код, но вы поняли).

# import statements import modules
from tkinter import *  # tkinter helps create GUI's
from pynput.keyboard import Key, Controller as keyboardController  # helps 
control keyboard functions
from pynput.mouse import Listener, Controller as mouseController  # helps 
control mouse functions
import time
import pyautogui


# since pynput.mouse and .keyboard have 'Controller' we have to rename them 
so 
both will work
keyboarad = keyboardController()
mouseclick = mouseController()

# defining some variables
root = Tk()
root.grid()
btn = {}
raw_col = 1


# product lists set into categories

product = [
            'product1',
            'product 2',
            'product 3',
            'product 4',
            'product 5'
]


def picker(product):

    time.sleep(3)
    keyboarad.type(product)
    time.sleep(.5)
    keyboarad.press(Key.tab)
    keyboarad.release(Key.tab)
    keyboarad.press(Key.tab)
    keyboarad.release(Key.tab)


# for each 'item in 'raw' list we want you to create a button
for item in product:

    btn[item] = Button(root, text=item, command=lambda x=item: picker(x), 
height=1, width=25)

    btn[item].grid(column=1, row=raw_col, pady=5, padx=5)
     raw_col += 1


mainloop() 

что на самом деле происходит вв тот момент, когда он ждет 3 секунды, затем печатает, что я хотел бы сделать, это на следующих типах кликов

Любая помощь будет принята с благодарностью, не только чтобы заставить ее работать, но и помочь мне учиться.

1 Ответ

0 голосов
/ 02 февраля 2019

Команда time.sleep(3) приостанавливает основной цикл на три секунды, в течение которых он не отвечает.Попробуйте вместо этого использовать after(), так как это запланирует действие на потом, но не приостанавливает основной цикл.

Обновление Мне кажется, я не совсем понял, о чем вы.Чтобы распечатать предыдущий выбор одним кликом, вам нужно каким-то образом сохранить состояние.В моем примере я просто использую глобальную переменную:

from tkinter import *

root = Tk()
button_dict = {}

# product lists set into categories
product_list = ['product 1', 'product 2', 'product 3', 'product 4', 'product 5']

def paste_to_invoice(p):
    # Just to have a function as placeholder for invoicing system
    print('Previous choice was:', p)

last_pick = None    # Global variable to hold previous selection
def picker(product):
    global last_pick
    if last_pick != None:   # Is there a previous choice?
        paste_to_invoice(last_pick)     # Then print it
    last_pick = product     # Save this choice for next click

# for each 'item in 'raw' list we want you to create a button
for row, item in enumerate(product_list):
    b = Button(root, text=item, command=lambda x=item: picker(x))
    b.grid(column=1, row=row+1, pady=5, padx=5)
    button_dict[item] = b  # Save reference to button

mainloop() 
...