Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
wxPython可调整大小页面上的可移动对象_Python_User Interface_Wxpython - Fatal编程技术网

wxPython可调整大小页面上的可移动对象

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

我正在尝试编写一个允许按钮移动的简单应用程序,我使用了一个在Stack overflow上找到的示例-抱歉,我找不到原始链接:(

按钮按预期移动,但一旦调整框架大小,按钮位置就会重置回原来的位置,我不理解,因为我正在设置位置,不确定重置它们的原因和原因

守则:

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