ตั้งค่าความกว้างสูงสุดสำหรับเฟรมด้วย ScrolledWindow ใน wxPython

ฉันสร้างวัตถุ Frame และต้องการจำกัดความกว้างที่สามารถขยายได้ หน้าต่างเดียวในเฟรมคือวัตถุ ScrolledWindow และที่ประกอบด้วยลูกอื่นๆ ทั้งหมด ฉันมีวัตถุจำนวนมากที่จัดเรียงโดยวาง BoxSizer ในแนวตั้ง ดังนั้นวัตถุ ScrolledWindow จึงค่อนข้างสูง มักจะมีแถบเลื่อนทางด้านขวาเพื่อให้คุณสามารถเลื่อนขึ้นและลงได้

ปัญหาเกิดขึ้นเมื่อฉันพยายามกำหนดขนาดสูงสุดสำหรับเฟรม ฉันใช้ฟังก์ชัน scrolled_window.GetBestSize() (หรือ scrolled_window.GetEffectiveMinSize()) ของ ScrolledWindow แต่ไม่ได้คำนึงถึงแถบเลื่อนแนวตั้ง ในที่สุดฉันก็มีเฟรมที่แคบเกินไปนิดหน่อยและมีแถบเลื่อนแนวนอนที่จะไม่มีวันหายไป

มีวิธีที่จะชดเชยความกว้างของแถบเลื่อนแนวตั้งหรือไม่? ถ้าไม่ ฉันจะหาความกว้างของแถบเลื่อนได้อย่างไร เพื่อที่ฉันจะได้เพิ่มลงในขนาดสูงสุดของเฟรมด้วยตนเอง

นี่คือตัวอย่างที่มีกรอบสูงแต่แคบ:

class TallFrame(wx.Frame):
  def __init__(self):
    wx.Frame.__init__(self, parent=None, title='Tall Frame')
    self.scroll = wx.ScrolledWindow(parent=self) # our scroll area where we'll put everything
    scroll_sizer = wx.BoxSizer(wx.VERTICAL)

    # Fill the scroll area with something...
    for i in xrange(10):
      textbox = wx.StaticText(self.scroll, -1, "%d) Some random text" % i, size=(400, 100))
      scroll_sizer.Add(textbox, 0, wx.EXPAND)
    self.scroll.SetSizer(scroll_sizer)
    self.scroll.Fit()

    width, height = self.scroll.GetBestSize()
    self.SetMaxSize((width, -1)) # Trying to limit the width of our frame
    self.scroll.SetScrollbars(1, 1, width, height) # throwing up some scrollbars

หากคุณสร้างเฟรมนี้ คุณจะเห็นว่า self.SetMaxSize แคบเกินไป จะมีแถบเลื่อนแนวนอนเสมอเนื่องจาก self.scroll.GetBestSize() ไม่ได้คำนึงถึงความกว้างของแถบเลื่อน


person Cristian    schedule 03.09.2009    source แหล่งที่มา
comment
ฉันสนใจแต่ไม่รู้ปัญหาหรือคำตอบ คุณช่วยโพสต์ตัวอย่างโค้ดเล็ก ๆ ที่อธิบายประเด็นนี้ได้ไหม   -  person tom10    schedule 04.09.2009
comment
ขอบคุณสำหรับการโพสต์รหัส ฉันเห็นปัญหาแล้วจึงลองเล่นกับมันบ้างแต่ก็ไม่เข้าใจ แน่นอนว่าบางคนในผู้ใช้ wxPython หรือผู้ใช้ wx จะรู้ (สิ่งหนึ่งที่ฉันสงสัยก็คือ คุณกำลังตั้งค่าขนาดทั้งหมดก่อนที่จะเพิ่มแถบเลื่อน)   -  person tom10    schedule 08.09.2009
comment
ทำไมต้องกำหนดขนาดสูงสุด? การปล่อยให้ผู้ใช้ปลายทางทำให้แอปของคุณมีขนาดใหญ่มากจะส่งผลเสียอย่างไร   -  person Bryan Oakley    schedule 07.01.2010


คำตอบ (1)


มันดูน่าเกลียดนิดหน่อย แต่ดูเหมือนว่าจะใช้งานได้บน Window และ Linux มีความแตกต่างแม้ว่า ดูเหมือนว่า self.GetVirtualSize() จะส่งคืนค่าที่แตกต่างกันในแต่ละแพลตฟอร์ม ฉันคิดว่านี่อาจช่วยคุณได้

width, height = self.scroll.GetBestSize()
width_2, height_2 = self.GetVirtualSize()
print width
print width_2
dx = wx.SystemSettings_GetMetric(wx.SYS_VSCROLL_X)
print dx
self.SetMaxSize((width + (width - width_2) + dx, -1)) # Trying to limit the width of our frame
self.scroll.SetScrollbars(1, 1, width, height) # throwing up some scrollbars
person NobodyReally    schedule 03.11.2009