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