【问题标题】:Wx Python image viewer - atfer opening an image file menu is too tightwxpython图像查看器-打开图像文件后菜单太紧
【发布时间】:2012-09-29 10:46:08
【问题描述】:

我在 Ubuntu 12.04 上使用 Python 2.7 和 wx。

我使用 wx 在 Python 中编写了一个很小很小的图像查看器。一切都很好,但我的应用程序主窗口的大小有问题。

当我打开一张普通尺寸的图片时,我看到了:

这很好。

但是当我打开另一个文件时,可以这样说(biiiiig 图的图像):

我的应用程序窗口宽度错误,我的意思是看一下菜单...太紧了,您甚至看不到“编辑”选项。

如何解决?我刚开始在 Python 中使用 wx,所以请耐心等待 :)

我的代码:

# -*- coding: utf-8 -*-
#!/usr/bin/env python

import wx
import os

class MyGUIApp(wx.App):

    def __init__(self, redirect=False, filename=None):

        wx.App.__init__(self, redirect, filename)
        self.frame = wx.Frame(None, title='MyGUIApp v0.2')
        self.panel = wx.Panel(self.frame)

        self.filename = ''
        self.dirname = ''
        width, height = wx.DisplaySize()
        self.pictureMaxSize = 500

        img = wx.EmptyImage(self.pictureMaxSize, self.pictureMaxSize)
        self.imageCtrl = wx.StaticBitmap(self.panel, wx.ID_ANY, wx.BitmapFromImage(img))

        self.mainSizer = wx.BoxSizer(wx.VERTICAL)
        self.mainSizer.Add(self.imageCtrl, 0, wx.ALL|wx.CENTER, 5)
        self.panel.SetSizer(self.mainSizer)
        self.mainSizer.Fit(self.frame)

        self.createMenus()  
        self.connectItemsWithEvents()
        self.createKeyboardShortcuts()

        self.frame.SetMenuBar(self.menuBar)
        self.frame.Show()

    def connectItemsWithEvents(self) :
        self.Bind(wx.EVT_MENU, self.openEvent, self.openItem)
        self.Bind(wx.EVT_MENU, self.clearEvent, self.clearItem)

    def createKeyboardShortcuts(self) :
      self.accel_tbl = wx.AcceleratorTable([(wx.ACCEL_CTRL, ord('C'), self.clearItem.GetId()),
                                            (wx.ACCEL_CTRL, ord('O'), self.openItem.GetId()),
                                            ])
      self.frame.SetAcceleratorTable(self.accel_tbl)

    def createMenus(self) :
        self.menuBar = wx.MenuBar()
        self.menuFile = wx.Menu()

        self.menuBar.Append(self.menuFile, '&File')      
        self.openItem = wx.MenuItem(self.menuFile, wx.NewId(), u'&open ...\tCTRL+O')
        #self.openItem.SetBitmap(wx.Bitmap('images/document-open.png'))
        self.menuFile.AppendItem(self.openItem)

        self.menuEdit = wx.Menu()
        self.menuBar.Append(self.menuEdit, '&Edit')
        self.clearItem = wx.MenuItem(self.menuEdit, wx.NewId(), '&Clear\tCTRL+C')
        #self.clearItem.SetBitmap(wx.Bitmap('images/clear.png'))
        self.menuEdit.AppendItem(self.clearItem)


    def openEvent(self, event) :
        openDialog = wx.FileDialog(self.frame, u'Open file', "File", "", "*.*", wx.OPEN)
        if openDialog.ShowModal() == wx.ID_OK :
            self.filename = openDialog.GetFilename()
            self.dirname = openDialog.GetDirectory()
            self.draw(os.path.join(self.dirname, self.filename))
        openDialog.Destroy()

    def clearEvent(self, event) :
        img = wx.EmptyImage(self.pictureMaxSize, self.pictureMaxSize)
        self.imageCtrl = wx.StaticBitmap(self.panel, wx.ID_ANY, wx.BitmapFromImage(img))
        self.imageCtrl.SetBitmap(wx.BitmapFromImage(img))
        self.frame.SetSize((self.pictureMaxSize, self.pictureMaxSize))
        self.filename = ''
        self.dirname = ''

    def draw(self, filename) :
        image_name = filename
        img = wx.Image(filename, wx.BITMAP_TYPE_ANY)
        W = img.GetWidth()
        H = img.GetHeight()
        if W > H:
            NewW = self.pictureMaxSize
            NewH = self.pictureMaxSize * H / W
        else:
            NewH = self.pictureMaxSize
            NewW = self.pictureMaxSize * W / H
        img = img.Scale(NewW,NewH)
        self.imageCtrl.SetBitmap(wx.BitmapFromImage(img))
        self.panel.Refresh()
        self.mainSizer.Fit(self.frame)

if __name__ == '__main__':
    app = MyGUIApp()
    app.MainLoop()

【问题讨论】:

  • 你期待什么结果?您不了解draw 方法的哪一部分?
  • @phineas:我希望当我打开一个大小不规则的图像时,我会有滚动条或类似的东西,我可以看到我的整个应用程序 gui,不像我的第二个示例中那样跨度>

标签: python user-interface uiimageview wxpython wxwidgets


【解决方案1】:

你可以调用 self.Frame.SetMinSize(w, h) 来强制窗口有一个合理的最小高度和宽度,但是你会想要添加滚动条,这样你就可以看到所有的图像......我试过了这样做,但我也是初学者,目前没有时间,对不起。祝你好运!

【讨论】:

    【解决方案2】:

    问题Creating ScrolledWindow in wxPython 中的代码示例是否有帮助?有一个wx.ScrolledWindow 类,它的功能似乎类似于带有滚动条的面板。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-21
      • 2015-11-30
      • 1970-01-01
      • 2011-07-20
      相关资源
      最近更新 更多