【问题标题】:How to make window look like a win10 widget. Python如何使窗口看起来像一个 win10 小部件。 Python
【发布时间】:2021-07-16 13:22:39
【问题描述】:

我正在尝试使用 Tkinter 创建一个显示天气的 Windows 应用程序,例如 Windows 10 小部件。我遇到的问题是我无法移除窗口的边框以使其看起来像一个真正的小部件。

这是它的外观以及我想要删除的内容:

self.root.overrideredirect(1) 有点用,但我仍然可以最小化窗口,这是我不希望出现的。

这就是我希望它的外观和行为:

总结一下:

  1. 如何正确禁用窗口标题和顶部的所有内容?
  2. 之后如何移动窗口,设置它在屏幕上的位置?

我是 Python 新手,感谢任何帮助。谢谢你们。和平

澄清一下:该应用应该不受 tab+alt(以及其他将其最小化的方法)的影响,并且始终位于桌面上,而不是位于任何其他应用之上,就在桌面上。

UPD

我错过了使用 win32gui 解决的问题是我无法按照我尝试的方式获取句柄,因为在创建窗口本身之前(在 mainloop 之前)获取句柄的代码所以 root.wait_visibility() 是我的解决方案。之后,我使用EnumWindows 获得了句柄,并按照我需要的方式定位了我的窗口,最后使用root.overrideredirect 禁用了边框。建议的解决方案也将被尝试。谢谢你的帮助!

桌面右上角:

【问题讨论】:

  • this 对您的第二点有帮助吗?当你调用.overrideredirect(True) 时,它会删除标题栏吗?
  • 这完全回答了我的问题。谢谢你。但是,似乎 .overrideredirect(True) 并没有使应用程序的行为像我在帖子中提到的那样。该应用程序应该不受 tab+alt(以及其他最小化它的方法)的影响,并且始终位于桌面上,而不是位于任何其他应用程序之上,就在桌面上。
  • 尝试here 中的topmost。这将强制窗口始终位于顶部。

标签: python user-interface tkinter


【解决方案1】:

你可以试试这个:

root.overrideredirect(1)
root.geometry('250x150+900+600')
#900+600 is x+y axis position of window

为了制作像小部件一样的关闭按钮,您可以在侧面制作透明框架,将按钮放在那里并在命令.destroy()

编辑
从 TheLizzard 的评论中,访问here 了解更多信息。从那里:

要使窗口可拖动,请将(鼠标点击)和(鼠标移动)的绑定放在窗口上。

import tkinter

class Win(tkinter.Tk):

    def __init__(self,master=None):
        tkinter.Tk.__init__(self,master)
        self.overrideredirect(True)
        self._offsetx = 0
        self._offsety = 0
        self.bind('<Button-1>',self.clickwin)
        self.bind('<B1-Motion>',self.dragwin)

    def dragwin(self,event):
        x = self.winfo_pointerx() - self._offsetx
        y = self.winfo_pointery() - self._offsety
        self.geometry('+{x}+{y}'.format(x=x,y=y))

    def clickwin(self,event):
        self._offsetx = event.x
        self._offsety = event.y


win = Win()
win.mainloop()

您可以在窗口顶部的某些部分而不是整个窗口中使用它。通过在那里制作新框架来实现它,以使您的小部件可移动。

TheLizzard 的第二条评论,请访问here 了解更多信息。从那里:

如果您希望窗口保持在所有其他窗口之上。

root.attributes("-topmost", True)

【讨论】:

  • 问个简单的问题:为什么需要透明画布?
  • 检查窗口小部件,关闭按钮在透明部分*。一边也是*
  • 我确实认为可以使用 win32gui 库来放置窗口。但我对它不够熟悉,无法做到。就像,我看到了这个库的一个想法,但我偶然发现了我无法正确获取窗口的 pyhandle 的问题,它必须是活动的,而我的不是。
  • @ГеоргийСадовой 如果您有 tkinter 执行相同操作的方法,则不应使用 win32gui。不太了解tcltkinter 使用的库)在内部如何工作,但您可能会使窗口状态在tcl 眼中无效。这可能会在以后使用问题。
  • @ГеоргийСадовой 没有这个答案或 TheLizzard 的评论解决了你的问题。你现在有什么问题?
猜你喜欢
  • 1970-01-01
  • 2011-08-04
  • 1970-01-01
  • 1970-01-01
  • 2012-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多