wxPython - 在OSX上忽略按钮大小

时间:2015-03-16 18:04:32

标签: python macos wxpython

我迈出了从.NET迁移到Python的第一步,但我已经对GUI设计感到头疼。

出于某种原因,将size属性传递给wx.Button似乎有点被忽略了。我说"有点"因为实际空间似乎有所改变,但实际按钮仍然占据相同的空间:

import wx

class Example(wx.Frame):

  def __init__(self, *args, **kwargs):
    super(Example, self).__init__(*args, **kwargs) 

    self.InitUI()

  def InitUI(self):

    self.SetSize((800, 600))
    self.SetTitle('Main Menu')
    self.Centre()
    self.Show(True)
    ''' Fill the form '''
    self.lblUsername = wx.StaticText(self, size=(80, -1), pos=(20,20), label="Username:" )
    self.txtUsername = wx.TextCtrl(self, size=(140, -1), pos=(100,20), style=wx.TE_PROCESS_ENTER)
    self.lblPassword = wx.StaticText(self, size=(80, -1), pos=(20,50), label="Password:" )
    self.txtPassword = wx.TextCtrl(self, size=(140, -1), pos=(100,50), style=wx.TE_PROCESS_ENTER)

    self.btnOK = wx.Button( self, label="OK", pos=(260, 16), size=(50,50))
    self.btnOK.Bind(wx.EVT_BUTTON, self.onClickOK)



    self.statusbar = self.CreateStatusBar()
    self.statusbar.SetStatusText('Ready')

  def onClickOK(self, e):
    print "Button triggered"


def main():

  ex = wx.App()
  Example(None)
  ex.MainLoop() 


if __name__ == '__main__':
  main()

无论我设定的尺寸如何,按钮都不会拉伸(它会居中,好像所有空间实际上都在使用,但仍然很小)。

有人能发现我做错了吗?

wx.Button net resized correctly

3 个答案:

答案 0 :(得分:3)

这是OSX施加的限制。绘制本机按钮小部件的方式只允许它水平拉伸,垂直大小是固定的。或者更确切地说,正如您所发现的,窗口小部件本身可以比垂直方向更大,但它只能在该空间内的固定高度处绘制。现代版本的OSX似乎不太必要,但如果你从几年前看OSX中的按钮,你可能会发现为什么会这样。 " tic-tack"的美学图形效果或"胶囊"如果按钮是非标准垂直尺寸,则会完全破坏按钮,导致用于绘制按钮的图像被拉伸。 wxWidgets在可能的情况下遵循原生平台的外观和感觉标准,在这种情况下,苹果公司的标准被强加给我们,并且wx不能提供与它通常相同的灵活性。

如果你真的想要高于普通按钮,你确实有一些选择。原生小部件有一些不同的标准尺寸,您可以使用SetWindowVariant方法进行选择,但我不认为这些变体可以达到您想要的高度。或者您可以使用通用按钮小部件而不是本机按钮小部件,例如wx.lib.buttons.ThemedGenButton

答案 1 :(得分:1)

我的小软件EventSoundControl中的同样问题。 只需一种解决方法:使用多行标签,wxButton的大小将按预期工作!

答案 2 :(得分:0)

如果您希望在调整框架大小时拉伸按钮,则无法使用静态尺寸和定位。您需要将小部件放在sizer中。然后,当您更改框架的大小时,sizer将管理窗口小部件的位置/大小。 wxPython wiki上有很多示例演示了如何使用sizer。您可能还会发现以下教程很有用: