2013-11-14 44 views
0

我想弄清楚wxpython中兩個按鈕的位置。我有一個gui,左邊是一個小垂直面板,右邊是大面板。在wxpython中獲取按鈕的位置

wx.Frame.__init__(self, *args, **kwds) 

    self.Splitter = wx.SplitterWindow(self, -1)#, style=wx.SP_NOSASH) 

    self.Panel1 = wx.Panel(self.Splitter, -1)   
    self.Panel3 = wx.Panel(self.Splitter, -1) 

    self.Splitter.SplitVertically(self.Panel1,self.Panel3,350) 

在右側面板(筆記本電腦),我使用垂直儀堆棧三米板:

self.Notebook3 = wx.Notebook(self.Panel3, -1) 
    self.OptPane = scrolled.ScrolledPanel(self.Notebook3, -1) 

    self.pane1 = wx.Panel(self.OptPane,-1, style=wx.NO_BORDER) 
    self.pane2 = wx.Panel(self.OptPane,-1, style=wx.RAISED_BORDER) 
    self.pane3= wx.Panel(self.OptPane,-1, style=wx.NO_BORDER) 

我窗格3包含了使用gridsizer(一行舉辦的三個按鈕,三列)。這一切看起來不錯。現在,我希望能夠獲得三個按鈕的屏幕位置(它們根據屏幕分辨率,調整gui大小的人等而改變)。

我的屏幕尺寸是(1920,1080),它來自wx.GetDisplaySize()。我試過self.button1.GetScreenPosition()和self.pane3.GetScreenPosition和self.button1.GetPosition()。第一個返回位置(77,93),第二個返回(61,95),最後一個返回給我(0,0)。在用testtext = wx.StaticText(self.Notebook3, -1, 'X marks spot',pos=(240,820))進行測試後,我發現我想要返回的按鈕的位置(240,820) - 大約。這是我想要返回的號碼。

有誰知道我在做什麼錯?謝謝!

* 編輯 *

我全碼 - 應該是可運行的 - 我在1920×1080的運行此(文本「X標記的點」)。

import wx 
import wx.lib.scrolledpanel as scrolled 

class TMainForm(wx.Frame): 

    def __init__(self, *args, **kwds): 

     kwds["style"] = wx.DEFAULT_FRAME_STYLE 
     wx.Frame.__init__(self, *args, **kwds) 

     self.Splitter = wx.SplitterWindow(self, -1) 

     self.Panel1 = wx.Panel(self.Splitter, -1)   
     self.Panel3 = wx.Panel(self.Splitter, -1) 

     self.Splitter.SplitVertically(self.Panel1,self.Panel3,350) 

     self.Notebook2 = wx.Notebook(self.Panel1, -1) 

     self.Notebook3 = wx.Notebook(self.Panel3, -1) 
     self.OptPane = scrolled.ScrolledPanel(self.Notebook3, -1) 
     self.OptPane.SetupScrolling() 

     self.Opt_Info = wx.Panel(self.OptPane,-1, style=wx.NO_BORDER) 
     self.Opt_Middle = wx.Panel(self.OptPane,-1, style=wx.RAISED_BORDER) 
     self.Opt_Buttons = wx.Panel(self.OptPane,-1, style=wx.NO_BORDER) 

     self.Button1 = wx.Button(self.Opt_Buttons,-1,'Button1',size=(-1,-1)) 
     self.Button2 = wx.Button(self.Opt_Buttons,-1,'Button2',size=(-1,-1)) 
     self.Button3 = wx.Button(self.Opt_Buttons,-1,'Button3',size=(-1,-1)) 

     self.MainMenu = wx.MenuBar() 
     self.FileMenu = wx.Menu() 
     self.FileOpenItem = wx.MenuItem(self.FileMenu, 103, "&Open\tCtrl+O", "Open a Previous Session", wx.ITEM_NORMAL) 
     self.FileMenu.AppendItem(self.FileOpenItem) 
     self.FileSaveItem = wx.MenuItem(self.FileMenu, 102, "&Save\tCtrl+S", "Save the data", wx.ITEM_NORMAL) 
     self.FileMenu.AppendItem(self.FileSaveItem) 
     self.FileQuitItem = wx.MenuItem(self.FileMenu, wx.ID_EXIT, "&Quit\tCtrl+Q", "Quit the program", wx.ITEM_NORMAL) 
     self.FileMenu.AppendItem(self.FileQuitItem) 
     self.MainMenu.Append(self.FileMenu, "&File") 
     self.SetMenuBar(self.MainMenu) 

     self.__set_properties() 
     self.__do_layout() 

     print self.Button1.GetScreenPosition() 
     testtext = wx.StaticText(self.Notebook3, -1, 'X marks spot',pos=(240,840)) 

    def __set_properties(self): 

     self.SetTitle("My Program") 

     screen_x = 95 * wx.GetDisplaySize()[0]/100 
     screen_y = 90 * wx.GetDisplaySize()[1]/100 
     self.SetSize((screen_x, screen_y)) 
     self.SetFocus() 

    def __do_layout(self , call_fit = True, set_sizer = True): 

     vbox = wx.BoxSizer(wx.VERTICAL) 

     hbox1 = wx.BoxSizer(wx.HORIZONTAL) 
     hbox2 = wx.BoxSizer(wx.HORIZONTAL) 
     hbox3 = wx.BoxSizer(wx.HORIZONTAL) 

     hbox1.Add(self.Opt_Info, 1, wx.EXPAND|wx.ALL, 3) 
     hbox2.Add(self.Opt_Middle, 1, wx.EXPAND|wx.ALL, 3) 
     hbox3.Add(self.Opt_Buttons, 1, wx.EXPAND|wx.ALL, 3) 

     box_bot = wx.GridSizer(1,3,2,2) 

     box_bot.Add(self.Button1, 1, wx.ALIGN_CENTER| wx.LEFT | wx.RIGHT, 55)  
     box_bot.Add(self.Button2, 1, wx.ALIGN_CENTER| wx.LEFT | wx.RIGHT, 55) 
     box_bot.Add(self.Button3, 1, wx.ALIGN_CENTER| wx.LEFT | wx.RIGHT, 55) 

     self.Opt_Buttons.SetSizer(box_bot) 

     vbox.Add(hbox1, 0, wx.EXPAND|wx.TOP, 20) 
     vbox.Add(hbox2, 1, wx.EXPAND|wx.TOP, 50) 
     vbox.Add(hbox3, 0, wx.EXPAND|wx.ALL, 20) 
     self.OptPane.SetSizer(vbox) 

     self.Notebook3.AddPage(self.OptPane,"Page1") 

     #Sizer for Panel 2 
     sizer_P2 = wx.BoxSizer(wx.VERTICAL) 
     sizer_P2.Add(self.Notebook2, 1, wx.EXPAND, 0) 
     self.Panel1.SetSizer(sizer_P2) 

     #Sizer for Panel 3 
     sizer_P3 = wx.BoxSizer(wx.VERTICAL) 
     sizer_P3.Add(self.Notebook3, 1, wx.EXPAND, 0) 
     self.Panel3.SetSizer(sizer_P3) 

     # Split Panel Sizer 
     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(self.Splitter,1,wx.EXPAND) 
     self.SetSizer(sizer) 

     self.Layout() 
     self.Centre() 

# Code to Execute File 
class TApplication(wx.App): 
    def OnInit(self): 

      wx.InitAllImageHandlers() 
      MainForm = TMainForm(None, -1,"") 
      self.SetTopWindow(MainForm) 

      MainForm.Show() 
      return 1 

if __name__ == "__main__": 
    Application = TApplication(0) 
    Application.MainLoop() 
+0

您可以張貼在鍵盤什麼的一個完整的可運行的例子嗎?包括你的尺寸和按鈕...... –

+0

顯示更多的代碼,因爲我在'.GetScreenPosition()'沒有問題。 – furas

+0

請參閱上文。謝謝! – mcfly

回答

2

我認爲你要求的位置過早。在將所有內容渲染到屏幕後,您都希望獲得位置,因此您可能需要使用wxPython的CallAfter。創建一個看起來像這樣的方法:

def printLocation(self): 
    """""" 
    print self.Button1.GetScreenPosition() 

然後在你初始化的末尾添加以下行:

wx.CallAfter(self.printLocation) 

當我跑了我的系統上,我得到了(155 ,211),這可能更接近你正在尋找的東西。我在這裏有一個相當奇怪的解決方案。

您可能還想看看這個討論滾動窗口的CalcUnscrolledPosition方法的線程。

+0

這確實會改變數字。但是,它使我處於(pane)2的(179,691)處。還是有點關閉。 – mcfly

+1

奇怪。你可以嘗試使用WidgetInspectionTool來解決這個問題。見http://wiki.wxpython.org/Widget%20Inspection%20Tool它可以告訴你小部件的位置。 –

+0

首先 - 這是一個甜蜜的工具!我跑了這個,它說這個按鈕在Widget下的pos(166,0)和SizerItem下的(222,28)。這仍然沒有意義... – mcfly