在Tkinter的蟒蛇相对子窗口放置于母公司(Placing child window relati

2019-07-30 02:31发布

我有一个包含一个按钮,一个父部件。 当按下按钮,我想直接打开一个无国界的(即没有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()的去还是有更好的方法呢?

Answer 1:

简单的答案是,使用winfo_rootxwinfo_rooty获得相对于屏幕的坐标。 是的, wm_geometry是精确地放置一个顶层窗口的方式。

例如:

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

作为一个有点友好的建议,我建议不要缩写VAR NMS。 它使代码难以阅读,特别是当缩写是错误的(Wgdt至少应该Wdgt)。 之间的代码大小的区别geomgeometry ,以及WgdtWidget是微小的,但在可读性的差别是巨大的。



Answer 2:

根据传统知识手册“ 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
                         )
             ) 


文章来源: Placing child window relative to parent in Tkinter python