【问题标题】:How can I select window on hover? (Tkinter)如何在悬停时选择窗口? (Tkinter)
【发布时间】:2021-04-09 04:58:48
【问题描述】:

是否可以通过将鼠标悬停在窗口上滚动文本框,即无需单击 GUI?我正在使用 tkinter 开发程序。

【问题讨论】:

  • 我真正能想到的唯一解决方案是,首先使用 topmost 属性,其次,跟踪鼠标位置,如果它进入窗口,则将焦点设置为它
  • 关于我的回答:它可以工作,但必须进行调整,因为例如,如果有一个小部件不是根小部件,那么如果焦点在小部件上,例如条目和鼠标移开,但仍在窗口内,条目小部件将失去焦点
  • 我的另一个建议是,在跟踪运动的那个函数中,您放置一个 while True 循环,在其中放置给定的循环和一个在有焦点时将起作用的循环,当没有焦点时将检查然后它会爆发并移动到第一个厕所
  • 以防万一你没有注意到我编辑了我的答案和代码,以便解决前面提到的一些问题。

标签: python tkinter


【解决方案1】:

所以这是我的解决方案:

from tkinter import Tk, Entry
import pyautogui
from _thread import start_new_thread


def track_motion(root):
    while True:
        while True:
            window_xtl = root.winfo_x()
            window_ytl = root.winfo_y()
            window_xbr = window_xtl + root.winfo_width()
            window_ybr = window_ytl + root.winfo_height()

            mouse_pos = pyautogui.position()
            mouse_x = mouse_pos[0]
            mouse_y = mouse_pos[1]

            if window_xtl < mouse_x < window_xbr and window_ytl < mouse_y < window_ybr:
                for _ in range(500):
                    root.focus_force()

                while True:
                    window_xtl = root.winfo_x()
                    window_ytl = root.winfo_y()
                    window_xbr = window_xtl + root.winfo_width()
                    window_ybr = window_ytl + root.winfo_height()

                    mouse_pos = pyautogui.position()
                    mouse_x = mouse_pos[0]
                    mouse_y = mouse_pos[1]

                    if window_xtl > mouse_x or mouse_x > window_xbr or window_ytl > mouse_y or mouse_y > window_ybr:
                        break


root = Tk()
root.geometry('300x300')
root.attributes('-topmost', True)

start_new_thread(track_motion, (root, ))

entry = Entry(root)
entry.pack()

entry2 = Entry(root)
entry2.pack()

root.mainloop()

为此,您必须使用 pip 安装 pyautoguipip install pyautogui。它的工作方式是第一个窗口总是在顶部,这很重要,否则突然弹出一个窗口会显得很奇怪。

这里发生的情况是,首先我们在一个单独的线程中运行该函数,这样它就不会干扰 tkinter 的 .mainloop()。在该循环中,我们检查当前窗口位置和当前鼠标位置,然后检查鼠标的xy 坐标是否在窗口的坐标内,以及它们是否设置为该窗口的焦点。

我对代码做了一些更改。我添加了另一个循环来关闭聚焦,以便可以使用其他小部件。还注意到 pyautogui 不返回指针尖端的位置,这意味着可以在获得焦点之前稍微向内移动指针。还有那个 for 循环,因为出于某种原因需要它,否则它不会获得焦点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    • 2019-03-08
    • 2019-05-25
    • 1970-01-01
    相关资源
    最近更新 更多