2011-12-25 24 views
6

Tôi đang sử dụng wxPython để xây dựng GUI và tôi đang cố gắng căn chỉnh một số văn bản nhưng nó không hoạt động chút nào. Tôi đang cố căn chỉnh ba mục văn bản tĩnh khác nhau ở ba vị trí (căn phải, canh giữa và căn trái) trong ba bảng riêng biệt. Kết quả mà tôi nhận được mặc dù là tất cả ba điều khiển văn bản tĩnh được căn chỉnh ở góc trên cùng bên trái của các bảng tương ứng. text not alignedtại sao văn bản của tôi không căn chỉnh đúng trong wxPython?

này được mã tôi có:

self.lastText=wx.StaticText(self.textDisplayPanel1, label=self.lastWords, style=wx.ALIGN_RIGHT) 
    self.currentText=wx.StaticText(self.textDisplayPanel2, label=self.currentWords, style=wx.ALIGN_CENTRE) 
    self.nextText=wx.StaticText(self.textDisplayPanel3, label=self.nextWords, style=wx.ALIGN_LEFT) 

Bất kỳ ý tưởng về cách sửa lỗi này?

Cảm ơn bạn!

Tôi đang chạy mac OSX 10.7.2 với Python 2.7.1 và wxPython 2.8.12.1

+0

Sao chép: http://stackoverflow.com/questions/8587060/wxpython-text-alignment-does-not-work/8612146#8612146 –

+0

Có thể bạn có thể thêm thông tin về môi trường thử nghiệm của mình (OS, phiên bản Python, phiên bản wxPython). –

Trả lời

13

Edit: Mặc dù tất cả mọi thứ bình luận bên dưới công trình trên cửa sổ, tùy chọn đầu tiên sẽ không hoạt động trên, cho Ví dụ, Ubuntu do có thể là một lỗi. Một bài viết trước được đưa ra trong các bình luận chỉ ra rằng cùng một vấn đề được tìm thấy trong OSX.
Trong mọi trường hợp, tùy chọn thứ hai sử dụng sizers dọc hoạt động cả trong Ubuntu và cửa sổ để bạn có thể thử trên OSX.


Văn bản của bạn có hướng dẫn căn chỉnh theo cách bạn muốn với wx.ALIGN... và trên thực tế, nó được căn chỉnh. Tuy nhiên kích thước của StaticText không phải là của bảng điều khiển mà chỉ là kích thước của văn bản. Đã hạn chế vị trí của nó theo kích thước riêng của nó, bạn không thể thấy sự khác biệt giữa các chế độ căn chỉnh.

Bạn có hai lựa chọn để giải quyết vấn đề:

Lựa chọn 1. Mở rộng kích thước StaticText phụ tùng và vị trí văn bản của bạn trên đó

Bạn có thể mở rộng kích thước của widget StaticText bạn sử dụng tham số của nó size . Đây là một giải pháp tồi trừ các bậc cha mẹ hoặc khung hình có kích thước cố định, bạn sẽ không thay đổi kích thước hoặc tái sử dụng trong các ứng dụng khác. Nếu kích thước của tiện ích chứa văn bản thay đổi thì vị trí tương đối của văn bản cũng sẽ được sửa đổi vì kích thước của nó vẫn cố định. Vì vậy, nó luôn luôn là tốt hơn để tổ chức các vật dụng của bạn bằng phương tiện của sizers.

Tỷ lệ không gian có sẵn widget chiếm trong khe sizer được cho bởi tham số thứ hai trong sizer.Add() (0 được kích thước tối thiểu, 1 đầy nghề nghiệp):

sizer_2.Add(self.label_1, 0, 0, 0) 

enter image description here

Để xem văn bản được căn chỉnh trong bảng điều khiển như bạn muốn bạn phải thông báo cho StaticText để mở rộng đến tất cả không gian có sẵn:

sizer_2.Add(self.label_1, 1, 0, 0) 

enter image description here

Ở đây bạn có mã liên quan:

class MyFrame(wx.Frame): 
    def __init__(self, *args, **kwds): 
     wx.Frame.__init__(self, *args, **kwds) 
     self.panel_1 = wx.Panel(self, -1) 
     self.label_1 = wx.StaticText(self.panel_1, -1, "label_1", style=wx.ALIGN_RIGHT) 
     self.panel_2 = wx.Panel(self, -1) 
     self.label_2 = wx.StaticText(self.panel_2, -1, "label_2", style=wx.ALIGN_CENTRE) 
     self.panel_3 = wx.Panel(self, -1) 
     self.label_3 = wx.StaticText(self.panel_3, -1, "label_3") 

     self.panel_1.SetBackgroundColour(wx.Colour(0, 255, 0)) 
     self.panel_2.SetBackgroundColour(wx.Colour(0, 255, 255)) 
     self.panel_3.SetBackgroundColour(wx.Colour(219, 112, 147)) 

     sizer_1 = wx.BoxSizer(wx.HORIZONTAL) 
     sizer_2 = wx.BoxSizer(wx.HORIZONTAL) 
     sizer_3 = wx.BoxSizer(wx.HORIZONTAL) 
     sizer_4 = wx.BoxSizer(wx.HORIZONTAL) 

     sizer_2.Add(self.label_1, 1, 0, 0) 
     sizer_3.Add(self.label_2, 1, 0, 0) 
     sizer_4.Add(self.label_3, 1, 0, 0) 

     self.panel_1.SetSizer(sizer_2) 
     self.panel_2.SetSizer(sizer_3) 
     self.panel_3.SetSizer(sizer_4) 

     sizer_1.Add(self.panel_1, 1, wx.EXPAND, 0) 
     sizer_1.Add(self.panel_2, 1, wx.EXPAND, 0) 
     sizer_1.Add(self.panel_3, 1, wx.EXPAND, 0) 

     self.SetSizer(sizer_1) 
     sizer_1.Fit(self) 
     self.Layout() 

enter image description here

Note mã được lâu hơn cần thiết để mimick ví dụ của bạn với ba tấm. Bạn có cùng một khung nhìn bằng cách sử dụng một bảng duy nhất. Trong thực tế, nó có thể được đơn giản hóa hơn nữa không sử dụng tấm pin và thiết lập StaticText trực tiếp trên sizer:

class MyFrame2(wx.Frame): 
    def __init__(self, *args, **kwds): 
     wx.Frame.__init__(self, *args, **kwds) 
     self.label_1 = wx.StaticText(self, -1, "label_1", style=wx.ALIGN_RIGHT) 
     self.label_2 = wx.StaticText(self, -1, "label_2", style=wx.ALIGN_CENTRE) 
     self.label_3 = wx.StaticText(self, -1, "label_3") 

     self.label_1.SetBackgroundColour(wx.Colour(127, 255, 0)) 
     self.label_2.SetBackgroundColour(wx.Colour(0, 255, 255)) 
     self.label_3.SetBackgroundColour(wx.Colour(219, 112, 147)) 

     sizer = wx.BoxSizer(wx.HORIZONTAL) 
     sizer.Add(self.label_1, 1, wx.EXPAND, 0) 
     sizer.Add(self.label_2, 1, wx.EXPAND, 0) 
     sizer.Add(self.label_3, 1, wx.EXPAND, 0) 
     self.SetSizer(sizer) 
     sizer.Fit(self) 
     self.Layout() 

Lựa chọn 2. Xác định vị trí các widget riêng của mình ở vị trí mong muốn ở không gian có sẵn của sizer. Bạn có thể sử dụng tham số position của StaticText cho mục đích đó. Nhưng điều này sẽ có cùng một vấn đề được nêu ở trên để sử dụng size. Vì vậy, một lần nữa bạn muốn kiểm soát hình học của quan điểm của bạn với sizers. Bạn đặt các widget trong sizer sử dụng một trong số:

sizer_6.Add(self.label_5, 0, wx.ALIGN_RIGHT, 0) 

hoặc

sizer_7.Add(self.label_6, 0, wx.ALIGN_CENTER_HORIZONTAL, 0) 

Đối với một số lý do, để làm việc này bạn cần một BoxSizer (và trong cách thẳng đứng cùng, nếu bạn sẽ muốn sử dụng wx.ALIGN_CENTER_VERTICAL bạn sẽ cần một ngang BoxSizer:

class MyFrame(wx.Frame): 
    def __init__(self, *args, **kwds): 
     wx.Frame.__init__(self, *args, **kwds) 
     self.panel_4 = wx.Panel(self, -1) 
     self.label_5 = wx.StaticText(self.panel_4, -1, "label_5") 
     self.panel_5 = wx.Panel(self, -1) 
     self.label_6 = wx.StaticText(self.panel_5, -1, "label_6") 
     self.panel_6 = wx.Panel(self, -1) 
     self.label_7 = wx.StaticText(self.panel_6, -1, "label_7") 

     self.panel_4.SetBackgroundColour(wx.Colour(0, 255, 255)) 
     self.panel_5.SetBackgroundColour(wx.Colour(127, 255, 0)) 
     self.panel_6.SetBackgroundColour(wx.Colour(219, 112, 219)) 

     sizer_1 = wx.BoxSizer(wx.HORIZONTAL) 
     sizer_8 = wx.BoxSizer(wx.VERTICAL) 
     sizer_7 = wx.BoxSizer(wx.VERTICAL) 
     sizer_6 = wx.BoxSizer(wx.VERTICAL) 

     sizer_6.Add(self.label_5, 0, wx.ALIGN_RIGHT, 0) 
     sizer_7.Add(self.label_6, 0, wx.ALIGN_CENTER_HORIZONTAL, 0) 
     sizer_8.Add(self.label_7, 0, 0, 0) 

     self.panel_4.SetSizer(sizer_6) 
     self.panel_5.SetSizer(sizer_7) 
     self.panel_6.SetSizer(sizer_8) 

     sizer_1.Add(self.panel_4, 1, wx.EXPAND, 0) 
     sizer_1.Add(self.panel_5, 1, wx.EXPAND, 0) 
     sizer_1.Add(self.panel_6, 1, wx.EXPAND, 0) 

     self.SetSizer(sizer_1) 
     sizer_1.Fit(self) 
     self.Layout() 

tùy chọn này ngụ ý một sự kết hợp của các tấm và Sizers thứ tại tạo ra một mã khó khăn hơn để đơn giản hóa hơn so với hiển thị cho tùy chọn đầu tiên.

+1

ôi trời ơi, tôi đã đến câu trả lời của riêng mình !!! Cảm ơn me_in_the_past, để dành thời gian của bạn trả lời những câu hỏi này trên SO so lenghty – joaquin

0

Tôi nghĩ rằng văn bản không được căn chỉnh vì kích thước không được đặt. Hãy thử:

t1=wx.StaticText(smth, label="foo", pos=(0,0), size=(200,20), style=wx.ALIGN_RIGHT) 
t2=wx.StaticText(smth, label="bar", pos=(0,0), size=(200,20), style=wx.ALIGN_CENTRE) 

Và nó sẽ được căn chỉnh bên trong hộp 200 * 20. Theo mặc định, kích thước là "tự động" tức là (-1, -1) nghĩa là chỉ đủ để văn bản hiển thị và căn chỉnh trong hộp đó sẽ không hiển thị hiệu ứng có thể nhìn thấy hiệu ứng.

However, this does not always work.

+0

'Tuy nhiên, điều này không phải lúc nào cũng hoạt động.'Vì bạn đang làm sai. Nếu bạn đặt kích thước của văn bản theo cách này, bạn đang đặt kích thước FIX, do đó khi bạn thay đổi kích thước của khung hình, trung tâm, vị trí bên phải của văn bản sẽ bị mất. Nếu bạn muốn giữ cho văn bản của bạn được căn chỉnh độc lập với kích thước của khung hình/bảng điều khiển của bạn, bạn phải sử dụng sizers. Xem câu trả lời của tôi. Mặc dù downvoted nó luôn luôn làm việc – joaquin

+0

'Tuy nhiên, điều này không phải luôn luôn làm việc'. Xin lỗi đó là sự thật nếu bạn đang sử dụng Ubuntu với wxPython 2.8.10.1. Ngược lại, nó hoạt động trên các cửa sổ. Trong ubuntu bạn có thể sử dụng chiến lược thứ hai, thử nghiệm trên câu trả lời của tôi. – joaquin