打开 Tkinter Window 使其位于开始菜单栏上

Open Tkinter Window so it sits on start menu bar

我想在屏幕右下角或开始栏所在的位置打开一个 Tkinter window。很像当您点击膝上型电脑上的电池图标并弹出该框时。我的代码目前将它隐藏在开始菜单栏后面。我基本上喜欢它在右下角,但坐在开始菜单栏的顶部。另外,如果开始菜单不在底部,我不确定如何解决问题。

我的代码:

from Tkinter import *

def bottom_right(w=300, h=200):
    # get screen width and height
    screen_width = root.winfo_screenwidth()
    screen_height = root.winfo_screenheight()
    # calculate position x, y
    x = (screen_width - w)
    y = (screen_height-h)
    root.geometry('%dx%d+%d+%d' % (w, h, x, y))
root = Tk()
bottom_right(500, 300)
root.mainloop()

您所说的 'start menu bar' 通常称为任务栏,至少在 Windows 上是这样。 root.iconify() 将根 window 最小化到任务栏,无论它在哪里,就像单击 window 右上角的 [_] 一样。单击图标 de_iconifies 它,就像任何其他应用程序一样。

root = tk.Tk()
root.iconify()
<build gui>
root.deiconify()
root.mainloop()

是经过优化的应用程序中的一种常见模式,当该部分花费的时间足够长以导致潜在的可见构造时 activity。我相信将 gui 放入框架中并在最后一步打包框架具有相同的效果(隐藏构造)。

可以用win32api.GetMonitorInfo()找到显示器的'working area',也就是没有任务栏的显示器区域。然后,查看任务栏在哪里,您可以将 window 放在工作区的一角。看这个例子:

import win32api
import Tkinter as tk

for monitor in win32api.EnumDisplayMonitors():
    monitor_info = win32api.GetMonitorInfo(monitor[0])
    if monitor_info['Flags'] == 1:
        break

work_area = monitor_info['Work']
total_area = monitor_info['Monitor']

width = 300
height = 200

side = [i for i in range(4) if work_area[i]!=total_area[i]]

# Left
if side ==[0]:
    x = str(work_area[0])
    y = str(work_area[3]-height)
# Top
elif side == [1]:
    x = str(work_area[2]-width)
    y = str(work_area[1])
# Right
elif side == [2]:
    x = str(work_area[2]-width)
    y = str(work_area[3]-height)
# Bottom
elif side == [3]:
    x = str(work_area[2]-width)
    y = str(work_area[3]-height)
else:
    x = str(work_area[2]-width)
    y = str(work_area[3]-height)

geom = '{}x{}+{}+{}'.format(width, height, x, y)

root = tk.Tk()
root.configure(background='red')
root.geometry(geom)
root.overrideredirect(True)
root.mainloop()

请注意,我已经使用 overrideredirect 去除了 window 的框架,因为这会稍微影响放置。