Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Tkinter python中相对于父窗口放置子窗口_Python_Window_Tkinter_Coordinates - Fatal编程技术网

在Tkinter python中相对于父窗口放置子窗口

在Tkinter python中相对于父窗口放置子窗口,python,window,tkinter,coordinates,Python,Window,Tkinter,Coordinates,我有一个包含按钮的父窗口小部件。当按下按钮时,我想在与左侧对齐的父窗口小部件正下方打开一个无边框(即没有窗口装饰按钮)窗口。设置窗口位置的唯一方法(似乎)是使用.geometry(),这让我感到困惑,但更糟糕的是,我似乎无法获得父窗口小部件的绝对坐标,而我需要的是.geometry(),只有父窗口的偏移量。到目前为止,我的代码是: # This is the child which appears when the button is pressed. class ChildPopUpWindo

我有一个包含按钮的父窗口小部件。当按下按钮时,我想在与左侧对齐的父窗口小部件正下方打开一个无边框(即没有窗口装饰按钮)窗口。设置窗口位置的唯一方法(似乎)是使用
.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()
是正确的方法还是有更好的方法?

简单的回答是,使用
winfo\u rootx
winfo\u 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)。
geom
geometry
以及
Wgdt
Widget
之间的代码大小差异很小,但可读性差异很大。

根据Tk手册“ 如果在创建小部件后立即需要真实宽度,请调用update强制几何体管理器对其进行排列,或使用winfo reqwidth获取窗口的请求宽度,而不是实际宽度

# This code works perfectly
self.update()

self.geometry("+%d+%d" % (self.parent.winfo_rootx()+50,
                          self.parent.winfo_rooty()+50
                         )
             ) 

要使模态窗口围绕其父窗口居中,请执行以下操作:

    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))

你们说你们想创建一个弹出窗口,你们的类名是PopUpWindow,但你们继承的是Frame而不是Toplevel。这有什么原因吗?我不太明白你怎么用这个。是在ChildPopUpWindow框架内显示弹出窗口的按钮吗?抱歉,这不是很清楚:
onDropDown
是按钮所在框架中的处理程序。点击按钮后,想法是用按钮直接在框架下方弹出一个无框架(即没有窗口最大化/最小化/关闭按钮等)。这基本上是以模态方式进行的,除非弹出窗口上的选择或再次按下按钮会将其关闭。这样的话,它会有点像日历或颜色选择器下拉菜单。@BryanOakley:顶层/框架的混乱是因为我做了许多不同的尝试来让它工作,我担心。我发现的大多数示例似乎都是创建顶级窗口,然后将其作为参数传递给类中的框架。我想遵循这一点,并尝试在框架使用它们之前在其构造函数中设置顶级窗口的参数,尽管我想将这些参数封装在
ChildPopUpWindow
类中。请随意评论/更正。谢谢您的确认。这看起来基本上就是我所拥有的,所以我猜一定有其他原因,它不起作用。在缩写上达成一致:在发布之前,我匆忙地混淆了代码(即客户端IP)。