You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派Bookworm下Tkinter触摸屏仅鼠标悬停时响应点击问题

Raspberry Pi Bookworm下Tkinter触摸屏点击无响应问题

问题描述

我用Tkinter开发了相机控制界面,可调节快门速度、模拟增益,鼠标操作正常,GPIO按钮拍照也没问题。但在触摸屏测试时,只有鼠标悬停在窗口/画布上时,触摸屏点击按钮才会响应,否则完全没反应。使用的是Raspberry Pi Bookworm系统,试过循环绑定Button-1事件没用,也试过xte 'movemouse 0 0'移动光标到控制区域,同样失败。

代码片段

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 = 0
ypos = 120
root.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 buttons
button_height = 40  # 5 characters height for each button, 3 rows of buttons
xpos = -10  # x position from the left
ypos = -10  # y position from the top
button_window.geometry(f"{button_width}x{button_height}+{xpos}+{ypos}")

picture_or_video = True
canvas = 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 = 2

for 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()

内容的提问来源于stack exchange,提问作者user24441164

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 18:13:17