wxPython - OSX 上的按钮大小被忽略

wxPython - Button size being ignored on OSX

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

出于某种原因,将大小属性传递给 wx.Button 似乎被忽略了。我说 "kind of" 因为实际的 space 似乎发生了变化,但实际的按钮一直占据相同的 space:

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()

无论我设置什么大小,按钮都不会拉伸(它会居中,就好像所有 space 都被实际使用了一样,但仍然很小)。

谁能看出我做错了什么?

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

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

不过,如果您真的想要比普通按钮更高的按钮,您确实有一些选择。本机小部件有几种不同的标准尺寸,您可以使用 SetWindowVariant 方法 select,但我认为这些变体不会达到您想要的那么高。或者您可以使用通用按钮小部件而不是本机按钮小部件,例如 wx.lib.buttons.ThemedGenButton.

我的小软件 EventSoundControl 也有同样的问题。 只是一个解决方法:使用多行标签和 wxButton 的大小将根据需要工作!