wxpython 中 用鼠标拖动控件 总结
#encoding: utf-8
import wx
import os
import noname class Frame( noname.MyFrame1 ):
def __init__(self,parent):
noname.MyFrame1.__init__(self,parent)
self.curBitmap = None
self.curBitmapPostion = None
self.curPointerPos = None
def m_createBitmap_buttonOnButtonClick ( self,event ):
event.Skip()
def m_bitmap1OnLeftDown ( self,event ):
self.curBitmapPostion = self.m_bitmap1.GetPosition()
self.curPointerPos = event.GetPosition()
event.Skip()
def m_bitmap1OnMotion ( self,event ):
if event.Dragging() and event.LeftIsDown() :
pos = event.GetPosition() - self.curPointerPos
self.curBitmapPostion += pos
statusVal = 'X = %d Y = %d' %(self.curBitmapPostion.x,self.curBitmapPostion.y)
self.m_statusBar1.SetStatusText(statusVal)
self.m_bitmap1.Move(self.curBitmapPostion)
event.Skip()
实现的功能是在panel上创建一个staticBitmap,然后可以用鼠标在panel上任意随鼠标拖动staticBitmap。
实际上可以拖动任意控件。
思路:
监听staticBitmap(被拖动控件)的wx.EVT_MOTION,和wx.EVT_LEFT_DOWN 事件。
当鼠标左键在staticBitmap上按下是记录此刻:
1,鼠标的位置(event.GetPosition() 这是相对坐标,而且是相对监听控件的(这里监听它的是staticBitmap))。
2,staticBitmap(被拖动控件)的位置(staticBitmap的GetPosition() 返回的是控件左上角相对父控件的位置)。
鼠标的位置是用来计算偏移的,staticBitmap的位置加上这个偏移就是被拖动的位置。
调用staticBitmap的Move(Point),将控件移动到相对父控件的。
碰到的一些问题:
1,并不是所有的event,调用Skip() 后都传递给父控件。下面链接有解答。
http://stackoverflow.com/questions/11606068/about-event-skip,
2,一开始是监听panel的wx.EVT_MOTION,但是鼠标一放到staticBitmap上,panel就监听不到这个事件了。上面链接提到了
wx.PostEvent(staticBitmap(被拖动控件).GetParent(),event),本来想把事件post给panel,这样panel来计算鼠标偏移,这样更准确,不会有闪烁的情况。但是post成功了,但是panel里面触发了这个事件,但是event.GetPosition() 依然是相对staticBitmap(被拖动控件)的,而不是相对panel(父控件)的,虽然事件触发了。
wxpython 中 用鼠标拖动控件 总结的更多相关文章
- 通过setMouseTracking实现用鼠标拖动控件
1 import sys 2 from PyQt5.Qt import * 3 4 class Mwindow(QWidget): 5 leftclick = False 6 7 def __init ...
- wxPython中按钮、文本控件的简单运用
本节学习图形用户界面 ------------------------ 本节介绍如何创建python程序的图形用户界面(GUI),也就是那些带有按钮和文本框的窗口.这里介绍wxPython : 下载地 ...
- NGUI中获取鼠标在控件内部坐标
在UIWidget 中添加以下函数.获得的坐标系是以右上角为原点坐标,x轴向左,一轴向下. public Vector2 GetTouchPoint() { Vector3 p0 = cachedT ...
- (转)C# WinForm中 获得当前鼠标所在控件 或 将窗体中鼠标所在控件名显示在窗体标题上
原文地址:http://www.cnblogs.com/08shiyan/archive/2011/04/14/2015758.html /********************** * 课题:将窗 ...
- WPF,强制捕获鼠标事件,鼠标移出控件外依然可以执行强制捕获的鼠标事件
在WPF中,只有鼠标位置在某个控件上的时候才会触发该控件的鼠标事件.例如,有两个控件都注册了MouseDown和MouseUp事件,在控件1上按下鼠标,不要放开,移动到控件2上再放开.在这个过程中,控 ...
- HTML中禁用表单控件的两种方法readonly与disabled
时候我们会希望表单上的控件是不可修改的,比如在修改密码的网页中,显示用户名的文本框就应该是不可修改状态的,下面与大家分享下禁用表中控件的两种方法 在网页的制作过程中,我们会经常使用到表单.但是有时候我 ...
- win10 uwp 拖动控件
我们会使用控件拖动,可以让我们做出好看的动画,那么我们如何移动控件,我将会告诉大家多个方法.其中第一个是最差的,最后的才是我希望大神你去用. Margin 移动 我们可以使用Margin移动,但这是w ...
- WinForm/Silverlight多线程编程中如何更新UI控件的值
单线程的winfom程序中,设置一个控件的值是很easy的事情,直接 this.TextBox1.value = "Hello World!";就搞定了,但是如果在一个新线程中这么 ...
- Android中查找一个Layout中指定的子控件
我们通常希望查找一个页面中指定类型的控件,单个控件知道id很容易找到,但是如果是多个呢?或者说是在程序中自定义的控件,且不知道id怎么办呢?如想找到页面中的Spinner,可用以下方法 /** * 从 ...
随机推荐
- Firebird数据库相关备忘录
Firebird数据库中有一些很特别的东西,很好用,但由于平时用的不多,记在这里,以备以后用到时查询. 1.以ADO 的OLE ODBC驱动方式访问 Firebird,可以使用如下连接串: FBCon ...
- DataSnap中连接池的应用
当开发人员开始创建Delphi的DataSnap应用时很常见的数据库连接定义方式是每个数据模块建立一个连接.这样做将产生大量的数据库连接,并产生很多问题.从Delphi XE开始,EMB提供了Sess ...
- Winform将网页生成图片
今天无意见看到浏览器有将网页生成图片的功能,顿时赶脚很好奇,于是就找了找资料自己做了一个类似的功能. 工具截图:生成后的图片 手动填写网站地址,可选择图片类型和保持图片地址,来生成页面的图片,当图片路 ...
- MySQL ibdata1撑爆占满磁盘空间
MySQL主从由于ibdata1占满磁盘空间-->主从失效 因为设置了innodb_file_per_table = 1,ibdata1依旧撑爆占满磁盘空间 主从断的时候,IO线程在连接,SQL ...
- 7、XAML的编译过程
对于动态皮肤场景来说,在运行时加载和解析XAML是有意义的,对于那些没有支持XAML编译的.NET语言也是有意义的.但大多数WPF项目会通过MSBuild和Visual Studio完成XAML编译. ...
- 解决sublime text 2总是在新窗口中打开文件
在mac下不是很喜欢sublime text 2 总是在新窗口中打开文件,很麻烦,文件打多了,就会出现N多窗口,虽然可以直接打开当前目录可以解决,但有时候查看其它项目中的单个文件,就比较麻烦.百度一直 ...
- 在线压缩zip
<?php //验证密码 $password = "test"; ?> <html> <head> <meta http-equiv=&q ...
- crawler spec
使用说明 0.写在前面 1.本程序完成的抓取网页并保存其文件的工作. 2.目前的版本还需将工程文件导入eclipse中运行. 3.加载主类MyCrawler生成可执行文件. 4.程序主界面: 1 准备 ...
- WPF解析PPT为图片
偶遇需要解析 PPT为单张图片 其中,对于包含动画的PPT页,分别对动画最后效果进行截取,即每个连续动画截取 (动画N个)N+1(原图)张 http://git.oschina.net/jiailiu ...
- 简单易用的导出文件(Excel、word等各种格式)的方法
以前学习过NPOI导出数据到Excel中,代码较长,不易记忆.工作中,看到了其他同事写的代码,研究了一下,贴出来,共同学习. 使用这种方式,不仅可以设置表格的样式,而且代码简洁. 首先,在后台中通过S ...