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_rootxとを使用することです。winfo_rootyそして、はい、それwm_geometryはトップレベルウィンドウを正確に配置する方法です。

例えば:

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

ちょっとしたアドバイスとして、略語varnmsを使用しないことをお勧めします。特に省略形が間違っている場合は、コードが読みにくくなります(Wgdtは少なくともWdgtである必要があります)。geomgeometry、およびWgdtとの間のコードサイズの違いWidgetはわずかですが、読みやすさの違いは非常に大きいです。

于 2012-06-22T18:57:28.027 に答える
0

Tkのマニュアル「https://www.tcl.tk/man/tcl8.4/TkCmd/winfo.htm#M52」 によると、ウィジェットを作成した直後に実際の幅が必要な場合は、updateを呼び出して、ジオメトリマネージャーに配置を強制します。または、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 に答える
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 に答える