【发布时间】: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,平台差异的大部分颠簸和差距都被消除了。不同的人或项目在这里会有不同的优先级。对你来说可能“不太好”的东西对其他人来说可能是“非常棒”。