I want to trigger an action on button press whatever I'm doing in the program. This button press have to change a global value necessary to do some different action based on this value. In the while loop I'm reading from RFID module if a valid card are detected. When I press the button without reading a card, the program runs well, but when I detect a card, the button doesn't trigger my callback function.
Here's the code:
http://pastebin.com/cvtehZyZ
Related
I want to make a program or when I click on a key the mouse clicks automatically (as long as I click on the key) if I do not click on the key it stops.
I don't want the clicks to happen only when I touch the key once, but as long as the key is held down (It can also be the left button of the mouse pressed that trigger clicks like razer synapse mouses)
Any Idea ?
EDIT 1 :
This one works but not when a key is held down (even when the click is held down it doesn't work anyway) it only detects a single click on the mouse and then it clicks by itself instead of clicking ONLY when the key is held down...
import pyautogui, time
from pynput import mouse
from pynput.mouse import Button,Controller
from tkinter import *
from tkinter import ttk
root = Tk()
root.geometry('500x400')
combo = ttk.Combobox(root,values=['ctrl','shift','alt'],width=5)
combo.set('Key...')
combo.pack()
def on_click(x, y, button, pressed):
if button == mouse.Button.left:
while pressed:
pyautogui.click()
pyautogui.PAUSE = 0.1
else:
return False
with mouse.Listener(
on_click=on_click
) as Listener:
Listener.join()
root.mainloop()
You can use the mouse module (pip install mouse) to setup mouse hooks (hotkeys) that will let you trigger the clicking globally. However, in order to manage the beginning and end of this clicking, you will need to use a new thread (here is a short intro to threading if you want to learn more about it). You will want to start a thread when you press down your hotkey. This thread will continuesly click until you trigger an event that stops it. You will trigger this event by releasing your hotkey. Thus, the thread (and with it the clicking) will begin when you press the hotkey down and end when you let it back up.
Here is a piece of code that does exactly that using the middle (scroll) mouse button as the hotkey:
import mouse # pip install mouse
import threading
import pyautogui
pyautogui.PAUSE = 0.1 # set the automatic delay between clicks, default is 0.1
def repeat_function(kill_event):
# as long as we don't receive singal to end, keep clicking
while not kill_event.is_set():
pyautogui.click()
while True:
# create the event that will kill our thread, don't trigget it yet
kill_event = threading.Event()
# create the thread that will execute our clicking function, don't start it yet
new_thread = threading.Thread(target=lambda: repeat_function(kill_event))
# set a hook that will start the thread when we press middle mouse button
mouse.on_button(new_thread.start, (), mouse.MIDDLE, mouse.DOWN)
# set a hook that will kill the thread when we release middle button
mouse.on_button(kill_event.set, (), mouse.MIDDLE, mouse.UP)
# wait for user to use the hotkey
mouse.wait(mouse.MIDDLE, mouse.UP)
# remove hooks that used the killed thread and start again with a new one
mouse.unhook_all()
If you want to use the right mouse button instead, replace mouse.MIDDLE with mouse.RIGHT. I would not recommend using the left mouse button as the hotkey, as pyautogui will simulate clicking this button and likely break the program. If you want to use a key on the keyboard as the hotkey, check out the keyboard module. The concept there is the exact same.
Note that as this code is implemented, it will not be able to do anything else while waiting for the hotkey and processing it. You will need to use it as a separate python program if you want to use it as-is. You could also implement this code to run in a separate thread during another program, but it would definitely be easier to just launch it as a stand-alone script.
my goal is to launch a function in python by simply clicking on the enter key on my keyboard instead of the push button (using Qtdesigner). To put you in context, I have a barcode scanner, this one will read the code and write it in a lineEdit, the scanner is programmed to press enter directly, I would like to take this opportunity to perform my search function instead of clicking the button.
I hope I was clear, you can contact me for more information. Thank you in advance dear community.
for some context, I'm trying to make a python program that left-clicks for you when the left mouse button is held down.
This is how it works: while True:
keystate = win32api.GetAsyncKeyState(0x02) or win32api.GetAsyncKeyState(0x01)
if left_clicker == 'true':
if keystate == win32api.GetAsyncKeyState(0x01):
ac()
if keystate == win32api.GetAsyncKeyState(0x02):
if right_clicker == 'true':
rightac()
The ac() loop clicks and then waits for a delay, and then repeats the loop. However, when I run the code, I hold down the mouse button, it clicks once, and then stops. The reason is the program reads the left click sent by Python and sees that the left mouse button has been released (which must happen upon click or the loop will run indefinitely regardless of how the user interacts with the mouse). So, is there any way I can let Python differentiate clicks sent by the program and directly by the user so it won't stop itself? The only workaround I have found is using a different button to trigger the loop, but that's not really what I'm trying to do. Please ask for clarification if needed
I have tried using Pynput and PyAutoGUI as the method for clicking the mouse, both had the same issue. I don't know of any other libraries that can click the mouse and I'm out of ideas on how to solve this.
So I was wondering if someone would be able to help shed a little light for me on something I am working on in Python.
I am creating a program with a Tkinter GUI interface that interacts with a Serial device, and an ADC chip to measure voltage. I want to make sure I properly understand how I'm building the main program loop to keep everything running smoothly. I'm going to lay out how I think the program should run, if anyone has any corrections please throw them at me.
Program is run, GUI Interface initializes
User presses a button
send signal of button through serial
measure/display voltage levels
periodically update voltage display
if button is pressed, return to step 3
Now I know to run my Tkinter GUI I set up mainloop() as the last line of code. Now my question is simply, is that all I will need? Will mainloop() continually update while it waits for another button press, or will I essentially have to creatre an update method that cycles through everything until another button is pressed?
Will mainloop() continually update while it waits for another button press, or will I essentially have to creatre an update method that cycles through everything until another button is pressed?
Not all. That's why you are using tk.Tk().mainloop(). tkinter does this for you. All you are expected to do is implement the functionality that should happen when your button is pressed. tkinter will listen for the button press.
I want some of my class functions to be called when a some keyboard keys are pressed, no matter which window is active. how to do that in LINUX. What I was using until now is OpenCV and waitKey() function but for that I need to show a window and have it active when pressing a keyboard key. I do have a main loop always running where the pressed key can be checked but it would be nice to have a solution where no loop is needed.