2016-10-05 2 views
0

프레임 내에서 패널을 사용하여 이미지를 표시합니다 (GUI는 여러 패널 사이에서 전환해야하므로 계층 구조를 전환해야 함). 이미지가 네이티브 크기로 표시되어야하므로 ScrolledWindow를 패널 ​​부모로 사용했습니다. 스크롤이 나타나고 작동하지만 패널이 최소 크기로 축소되며 매번 드래그 & 드롭을 사용하여 크기를 조정해야합니다. 이 문제를 해결할 방법이 있습니까? 다음은 WxPython의 ScrolledWindow 요소가 최소 크기로 축소됩니다.

문제 보여준다 코드의 축소 버전입니다 : 당신은 Fit()를 호출하고

import os 
import wx 
from wx.lib.pubsub import pub 


class Edit_Panel(wx.PyScrolledWindow): 
    def __init__(self, parent): 
     super(Edit_Panel, self).__init__(parent) 

     # Display size 
     width, height = wx.DisplaySize() 
     self.photoMaxSize = height - 500 

     # Loaded image 
     self.loaded_image = None 

     # Icons 
     self.open_icon_id = 500 

     # Generate panel 
     self.layout() 

    def layout(self): 
     self.main_sizer = wx.BoxSizer(wx.VERTICAL) 

     divider = wx.StaticLine(self, -1, style = wx.LI_HORIZONTAL) 
     self.main_sizer.Add(divider, 0, wx.ALL | wx.EXPAND) 

     self.toolbar = self.init_toolbar() 
     self.main_sizer.Add(self.toolbar, 0, wx.ALL) 

     img = wx.EmptyImage(self.photoMaxSize, self.photoMaxSize) 
     self.image_control = wx.StaticBitmap(self, wx.ID_ANY, 
              wx.BitmapFromImage(img)) 
     self.main_sizer.Add(self.image_control, 0, wx.ALL | wx.CENTER, 5) 

     self.image_label = wx.StaticText(self, -1, style = wx.ALIGN_CENTRE) 
     self.main_sizer.Add(self.image_label, 0, wx.ALL | wx.ALIGN_CENTRE, 5) 

     self.SetSizer(self.main_sizer) 

     fontsz = wx.SystemSettings.GetFont(wx.SYS_SYSTEM_FONT).GetPixelSize() 
     self.SetScrollRate(fontsz.x, fontsz.y) 
     self.EnableScrolling(True, True) 

    def init_toolbar(self): 
     toolbar = wx.ToolBar(self) 
     toolbar.SetToolBitmapSize((16, 16)) 

     open_ico = wx.ArtProvider.GetBitmap(wx.ART_FILE_OPEN, wx.ART_TOOLBAR, (16, 16)) 
     open_tool = toolbar.AddSimpleTool(self.open_icon_id, open_ico, "Open", "Open an Image Directory") 
     handler = self.on_open_reference 
     self.Bind(event = wx.EVT_MENU, handler = handler, source = open_tool) 

     toolbar.Realize() 

     return toolbar 

    def on_open_reference(self, event, wildcard = None): 
     if wildcard is None: 
      wildcard = self.get_wildcard() 

     defaultDir = '~/' 
     dbox = wx.FileDialog(self, "Choose an image to display", defaultDir = defaultDir, wildcard = wildcard, style = wx.OPEN) 

     if dbox.ShowModal() == wx.ID_OK: 
      file_name = dbox.GetPath() 

      # load image 
      self.load_image(image = file_name) 

     dbox.Destroy() 

    def get_wildcard(self): 
     wildcard = 'Image files (*.jpg;*.png;*.bmp)|*.png;*.bmp;*.jpg;*.jpeg' 
     return wildcard 

    def load_image(self, image): 
     self.loaded_image = image 

     # Load image 
     img = wx.Image(image, wx.BITMAP_TYPE_ANY) 

     # Label image name 
     image_name = os.path.basename(image) 
     self.image_label.SetLabel(image_name) 

     # scale the image, preserving the aspect ratio 
     scale_image = True 
     if scale_image: 
      W = img.GetWidth() 
      H = img.GetHeight() 
      if W > H: 
       NewW = self.photoMaxSize 
       NewH = self.photoMaxSize * H/W 
      else: 
       NewH = self.photoMaxSize 
       NewW = self.photoMaxSize * W/H 
      img = img.Scale(NewW, NewH) 

     self.image_control.SetBitmap(wx.BitmapFromImage(img)) 

     # Render 
     self.main_sizer.Layout() 

     self.main_sizer.Fit(self) 
     self.Refresh() 

     pub.sendMessage("resize", msg = "") 


class Viewer_Frame(wx.Frame): 
    def __init__(self, parent, id, title): 
     super(Viewer_Frame, self).__init__(parent = parent, id = id, title = title) 

     # Edit panel 
     self.edit_panel = Edit_Panel(self) 

     # Default panel 
     self.main_panel = self.edit_panel 

     # Render frame 
     self.render_frame() 

     # Subscription to re-render 
     pub.subscribe(self.resize_frame, ("resize")) 

    def render_frame(self): 
     # Main Sizer 
     self.main_sizer = wx.BoxSizer(wx.VERTICAL) 

     # Add default sizer 
     self.main_sizer.Add(self.main_panel, 1, wx.EXPAND) 

     # Render 
     self.SetSizer(self.main_sizer) 
     self.Show() 
     self.main_sizer.Fit(self) 
     self.Center() 


    def resize_frame(self, msg): 
     self.main_sizer.Fit(self) 


if __name__ == "__main__": 
    app = wx.App(False) 
    frame = Viewer_Frame(parent = None, id = -1, title = 'Toolkit') 
    app.MainLoop() 
+0

내가 올바르게 대답하면 문제가되지 않습니다. 포함하는 요소에 맞게 sizer를 사용하기 때문에 최소의 공간을 차지하기 위해 최선을 다하고 모든 것을 축소합니다. 프레임이 표시 될 때 공간이 채워지는 구성 요소가 프레임에 없습니다 (즉, 축소됩니다). –

답변

1

을, 그래서 당신은 명시 적으로 내용에 맞게 패널을 요구하고,하지만 당신은 지정하지 않는 이 컨텐츠의 최소/가장 좋은 크기 (AFAICS, 여기에는 많은 코드가 있으므로 뭔가를 놓칠 수 있습니다).

패널에 최소 크기를 사용하려면 SetMinSize()을 사용하여 설정하십시오.

+0

저녁 보호기! 고맙습니다. – Halum