【问题标题】:wxPython - Button size being ignored on OSXwxPython - 在 OSX 上忽略按钮大小
【发布时间】:2015-03-16 18:04:32
【问题描述】:

我正在迈出从 .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()

无论我设置什么尺寸,Button 都不会拉伸(它会居中,好像所有空间都被实际使用了一样,但仍然很小)。

谁能看出我做错了什么?

【问题讨论】:

  • 这可能不是你想要的答案——但 wx 并不是一个真正好的跨平台 ui 工具包。原因是它是一个元工具包(意味着它包装了其他工具包),并且 Windows 优先,其他操作系统只是被标记。在这个 Qt 被 LGPLed 和 PySide 可用的时代,我建议你使用 Qt。那例如允许您使用超级强大的 QML 技术,以声明式、反应式的方式编写快速且美观的 UI。
  • 我不确定你的意思。 wxPython 是一个很棒的跨平台工具包。它尽可能使用操作系统的实际小部件。所有其他工具包都绘制自己的小部件以看起来是原生的。然而,wxPython 不支持移动设备。
  • 我真的不介意切换框架(现在比习惯之后更容易),但现在我很好奇这种行为背后的原因,因为我不看不到其他人抱怨同样的问题,这意味着这不是问题(也许我做错了什么)或者这是由于 OSX/wxPython/Python 版本组合的不幸组合(我正在使用 Yosemite顺便说一句)。
  • @MikeDriscoll 我们在这里可能有不同的看法,但这正是它很棒的原因:它是对本机工具包的一个非常容易泄漏的抽象。这个实际问题是对问题的一个说明:API 建议有一种方法可以影响按钮大小,而实际的工具包不允许这样做。 wx 是从 windows 派生的,因此在该平台上进行 Python-UI 开发是一个明智的选择。对于所有其他应用程序,尤其是跨平台应用程序,Qt 是更好的选择。此外,API 方面。
  • 这取决于哪个对您更重要。具有跨平台一致的 API 和行为的不完全原生的 LnF,或者使用原生小部件的真正原生 LnF,平台差异的大部分颠簸和差距都被消除了。不同的人或项目在这里会有不同的优先级。对你来说可能“不太好”的东西对其他人来说可能是“非常棒”。

标签: python macos wxpython


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我知道@Mike,但这不是我目前的问题(我稍后会处理)。我想要的是为不起作用的 Button 定义一个自定义的起始大小。为其他小部件执行此操作确实有效,您可以在此处看到:dropbox.com/s/dq8571rvslwdm56/…
      • 我想知道小部件是否覆盖了您的尺寸,因为它认为标签不适合。尝试使用其他尺寸,看看它们是否有效。我以前从未遇到过指定尺寸的问题,所以这有点奇怪
      • @RobinDunn 指出了发生这种情况的原因。 TL;DR:我可以扩展一个通用按钮,或者只是尝试另一个框架(我最终尝试了 pyQt,这是值得的)
      猜你喜欢
      • 2019-01-13
      • 2019-02-15
      • 1970-01-01
      • 2016-01-21
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多