wxPython可调整大小页面上的可移动对象
我正在尝试编写一个允许按钮移动的简单应用程序,我使用了一个在Stack overflow上找到的示例-抱歉,我找不到原始链接:( 按钮按预期移动,但一旦调整框架大小,按钮位置就会重置回原来的位置,我不理解,因为我正在设置位置,不确定重置它们的原因和原因 守则:wxPython可调整大小页面上的可移动对象,python,user-interface,wxpython,Python,User Interface,Wxpython,我正在尝试编写一个允许按钮移动的简单应用程序,我使用了一个在Stack overflow上找到的示例-抱歉,我找不到原始链接:( 按钮按预期移动,但一旦调整框架大小,按钮位置就会重置回原来的位置,我不理解,因为我正在设置位置,不确定重置它们的原因和原因 守则: import wx app = wx.App(False) d = {} def MouseDown(e): print('mouse down') o = e.GetEventObject()
import wx
app = wx.App(False)
d = {}
def MouseDown(e):
print('mouse down')
o = e.GetEventObject()
sx,sy = panel.ScreenToClient(o.GetPositionTuple())
dx,dy = panel.ScreenToClient(wx.GetMousePosition())
o._x,o._y = (sx-dx, sy-dy)
d['d'] = o
print(o)
def MouseMove(e):
try:
if 'd' in d:
print("mouse move has been triggered")
o = d['d']
x, y = wx.GetMousePosition()
o.SetPosition(wx.Point(x+o._x,y+o._y))
except:
print('fail')
pass
def MouseUp(e):
try:
if 'd' in d: del d['d']
except: pass
frame = wx.Frame(None, -1, 'simple.py')
panel = wx.Panel(frame)
box = wx.BoxSizer(wx.VERTICAL)
button1 = wx.Button(panel, -1, "foo")
box.Add(button1, 0, wx.ALL, 10)
button2 = wx.Button(panel, -1, "bar")
box.Add(button2, 0, wx.ALL, 10)
button1.Bind(wx.EVT_LEFT_DOWN, MouseDown)
button2.Bind(wx.EVT_LEFT_DOWN, MouseDown)
button1.Bind(wx.EVT_MOTION, MouseMove)
button2.Bind(wx.EVT_MOTION, MouseMove)
button1.Bind(wx.EVT_LEFT_UP, MouseUp)
button2.Bind(wx.EVT_LEFT_UP, MouseUp)
panel.Bind(wx.EVT_MOTION, MouseMove)
panel.Bind(wx.EVT_LEFT_UP, MouseUp)
panel.SetSizer(box)
panel.Layout()
frame.Show()
app.MainLoop()
调整框架大小时,
Sizer
正在重新定位按钮。i、 e.做好自己的工作 施胶工负责将其内容物进行布局。
您正在手动移动项目,但一旦调整框架的大小,大小调整器就会启动,并强制恢复布局。对于您来说,这是无意中取消了您希望发生的事情。
如果您想要此功能,在实际应用中可能会引起混乱(并非双关语),请使用手动定位并避免使用大小调整器。当您调整框架大小时,
大小调整器将重新定位按钮。
i、 e.做好自己的工作
施胶工负责将其内容物进行布局。
您正在手动移动项目,但一旦调整框架的大小,大小调整器就会启动,并强制恢复布局。对于您来说,这是无意中取消了您希望发生的事情。
如果您想要此功能,在实际应用程序中会导致混乱(没有双关语),使用手动定位,避免使用尺寸标注器。谢谢您的解释。您可以在尺寸标注器的元素中手动定位吗?@LittleMissChaos简言之,不。与您在代码中建议的不同。通过一些毛茸茸的编码,您可以更改相对位置,尤其是使用GridBagSizer
,但本质上,位置是我将由sizer决定,这取决于你如何填充sizer。如果你认为它是一支有指定球员位置的球队,他们不能在比赛中无休止地交换。实际上,sizer是执行规则的裁判。你当然可以选择在没有裁判的情况下自由比赛(sizer
)。谢谢您的解释。您能在sizer元素中手动定位吗?@LittleMissChaos简言之,不能。不像您在代码中建议的那样。通过一些复杂的编码,您可以更改相对位置,特别是使用GridBagSizer
,但本质上,位置将由sizer决定,具体取决于您的操作方式填充了sizer。如果你认为它是一支有指定球员位置的球队,他们不能在比赛中无休止地交换。实际上,sizer是执行规则的裁判。你当然可以选择在没有裁判的情况下自由比赛(sizer
)。