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 的大小将根据需要工作!
我正在迈出从 .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 的大小将根据需要工作!