5

2つのフィールドを持つステータスバーを実現したい。最初のものは左揃えで、2番目のものは右揃えです。私が欲しいもののイラスト:

| |
| |
================================================== ===============================
| いくつかのステータステキスト。v。1.0.32|

私の現在のコード:

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

ただし、右のフィールドは左揃えなので、次のようになります。

| |
| |
================================================== ===============================
| いくつかのステータステキスト。v。1.0.32|

右のフィールドにテキストを配置して右に揃える方法はありますか?

4

3 に答える 3

4

わかりました。問題は解決しました(ハックのように感じますが)。2つのフィールドを定義するカスタムツールバーを作成しました。左側のフィールドは通常のように制御でき、右側のフィールドには、StaticText手動で配置されるバージョン番号を含むコントロールが含まれています。テキストを配置するためのコードは、Windowsで少し異なって見えるため、プラットフォーム固有です。ここにいくつかのスクリーンショットがあります:

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)

これが他の誰かの助けになることを願っています。

于 2012-11-03T20:24:14.773 に答える
3

タブ文字を使用してみることができます。

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

これはWindowsで機能しますが、他のwxWidgetsディストリビューションに実装されているかどうかはわかりません。style=0右下のグリップを無効にするには、でwx.StatusBarを作成する必要があります。テキストの配置ではグリップが考慮されないため、途切れてしまいます。それでも問題が解決しない場合は、右側のパネルを静的なサイズに設定することで、テキストの正しい配置をシミュレートできます。

self.SetStatusWidths([-1, 100])

ただし、その上のテキストは左揃えのままになります。その上のテキストを正しい位置に揃えて表示するには、テキストをスペースで埋める必要があります。システムやユーザーによって使用するフォントが異なるため、間隔が正確でない場合があることに注意してください。

補遺:テキストの整列\tは、実際にはネイティブウィンドウのステータスバーコントロールの機能です。他のオペレーティングシステムで動作させるには、ネイティブコントロールまたはwxWidgetsのいずれかがその動作を実装する必要があります。

于 2012-11-03T18:17:41.247 に答える
3

ハッキーバージョンは、私が探していたものには必ずしも理想的ではありませんでした。文字列のピクセルサイズに基づいて静的な幅のサイズを設定すると、うまく機能することがわかりました。環境にうまく適応し、動的に変更することができます。これはPython3とwxPythonPhoenixで行われたため、このメソッドは以前は利用できなかった可能性があります。

これが簡単なバージョンです。

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()

私はオペレーティングシステムを1つしか持っていませんが、さまざまなWindows7テーマでどのように表示されたかを次に示します。

7エアロに勝つ
ここに画像の説明を入力してください

Win7クラシック
ここに画像の説明を入力してください

于 2014-07-02T07:00:03.593 に答える