2012-11-03 42 views
3

我想實現一個狀態欄與2個字段。第一個是左對齊的,第二個是右對齊的。我想要的插圖:如何將狀態欄中的文本與wxPython中的文本對齊?

 
|                    | 
|                    | 
================================================================================= 
| Some status text.             v. 1.0.32 | 

我當前的代碼:

self.CreateStatusBar(2) 
self.SetStatusWidths([-1, -1]) 

但正確的字段左對齊,所以它看起來是這樣的:

 
|                    | 
|                    | 
================================================================================= 
| Some status text.      v. 1.0.32        | 

有什麼辦法讓正確的字段中的文本對齊到正確的位置?

回答

4

好吧,我已經解決了這個問題(即使它感覺像是黑客)。我創建了一個定義兩個字段的自定義工具欄。左側字段可以像正常一樣進行控制,右側字段包含一個StaticText控件,其中包含手動定位的版本號。定位文本的代碼是特定於平臺的,因爲它在窗口上看起來有些不同。下面是一些截圖:

的Windows 7:

Windows 7

OSX 10.8.1山獅:

OSX

這是自定義狀態欄的代碼:

class CustomStatusBar(wx.StatusBar): 
    """A custom status bar for displaying the application version in the bottom 
    right corner.""" 
    def __init__(self, parent): 
     wx.StatusBar.__init__(self, parent, -1) 

     self.SetFieldsCount(2) 
     self.SetStatusWidths([-1, -1]) 

     # Set up the version label. 
     self.version_label = wx.StaticText(self, -1, 'Version: ' + VERSION) 
     self.reposition_version_label() 

     # Listen to the resize event. 
     self.Bind(wx.EVT_SIZE, self.on_resize) 

    def on_resize(self, event): 
     self.reposition_version_label() 

    def reposition_version_label(self): 
     # Get the rect of the second field. 
     field_rect = self.GetFieldRect(1) 
     label_rect = self.version_label.GetRect() 

     # Reduce the width of the field rect to the width of the label rect and 
     # increase it's x value by the same about. This will result in it being 
     # right aligned. 
     width_diff = field_rect.width - label_rect.width 

     field_rect.width = label_rect.width 
     field_rect.x += width_diff 

     # On windows, the text is a little too high up, so increase the Y value 
     # a little. 
     if sys.platform == 'win32': 
      field_rect.y += 3 

     # Set the resulting rect to the label. 
     self.version_label.SetRect(field_rect) 

此代碼位於我的Frame的構造函數來創建和放置狀態欄:

self.statusbar = CustomStatusBar(self) 
self.SetStatusBar(self.statusbar) 

我添加了這個功能,我的框架,便於狀態更新:

def set_status_text(text): 
    self.statusbar.SetStatusText(text, 0) 

我希望這可以幫助其他人下了線。

3

您可以嘗試使用製表符:

self.SetStatusText(0,"\tCentered") 
self.SetStatusText(1,"\t\tRight Aligned") 

這適用於Windows,但我不知道這是否在其他的wxWidgets分佈實現真實。您需要創建帶有style=0的wx.StatusBar以禁用右下角的抓取。文本對齊並沒有考慮到它,它會被切斷。如果不工作,你可以通過你的右側面板中設置爲靜態尺寸模擬右文本對齊方式:

self.SetStatusWidths([-1, 100]) 

,但其上的文字將保持左對齊。爲了使其上的文本看起來正確對齊,你必須用空格填充文本。請記住,不同的系統和用戶可能會使用不同的字體,因此間距可能不準確。

附錄:將文本與\t對齊實際上是本機windows狀態欄控件的一個功能。爲了讓它在其他操作系統上工作,它們的本地控件或wxWidgets將不得不實現該行爲。

+0

+1我設法完成我試圖使用自定義狀態欄做。謝謝你的提示。儘管我可能會接受我自己的答案,因爲它詳細描述了我最終做了什麼。 – Hubro

0

hacky版本並不完全適合我所尋找的。我發現根據字符串的像素大小設置靜態寬度大小對我來說非常合適。適應環境很好,可以動態更改。這是用Python 3和wxPython Phoenix完成的,所以也許這種方法以前沒有。

這是一個簡單的版本。

import wx 

class MainWindow(wx.Frame): 
    def __init__(self, parent): 
     wx.Frame.__init__(self, parent) 

     version = "v. 1.0.32 (2012-11-03)" 
     # Returns a Size object of the pixel dimensions of a string 
     version_size = wx.Window.GetTextExtent(self, version) 

     # Create a status bar with two sections 
     self.CreateStatusBar(2) 
     # Set the left side to a negative number indicating it's fluid width 
     # The right side will be the exact size of the version string 
     self.SetStatusWidths([-1, version_size.width]) 
     # Set the left side of the status bar to some text. 0 is first section 
     self.SetStatusText("left status bar text", 0) 
     # Set right side to version number. 1 is second section 
     self.SetStatusText(version, 1) 

     self.Show() 

app = wx.App() 
frame = MainWindow(None) 
app.MainLoop() 

爲了顯示如何動態更新它,這裏是一個更復雜的版本,帶有線程隨機更新。

import wx 
import time 
import random 
import threading 

class MainWindow(wx.Frame): 
    def __init__(self, parent): 
     wx.Frame.__init__(self, parent) 

     version = "v. 1.0.32 (2012-11-03)" 
     # Returns a Size object of the pixel dimensions of a string 
     version_size = wx.Window.GetTextExtent(self, version) 

     # Create a status bar with two section 
     self.CreateStatusBar(2) 
     # Set the left side to a negative number indicating it's fluid width 
     # The right side will be the exact size of the version string 
     self.SetStatusWidths([-1, version_size.width]) 
     # Set the left side of the status bar to some text. 0 is first section 
     self.SetStatusText("left status bar text", 0) 
     # Set right side to version number. 1 is second section 
     self.SetStatusText(version, 1) 

     self.Show() 

     # Thread to update status bar with causing the GUI to hang 
     run_version_updates = threading.Thread(target=self.thread_version_updating) 
     run_version_updates.start() 

    def thread_version_updating(self): 
     for i in range(10): 
      time.sleep(1) 
      # Create a random string of 1-20 characters containing only "ABC123" 
      random_string = "".join(random.choice("ABC123") for _ in range(random.randrange(1,20))) 
      self.update_version(random_string) 

    def update_version(self, version): 
     # Get width of string, set status bar width, then update the text 
     size = wx.Window.GetTextExtent(self, version) 
     self.SetStatusWidths([-1, size.width]) 
     self.SetStatusText(version, 1) 

app = wx.App() 
frame = MainWindow(None) 
app.MainLoop() 

我只有一個操作系統,但這裏是它看起來像有不同的Windows 7主題。

的Win 7的Aero
enter image description here

Win 7的經典
enter image description here