I am using Tkinter for my camera's control to tweak shutter speed and analog gain. I am able to tweak both settings via mouse and take pictures using a button via GPIO.
After testing on my touchscreen however, I realised that the buttons did not respond when tapped upon via touchscreen, unless my mouse is on the window/canvas.
I am using Raspberry Pi Bookworm.
I have searched and came upon a few solutions such as binding to Button-1 which I've declared in my for loop to no avail.(button.bind("", command)).
I've also tried using xte 'movemouse 0 0' to move my cursor to where my camera controls would be but it did not seem to move.
Below is a snippet of how can I declared Tkinter. Do let me know if more code is required.
def switch_to_photo_config(): global camera_config picam2.stop() picam2.configure(camera_config) picam2.start()def switch_to_video_config(): picam2.stop() picam2.configure(picam2.create_video_configuration()) picam2.start()def minimize_window(): root.withdraw() minimize_button.place_forget() restore_button.place(x=10, y=10)def restore_window(): root.deiconify() restore_button.place_forget() minimize_button.place(x=10, y=10)def exit_app(): picam2.stop_preview() root.destroy() sys.exit()def toggle_mode(): global picture_or_video picture_or_video = not picture_or_video if picture_or_video: switch_to_photo_config() else: switch_to_video_config() updatecameracontrols() update_labels()def update_labels(): global current_shutter_speed, analoglevel shutter_label.config(text=f"Shutter Speed: {current_shutter_speed}") analog_label.config(text=f"Analogue Level: {analoglevel}") mode_label.config(text=f"Mode: {'Camera' if picture_or_video else 'Video'}")def updatecameracontrols(): global current_speed_index, analoglevel, current_shutter_speed current_shutter_speed = shutter_speed_values[current_speed_index] picam2.set_controls({"ExposureTime": shutter_speed_values[current_speed_index],"AnalogueGain": analoglevel }) update_labels()def shutterup(): global current_speed_index current_speed_index -= 1 if current_speed_index < 0: current_speed_index = 0 updatecameracontrols()def shutterdown(): global current_speed_index current_speed_index += 1 if current_speed_index >= len(shutter_speed_values): current_speed_index = len(shutter_speed_values) - 1 updatecameracontrols()def analogup(): global analoglevel analoglevel += 1 updatecameracontrols()def analogdown(): global analoglevel analoglevel -= 1 updatecameracontrols()root = tk.Tk()root.title("Camera Interface")root.attributes("-topmost", True)root.overrideredirect(True)root.attributes('-alpha', 0.0)screenwidth = root.winfo_screenwidth()screenheight = root.winfo_screenheight()xpos = 0ypos = 120root.geometry(f"{screenwidth // 4}x{screenheight}+{xpos}+{ypos}")button_window = tk.Toplevel(root)button_window.overrideredirect(True)button_window.wait_visibility()button_window.attributes('-alpha', 0.0)button_width = 45 # 9 characters width for each button, 10 buttonsbutton_height = 40 # 5 characters height for each button, 3 rows of buttonsxpos = -10 # x position from the leftypos = -10 # y position from the topbutton_window.geometry(f"{button_width}x{button_height}+{xpos}+{ypos}")picture_or_video = Truecanvas = tk.Canvas(root, borderwidth=0, highlightthickness=0)canvas.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True)scrollable_frame = ttk.Frame(canvas)scrollable_frame.pack(fill=tk.BOTH, expand=True)scrollbar = ttk.Scrollbar(root, orient=tk.VERTICAL, command=canvas.yview)scrollbar.pack(side=tk.RIGHT, fill=tk.Y)canvas.configure(yscrollcommand=scrollbar.set)canvas.create_window((0, 0), window=scrollable_frame, anchor="nw")buttons = [ ("Toggle Mode", toggle_mode), ("Exit", exit_app), ("Shutter Up", shutterup), ("Shutter Down", shutterdown), ("Analog Up", analogup), ("Analog Down", analogdown)]num_columns = 2for i, (text, command) in enumerate(buttons): button = tk.Button(scrollable_frame, text=text, command=command, width=9, height=5, bg='#ADD8E6') button.config(activebackground='#D3D3D3') row = i // num_columns col = i % num_columns button.grid(row=row, column=col, padx=0, pady=0)mode_label = tk.Label(scrollable_frame, text=f"Mode: {'Camera' if picture_or_video else 'Video'}", font=("Arial", 10))mode_label.grid(row=len(buttons)//num_columns + 2, column=0, columnspan=num_columns, padx=0, pady=0)shutter_label = tk.Label(scrollable_frame, text=f"Shutter Speed: {current_shutter_speed}", font=("Arial", 10))shutter_label.grid(row=len(buttons)//num_columns, column=0, columnspan=num_columns, padx=0, pady=0)analog_label = tk.Label(scrollable_frame, text=f"=Analogue Level: {analoglevel}", font=("Arial", 10))analog_label.grid(row=len(buttons)//num_columns + 1, column=0, columnspan=num_columns, padx=0, pady=0)minimize_button = tk.Button(button_window, text="-", command=minimize_window, bg='#ADD8E6', activebackground='#D3D3D3')minimize_button.place(x=10, y=10)restore_button = tk.Button(button_window, text="+", command=restore_window, bg='#ADD8E6', activebackground='#D3D3D3')restore_button.place_forget()scrollable_frame.update_idletasks()canvas.configure(scrollregion=canvas.bbox("all"))root.mainloop()