簡體   English   中英

使用PyGTK / win32,如何在其父窗口附近放置一個新窗口,但不在屏幕外?

[英]With PyGTK/win32, how do I place a new window near its parent but not off-screen?

Windows上運行PyGTK的情況下 ,我希望在父窗口附近彈出一個新窗口,但不要在屏幕外顯示。

我在Windows 7Windows XP的 Microsoft Wordpad中都觀察到了我想要的行為。 如果您使窗口很小,並將其移至桌面的右下角,請在文本字段中單擊鼠標右鍵,然后打開“ 段落”菜單,該對話框將完全可見。 即使“ 寫字板”窗口部分不在屏幕上,也會發生這種情況。 子對話框不會在相對於主窗口的固定位置彈出。 它只是近距離彈出,並且完全可見。

我的應用程序由一個主屏幕組成,該主屏幕會生成子窗口,這些子窗口會阻塞應用程序的其余部分,直到用戶完成使用它們為止。 用戶可能必須依次打開和關閉許多子窗口,因此我希望它們出現在單擊按鈕的位置附近,因此用戶不必將鼠標移到整個屏幕上。

我嘗試使用gtk.WIN_POS_MOUSE ,但是當主菜單靠近屏幕邊緣時; 產生的子窗口通常最終部分離開屏幕。

我希望在子窗口上調用set_transient_for(main_menu)會通知Windows我希望我的窗口位於其父窗口附近。 但是, Windows只是將其放在桌面的左上方-甚至不一定與主菜單位於同一屏幕上。

下面的代碼將通過在屏幕左下方彈出一個窗口來演示該問題,該窗口包含一個按鈕,單擊該按鈕可生成一個子窗口:

import gtk

class MyWindow(gtk.Window):
    def __init__(self):
        gtk.Window.__init__(self)
        self.connect("delete-event",self.on_delete_event)
        button = gtk.Button("Open Subwindow")
        button.connect("clicked",self.open_sub_window)
        self.add(button)
        self.set_gravity(gtk.gdk.GRAVITY_SOUTH_EAST)
        self.show_all()
        width, height = self.get_size()
        self.move(gtk.gdk.screen_width() - width, gtk.gdk.screen_height() - height)

    def on_delete_event(self, widget=None, data=None):
        gtk.main_quit()

    def open_sub_window(self, widget=None, data=None):
        w = gtk.Window()
        w.set_size_request(200,200)
        w.set_transient_for(self)
        w.set_position(gtk.WIN_POS_CENTER_ON_PARENT)
        w.show()

if __name__=="__main__":
    MyWindow()
    gtk.main()

如您所見,sub_window在屏幕外部分顯示。 如果注釋掉w.set_position(gtk.WIN_POS_CENTER_ON_PARENT)行,您將看到Windows窗口管理器僅將子窗口放在桌面的左上角。 不是很有用!

有沒有一種方法可以通過不檢查窗口的最終位置,然后將窗口移到完全不在屏幕上的位置來手動管理窗口的位置,從而獲得所需的行為?

更新:我於2011年2月23日提交了pyGTK的錯誤報告: http ://bugzilla.gnome.org/show_bug.cgi?id=643138

它尚未收到開發人員或其他用戶的任何回復。 如果您遇到此問題,請及時解決該錯誤,以便對其進行修復(或使我們獲得解決方法)。

在我的Windows 7系統上,彈出窗口出現在主窗口的中央。 我有一個問題:您為什么要使用窗口而不是對話框?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM