7

我有一个包含按钮的父小部件。当按下按钮时,我想直接在与左侧对齐的父小部件下方打开一个无边框(即没有 Windows 装饰按钮)窗口。我很困惑,设置窗口位置的唯一方法(似乎)是使用.geometry(),但更糟糕的是,我似乎无法获得父小部件的绝对坐标 - 我需要它.geometry(),只有来自父小部件的偏移量父母。到目前为止,我的代码是:

# This is the child which appears when the button is pressed.
class ChildPopUpWindow(Frame):
    def __init__(self, parentWgdt):
        win = Toplevel(parentWgdt)
        geom = str(parentWgdt.winfo_x()) + '+' + str(parentWgdt.winfo_y() + parentWgdt.winfo_height())
        win.overrideredirect(1) # No win decoration.
        win.bd = 10
        win.relief = GROOVE
        win.geometry( geom )
        Frame.__init__(self, win)
        # etc. etc.

     # ... and this is the handler for the button being pressed.
     def onDropDown(self):
        popUp = ChildPopUpWindow(self)

这确实会弹出一个窗口,但相对于桌面,而不是相对于父小部件。据我所知,它似乎也没有考虑边界厚度和浮雕。任何人都可以提供一种可以做到这一点的方法吗?是.geometry()要走的路还是有更好的方法?

4

3 回答 3

7

简短的回答是,使用winfo_rootxwinfo_rooty获取相对于屏幕的坐标。是的,这wm_geometry是精确放置顶层窗口的方法。

例如:

    x = parentWgdt.winfo_rootx()
    y = parentWgdt.winfo_rooty()
    height = parentWgdt.winfo_height()
    geom = "+%d+%d" % (x,y+height)

作为一个友好的建议,我建议不要使用 abbrev var nms。它使代码难以阅读,尤其是当缩写错误时(Wgdt 至少应该是 Wdgt)。geomgeometryWgdt和之间的代码大小差异Widget很小,但可读性差异很大。

于 2012-06-22T18:57:28.027 回答
0

为了使模态窗口围绕其父窗口居中,我这样做:

    alto_modal = 100
    ancho_modal = 250
    alto_parent = parent.winfo_height()
    ancho_parent = parent.winfo_width()
    x = (ancho_parent - ancho_modal) // 2
    y = (alto_parent - alto_modal) // 2
    self.geometry('{}x{}+{}+{}'.format(ancho_modal, alto_modal, x, y))
于 2020-09-23T21:25:12.530 回答
0

根据 Tk 手册“ https://www.tcl.tk/man/tcl8.4/TkCmd/winfo.htm#M52如果您在创建小部件后立即需要真实宽度,请调用更新以强制几何管理器安排它,或使用 winfo reqwidth 来获取窗口的请求宽度而不是其实际宽度。

# This code works perfectly
self.update()

self.geometry("+%d+%d" % (self.parent.winfo_rootx()+50,
                          self.parent.winfo_rooty()+50
                         )
             ) 
于 2016-12-08T01:20:19.753 回答