2012-06-22 27 views
3

我有一個包含按鈕的父窗口小部件。當按下按鈕時,我想打開一個無邊界(即沒有Windows裝飾按鈕)窗口直接在父窗口小部件的左側對齊。我感到困惑的是,設置窗口位置的唯一方式(看起來)是使用.geometry(),但更糟的是,我似乎無法獲得父窗口小部件的絕對座標 - 我需要的是.geometry(),只有偏移量來自父母的父母。到目前爲止,我的代碼是:在Tkinter python中放置相對於父項的子窗口

# 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()的路要走還是有更好的方法?

+0

你說你想創建一個彈出窗口,並且你的類名稱是PopUpWindow,但是你從Frame而不是Toplevel繼承。這是有原因的嗎?我不太明白你如何使用它。該按鈕是否顯示ChildPopUpWindow框架內的彈出窗口? –

+0

對不起,這不是很清楚:'onDropDown'是按鈕所在幀的處理程序。點擊按鈕時,想法是用按鈕彈出框架正下方的無框(即沒有Windows最大化/最小化/關閉按鈕等)。這將基本上以一種模式的方式起作用,除非彈出式選擇或再次按下按鈕將關閉它。通過這種方式,它有點像說日曆或顏色選擇器下拉菜單。 –

+0

@BryanOakley:恐懼會導致Toplevel/Frame混淆,這是因爲我做了許多不同的嘗試才得以實現。我發現的大多數例子似乎都創建了Toplevel窗口,然後將其作爲參數傳遞給Frame-inhereting類。我想遵循這一點,並嘗試在框架之前使用它們在構造函數中設置Toplevel窗口的參數,儘管我想將這些封裝在'ChildPopUpWindow'類中。請感受無限評論/改正。 –

回答

4

簡短的回答是,使用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之間的差異很小,但可讀性差異很大。

+0

感謝您的確認。這看起來基本上是我所得到的,所以我猜測一定有其他原因,它不起作用。同意縮寫:在發佈之前,我匆忙地將代碼(即客戶端IP)混淆。 –

0

根據傳統知識手冊「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 
         ) 
      ) 
相關問題